⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ff_mul.v

📁 使用verilog完成了RS编码的设计
💻 V
字号:
// Finite fields multiplication
// Primitive olynomial: p(x) = x^8 + x^4 + x^3 + x^2 + 1 
// Polynomial basis: 	{1, a^1, a^2, a^3, a^4, a^5, a^6, a^7}
// Weak dual basis:		{1+a^2, a^1, 1, a^7, a^6, a^5, a^4, a^3+a^7}

`define M	8
module FF_Mul(A, B, P);
	//parameter	CONST = 8'h3b;

	input  [`M-1:0]	A, B;	// B needs converting to dual basis
	output [`M-1:0]	P;
	reg    [`M-1:0]	P;

	reg	[2*`M-2:0]	dual_base;
	reg [`M-1:0]	mul_temp;
	always @(A or B)begin: Block1
		integer i;
		// C-D
		dual_base[0] = B[0] ^ B[2];
		dual_base[1] = B[1];
		dual_base[2] = B[0];
		dual_base[3] = B[7];
		dual_base[4] = B[6];
		dual_base[5] = B[5];
		dual_base[6] = B[4];
		dual_base[7] = B[3] ^ B[7];
		
		// Extension
		for(i=0; i<`M-1; i=i+1) begin
			dual_base[`M+i] = dual_base[0+i]^dual_base[2+i]^dual_base[3+i]^dual_base[4+i];
		end
		
		// Multiplication
		for(i=0; i<`M; i=i+1) begin
			mul_temp[i] = (((dual_base[i+0]&A[0]) ^(dual_base[i+1]&A[1])) 
						  ^((dual_base[i+2]&A[2]) ^(dual_base[i+3]&A[3])))
						  ^(((dual_base[i+4]&A[4])^(dual_base[i+5]&A[5]))
						  ^((dual_base[i+6]&A[6]) ^(dual_base[i+7]&A[7])));
		end
		
		// D-C
		P[0] = mul_temp[2];														
		P[1] = mul_temp[1];
		P[2] = mul_temp[0] ^ mul_temp[2];
		P[3] = mul_temp[3] ^ mul_temp[7];
		P[4] = mul_temp[6];
		P[5] = mul_temp[5];
		P[6] = mul_temp[4];
		P[7] = mul_temp[3];														
	end
endmodule

`define M	8
module FF_Mul_R(clk, A, B, P);
	//parameter	CONST = 8'h3b;
	input			clk;
	input  [`M-1:0]	A, B;	// B needs converting to dual basis
	output [`M-1:0]	P;
	reg    [`M-1:0]	P;

	reg	[2*`M-2:0]	dual_base;
	reg [`M-1:0]	mul_temp;
	always @(posedge clk)begin: Block1
		integer i;
		// C-D
		dual_base[0] = B[0] ^ B[2];
		dual_base[1] = B[1];
		dual_base[2] = B[0];
		dual_base[3] = B[7];
		dual_base[4] = B[6];
		dual_base[5] = B[5];
		dual_base[6] = B[4];
		dual_base[7] = B[3] ^ B[7];
		
		// Extension
		for(i=0; i<`M-1; i=i+1) begin
			dual_base[`M+i] = dual_base[0+i]^dual_base[2+i]^dual_base[3+i]^dual_base[4+i];
		end
		
		// Multiplication
		for(i=0; i<`M; i=i+1) begin
			mul_temp[i] = (((dual_base[i+0]&A[0]) ^(dual_base[i+1]&A[1])) 
						  ^((dual_base[i+2]&A[2]) ^(dual_base[i+3]&A[3])))
						  ^(((dual_base[i+4]&A[4])^(dual_base[i+5]&A[5]))
						  ^((dual_base[i+6]&A[6]) ^(dual_base[i+7]&A[7])));
		end
		
		// D-C
		P[0] = mul_temp[2];														
		P[1] = mul_temp[1];
		P[2] = mul_temp[0] ^ mul_temp[2];
		P[3] = mul_temp[3] ^ mul_temp[7];
		P[4] = mul_temp[6];
		P[5] = mul_temp[5];
		P[6] = mul_temp[4];
		P[7] = mul_temp[3];														
	end
endmodule

//--------------------------------------------------------------------
// Finite fields multiplication
// Primitive olynomial: p(x) = x^8 + x^4 + x^3 + x^2 + 1 
// Polynomial basis: 	{1, a^1, a^2, a^3, a^4, a^5, a^6, a^7}
// Weak dual basis:		{1+a^2, a^1, 1, a^7, a^6, a^5, a^4, a^3+a^7}
//---------------------------------------------------------------------
`define M	8
module ff_const_mul(din, dout);
	parameter	CONST = 15'h0CE7;

	input  [`M-1:0]	din;	
	output [`M-1:0]	dout;

	wire   [2*`M-2:0]	dual_base;
	assign 	dual_base = CONST;

	reg [`M-1:0]	dout, mul_temp;
	always @(din or dual_base)begin: Block1
		integer i;
		// Multiplication
		for(i=0; i<`M; i=i+1) begin
			mul_temp[i] = (((dual_base[i+0]&din[0]) ^(dual_base[i+1]&din[1])) 
						  ^((dual_base[i+2]&din[2]) ^(dual_base[i+3]&din[3])))
						  ^(((dual_base[i+4]&din[4])^(dual_base[i+5]&din[5]))
						  ^((dual_base[i+6]&din[6]) ^(dual_base[i+7]&din[7])));
		end
		
		// D-C
		dout[0] = mul_temp[2];														
		dout[1] = mul_temp[1];
		dout[2] = mul_temp[0] ^ mul_temp[2];
		dout[3] = mul_temp[3] ^ mul_temp[7];
		dout[4] = mul_temp[6];
		dout[5] = mul_temp[5];
		dout[6] = mul_temp[4];
		dout[7] = mul_temp[3];														
	end
endmodule

/*
//-----------------------------------------------------------------
//  GF(2^3) Multiplication: C(D) = A(D) * B(D) mod(D^3 + D + 1)
//	=> 	C0 = A0*B0 + A1*B2 + A2*B1
//		C1 = A0*B1 + A1*B0 + A1*B2 + A2*B1 + A2*B2
//		C2 = A0*B2 + A1*B1 + A2*B0 + A2*B2
//-----------------------------------------------------------------
module FF_Mul(A, B, P);	// Non-registerd output of finite field multiplication
	input  [2:0] A, B;
	output [2:0] P;
	reg	   [2:0] P;
	
	always @(A or B)begin
		P[0] = (A[0]&B[0])^(A[1]&B[2])^(A[2]&B[1]);
		P[1] = (A[0]&B[1])^(A[1]&B[0])^(A[1]&B[2])^(A[2]&B[1])^(A[2]&B[2]);
		P[2] = (A[0]&B[2])^(A[1]&B[1])^(A[2]&B[0])^(A[2]&B[2]);				
	end
endmodule

module FF_Mul_R(clk, A, B, P);	// Registerd output of finite field multiplication
	input		 clk;
	input  [2:0] A, B;
	output [2:0] P;
	reg	   [2:0] P;
	
	always @(posedge clk)begin
		P[0] = (A[0]&B[0])^(A[1]&B[2])^(A[2]&B[1]);
		P[1] = (A[0]&B[1])^(A[1]&B[0])^(A[1]&B[2])^(A[2]&B[1])^(A[2]&B[2]);
		P[2] = (A[0]&B[2])^(A[1]&B[1])^(A[2]&B[0])^(A[2]&B[2]);				
	end
endmodule
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -