📄 bm_kes.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 + -