📄 chien_search.v
字号:
//
//Design : Reed-Solomon decoder RS(204,188) in QAM
//
//File Name : chien_search.v
//
//Perpose :
//
//synopsys translate_off
`include "timescale.v"
//synopsys translate_on
module chien_search ( clk , omega ,
n_rst , delta ,
phase1 , delta_odd ,
clken , degree_delta ,
data_in_valid , data_out_valid ,
data_in_start , data_out_start ,
syndrome_zero_in , syndrome_zero_out ,
omega_cof16 , delta_cof16 ,
omega_cof15 , delta_cof15 ,
omega_cof14 , delta_cof14 ,
omega_cof13 , delta_cof13 ,
omega_cof12 , delta_cof12 ,
omega_cof11 , delta_cof11 ,
omega_cof10 , delta_cof10 ,
omega_cof9 , delta_cof9 ,
omega_cof8 , delta_cof8 ,
omega_cof7 , delta_cof7 ,
omega_cof6 , delta_cof6 ,
omega_cof5 , delta_cof5 ,
omega_cof4 , delta_cof4 ,
omega_cof3 , delta_cof3 ,
omega_cof2 , delta_cof2 ,
omega_cof1 , delta_cof1 ,
omega_cof0 , delta_cof0
);
//Ports declaration
input clk ;
input n_rst ;
input clken ;
input phase1 ;
input data_in_valid ;
input data_in_start ;
input syndrome_zero_in ;
input [7:0] omega_cof16 , delta_cof16 ;
input [7:0] omega_cof15 , delta_cof15 ;
input [7:0] omega_cof14 , delta_cof14 ;
input [7:0] omega_cof13 , delta_cof13 ;
input [7:0] omega_cof12 , delta_cof12 ;
input [7:0] omega_cof11 , delta_cof11 ;
input [7:0] omega_cof10 , delta_cof10 ;
input [7:0] omega_cof9 , delta_cof9 ;
input [7:0] omega_cof8 , delta_cof8 ;
input [7:0] omega_cof7 , delta_cof7 ;
input [7:0] omega_cof6 , delta_cof6 ;
input [7:0] omega_cof5 , delta_cof5 ;
input [7:0] omega_cof4 , delta_cof4 ;
input [7:0] omega_cof3 , delta_cof3 ;
input [7:0] omega_cof2 , delta_cof2 ;
input [7:0] omega_cof1 , delta_cof1 ;
input [7:0] omega_cof0 , delta_cof0 ;
output data_out_start ;
output data_out_valid ;
output syndrome_zero_out;
output [4:0] degree_delta ;
output [7:0] omega ;
output [7:0] delta ;
output [7:0] delta_odd ;
//Inferring some auxiliary registers
reg [7:0] symbol_counter ;
always@(posedge clk or negedge n_rst)
begin
if ( n_rst == 1'b0 )
symbol_counter <= 8'h0;
else if ( data_in_valid == 1'b0 && clken == 1'b1 )
symbol_counter <= 8'h0;
else if ( data_in_start == 1'b0 && symbol_counter == 8'h0 && clken == 1'b1 )
symbol_counter <= 8'h0;
else if ( data_in_start == 1'b1 && symbol_counter == 8'h0 && clken == 1'b1 && phase1 != 1'b1 )
symbol_counter <= 8'h0;
else if ( symbol_counter == 8'hff && clken == 1'b1 )
symbol_counter <= 8'h0;
else if ( clken == 1'b1 )
symbol_counter <= symbol_counter + 1;
else;
end
reg data_out_valid ;
always@(posedge clk or negedge n_rst)
begin
if ( n_rst == 1'b0 )
data_out_valid <= 1'b0;
else if ( clken == 1'b1 )
data_out_valid <= data_in_valid;
else;
end
reg data_out_start ;
always@(posedge clk or negedge n_rst )
begin
if ( n_rst == 1'b0 )
data_out_start <= 1'b0;
else if ( symbol_counter == 8'h35 && clken == 1'b1 )
data_out_start <= 1'b1;
else if ( clken == 1'b1 )
data_out_start <= 1'b0;
else;
end
//caculate the error numbers and check if fail to correct all the errors
reg [4:0] degree_delta_temp;
always@( delta_cof0 or delta_cof1 or delta_cof2 or delta_cof3 or
delta_cof4 or delta_cof5 or delta_cof6 or delta_cof7 or
delta_cof8 or delta_cof9 or delta_cof10 or delta_cof11 or
delta_cof12 or delta_cof13 or delta_cof14 or delta_cof15 or
delta_cof16 )
begin
if ( delta_cof16 != 8'h0 )
degree_delta_temp = 5'h10;
else if ( delta_cof15 != 8'h0 )
degree_delta_temp = 5'h0f;
else if ( delta_cof14 != 8'h0 )
degree_delta_temp = 5'h0e;
else if ( delta_cof13 != 8'h0 )
degree_delta_temp = 5'h0d;
else if ( delta_cof12 != 8'h0 )
degree_delta_temp = 5'h0c;
else if ( delta_cof11 != 8'h0 )
degree_delta_temp = 5'h0b;
else if ( delta_cof10 != 8'h0 )
degree_delta_temp = 5'h0a;
else if ( delta_cof9 != 8'h0 )
degree_delta_temp = 5'h09;
else if ( delta_cof8 != 8'h0 )
degree_delta_temp = 5'h08;
else if ( delta_cof7 != 8'h0 )
degree_delta_temp = 5'h07;
else if ( delta_cof6 != 8'h0 )
degree_delta_temp = 5'h06;
else if ( delta_cof5 != 8'h0 )
degree_delta_temp = 5'h05;
else if ( delta_cof4 != 8'h0 )
degree_delta_temp = 5'h04;
else if ( delta_cof3 != 8'h0 )
degree_delta_temp = 5'h03;
else if ( delta_cof2 != 8'h0 )
degree_delta_temp = 5'h02;
else if ( delta_cof1 != 8'h0 )
degree_delta_temp = 5'h01;
else if ( delta_cof0 != 8'h0 )
degree_delta_temp = 5'h0;
else
degree_delta_temp = 5'h0;
end
reg [4:0] degree_delta;
always@( posedge clk or negedge n_rst )
begin
if ( n_rst == 1'b0 )
degree_delta <= 5'h0;
else if ( clken == 1'b1 && phase1 == 1'b1 && data_in_start == 1'b1 )
degree_delta <= degree_delta_temp;
else if ( clken == 1'b1 )
degree_delta <= degree_delta;
else;
end
reg syndrome_zero;
always@(posedge clk or negedge n_rst )
begin
if ( n_rst == 1'b0 )
syndrome_zero <= 1'b0;
else if ( data_in_start == 1'b1 && clken == 1'b1 && phase1 == 1'b1 )
syndrome_zero <= syndrome_zero_in;
else if ( clken == 1'b1 )
syndrome_zero <= syndrome_zero;
else;
end
reg syndrome_zero_out;
always@(posedge clk or negedge n_rst )
begin
if ( n_rst == 1'b0 )
syndrome_zero_out <= 1'b0;
else if ( symbol_counter == 8'h35 && clken == 1'b1 )
syndrome_zero_out <= syndrome_zero;
else if ( clken == 1'b1 )
syndrome_zero_out <= 1'b0;
else;
end
//The following iterative part computes ω(α^i)
wire [7:0] p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16;
wire [7:0] D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15,D16;
wire [7:0] q0,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12,q13,q14,q15,q16;
wire [7:0] omega_temp;
wire load_cof;
assign load_cof = data_in_start & phase1 ;
mux2_1 MUX_omega0 ( .a (omega_cof0 ) , .b (p0 ) , .sel(load_cof ) , .c(D0) );
const_mul_w0 M_omega0 ( .a (q0 ) , .b (p0 ) , .sel(1'b0 ) ); //w^0
D_reg8_decoder D_omega0 ( .clk (clk ) , .n_rst (n_rst ) , .D (D0 ) , .q(q0) ,
.clken(clken ) , .phase1(1'b1 ) ) ;
mux2_1 MUX_omega1 ( .a (omega_cof1 ) , .b (p1 ) , .sel(load_cof ) , .c(D1) );
const_mul_w1 M_omega1 ( .a (q1 ) , .b (p1 ) , .sel(1'b0 ) ); //w^1
D_reg8_decoder D_omega1 ( .clk (clk ) , .n_rst (n_rst ) , .D (D1 ) , .q(q1) ,
.clken(clken ) , .phase1(1'b1 ) ) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -