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

📄 chien_search.v

📁 rs的译码器
💻 V
📖 第 1 页 / 共 2 页
字号:
                                                
//                                                                                          
//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 + -