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

📄 bm_kes.v

📁 <Verilog HDL 语言编程》 RS(204,188)译码器的设计
💻 V
字号:
module BM_KES(S, clk, kes_init, kes_done, 
			Lmd0, Lmd1, Lmd2, Lmd3, Lmd4, Lmd5, Lmd6, Lmd7, Lmd8, L, s_out);
	parameter	 t = 8,		// t--The total number of errors that can be corrected
				 N = 204,		// N--Codeword length
				 m = 8;		// m--Extension of GF(2)

	input 		 	clk, kes_init;
	input  [m-1:0] 	S;
	output [m-1:0] 	L, Lmd0, Lmd1, Lmd2, Lmd3, Lmd4, Lmd5, Lmd6, Lmd7, Lmd8, s_out;	
	output			kes_done;
	reg	   [m-1:0] 	L;
	
		
	//B(D) = B[2]*D^2 + B[1]*D + B[0]:Coefficients of Error Locator Polynomial 
	reg [m-1:0] B[t:0];	
	reg [m-1:0] T[t:0], gama, delta, k; // gama--Intermediate variables; delta--Discrepency	
	reg [m-1:0] SSR[t*2:1];				// Registers of LFSR storing the syndrome 
	wire [m-1:0] S_B[t:0];				// Product of (S*B)
	integer	counter;
	reg	[m-1:0] s_latched[t*2:1];
	reg			comput, kes_done;
	always @(posedge clk/* or posedge kes_init*/)begin:BM_BLOCK
		integer j;
		if(kes_init)begin	// Initial variables
			delta <= 0;   
			for(j=2; j<=t*2; j=j+1)
				SSR[j] <= 0;
			SSR[1] <= S;
			counter <= 0;
		end
		else if(counter == t*2-1)begin
			delta <= ((S_B[0]^S_B[1])^(S_B[2]^S_B[3]))^((S_B[4]^S_B[5])
					^(S_B[6]^S_B[7]))^S_B[8];		// Updating of Δ
			for(j=1; j<=t*2-1; j=j+1)
				SSR[j+1] <= SSR[j];
			SSR[1] <= S;			
			
			for(j=1; j<=t*2; j=j+1)			// Latch the input syndrome sequences
				s_latched[j] <= SSR[j];

			counter <= counter + 1;
       	end
		else if(counter <= t*2)begin
			delta <= ((S_B[0]^S_B[1])^(S_B[2]^S_B[3]))^((S_B[4]^S_B[5])
					^(S_B[6]^S_B[7]))^S_B[8];		// Updating of Δ
			for(j=1; j<=t*2-1; j=j+1)
				SSR[j+1] <= SSR[j];
			SSR[1] <= S;			
			counter <= counter + 1;
       	end

	end
	FF_Mul S_x_B0(.B(SSR[1]), .A(B[0]), .P(S_B[0]));	// FF multiplication of Δ 
	FF_Mul S_x_B1(.B(SSR[2]), .A(B[1]), .P(S_B[1]));
	FF_Mul S_x_B2(.B(SSR[3]), .A(B[2]), .P(S_B[2]));
	FF_Mul S_x_B3(.B(SSR[4]), .A(B[3]), .P(S_B[3]));
	FF_Mul S_x_B4(.B(SSR[5]), .A(B[4]), .P(S_B[4]));
	FF_Mul S_x_B5(.B(SSR[6]), .A(B[5]), .P(S_B[5]));
	FF_Mul S_x_B6(.B(SSR[7]), .A(B[6]), .P(S_B[6]));
	FF_Mul S_x_B7(.B(SSR[8]), .A(B[7]), .P(S_B[7]));
	FF_Mul S_x_B8(.B(SSR[9]), .A(B[8]), .P(S_B[8]));
	
	wire [m-1:0] gama_B[t:0];	// Product of (γ*B(D))	
	wire [m-1:0] delta_T[t-1:0];	// Product of Δ*λ(D)
	always @(negedge clk)begin:LABLE
		integer j;
		if(kes_init)begin
			for(j=1; j<=t; j=j+1)begin
				B[j] <= 0;	T[j] <= 0;			// T(D)--Intermediate Polynomial
			end
			B[0] <= 1;	T[0] <= 1;
			L <= 0;		k <= 0;		gama <= 1;
		end
		else if(comput)begin
			B[0] <= gama_B[0];					// Updating of B(D)
			B[1] <= gama_B[1] ^ delta_T[0];
			B[2] <= gama_B[2] ^ delta_T[1];
			B[3] <= gama_B[3] ^ delta_T[2];
			B[4] <= gama_B[4] ^ delta_T[3];
			B[5] <= gama_B[5] ^ delta_T[4];
			B[6] <= gama_B[6] ^ delta_T[5];
			B[7] <= gama_B[7] ^ delta_T[6];
			B[8] <= gama_B[8] ^ delta_T[7];
			if((delta) && ((L<<1)<= k))begin	// Conditiong 2
				for(j=0; j<=t; j=j+1)
					T[j] <= B[j];		// T[D] = B[D]
				L <= k + 1 - L;			
				gama <= delta;			// γ = Δ
			end
			else begin
				for(j=0; j<t; j=j+1)begin
					T[j+1] <= T[j];		// T[D] = D * T[D];	
				end
				T[0] <= 0;
			end
				
			k <= k + 1;
		end
	end
	// Finite field multiplication of γ*B(D) 
	FF_Mul gama_x_B0(.A(gama), .B(B[0]), .P(gama_B[0]));
	FF_Mul gama_x_B1(.A(gama), .B(B[1]), .P(gama_B[1]));
	FF_Mul gama_x_B2(.A(gama), .B(B[2]), .P(gama_B[2]));
	FF_Mul gama_x_B3(.A(gama), .B(B[3]), .P(gama_B[3]));
	FF_Mul gama_x_B4(.A(gama), .B(B[4]), .P(gama_B[4]));
	FF_Mul gama_x_B5(.A(gama), .B(B[5]), .P(gama_B[5]));
	FF_Mul gama_x_B6(.A(gama), .B(B[6]), .P(gama_B[6]));
	FF_Mul gama_x_B7(.A(gama), .B(B[7]), .P(gama_B[7]));
	FF_Mul gama_x_B8(.A(gama), .B(B[8]), .P(gama_B[8]));

	
	/* Finite field multiplication of Δ*λ(D) */
	FF_Mul delta_x_T0(.A(delta), .B(T[0]), .P(delta_T[0]));
	FF_Mul delta_x_T1(.A(delta), .B(T[1]), .P(delta_T[1]));
	FF_Mul delta_x_T2(.A(delta), .B(T[2]), .P(delta_T[2]));
	FF_Mul delta_x_T3(.A(delta), .B(T[3]), .P(delta_T[3]));
	FF_Mul delta_x_T4(.A(delta), .B(T[4]), .P(delta_T[4]));
	FF_Mul delta_x_T5(.A(delta), .B(T[5]), .P(delta_T[5]));
	FF_Mul delta_x_T6(.A(delta), .B(T[6]), .P(delta_T[6]));
	FF_Mul delta_x_T7(.A(delta), .B(T[7]), .P(delta_T[7]));

	always @(counter)begin
		if((0<counter)&&(counter<=t*2))
			comput = 1;
		else
			comput = 0;
	end

	integer shift_count;
	always @(posedge clk)begin
		if(counter == t*2-1)begin
			kes_done <= 1;
			shift_count <= 1;
		end
		else begin
			kes_done <= 0;
			if((0<shift_count) && (shift_count <= t*2))begin
				shift_count <= shift_count + 1;
			end
			else 
				shift_count <= 0;
		end
	end
	
	
	reg [m-1:0] s_out;
	always @(shift_count)begin
		if((0<shift_count) &&(shift_count <= t*2))
			s_out = s_latched[t*2-shift_count+1];
		else
			s_out = 0;
	end


	assign Lmd0 = B[0];
	assign Lmd1 = B[1];
	assign Lmd2 = B[2];		
	assign Lmd3 = B[3];
	assign Lmd4 = B[4];
	assign Lmd5 = B[5];		
	assign Lmd6 = B[6];
	assign Lmd7 = B[7];
	assign Lmd8 = B[8];		

endmodule	

⌨️ 快捷键说明

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