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

📄 rs_decoder_v3_0.v

📁 reed solomon decoder(matlab codes)
💻 V
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------------------// Copyright 2001 Xilinx, Inc. All rights reserved.//------------------------------------------------------------------------------// $Id: rs_decoder_unobf_v3_0.v,v 1.1.2.7 2001/11/15 11:56:01 dlawrie Exp $//`timescale 1ns/10psmodule RS_DECODER_V3_0(DATA_IN,SYNC,CLK,CE,ERASE,RESET,SR,ERR_CNT,ERR_FOUND,FAIL,BLK_STRT,BLK_END,ERASE_CNT,READY,DATA_OUT,DATA_DEL);parameter C_CLKS_PER_SYM=1,C_FAMILY_INT=0,C_GEN_START=0,C_H=1,C_HAS_CE=0,C_HAS_DATA_DEL=0,C_HAS_ERASE=0,C_HAS_SR=0,C_HUSET="MOD",C_K=188,C_MEMSTYLE=2,C_N=204,C_OPTIMISATION=0,C_POLYNOMIAL=0,C_SPEC=0,C_SYMBOL_WIDTH=8,C_SYNC_MODE=0,C_USEHUSET=1,C_USERPM=1;// synopsys_translate_off parameter IIIIl00OII0lOOL0010L1OOLOI=C_N-C_K;parameter IOOlO1OlllI111L0I1lL1OLO1l=(IIIIl00OII0lOOL0010L1OOLOI>127)?8:(IIIIl00OII0lOOL0010L1OOLOI>63)?7:(IIIIl00OII0lOOL0010L1OOLOI>31)?6:(IIIIl00OII0lOOL0010L1OOLOI>15)?5:(IIIIl00OII0lOOL0010L1OOLOI>7)?4:(IIIIl00OII0lOOL0010L1OOLOI>3)?3:(IIIIl00OII0lOOL0010L1OOLOI>1)?2:1;parameter IOI1IlOl1IOL0O0IO01L1lIOOO=(C_N>2047)?12:(C_N>1023)?11:(C_N>511)?10:(C_N>255)?9:(C_N>127)?8:(C_N>63)?7:(C_N>31)?6:(C_N>15)?5:(C_N>7)?4:(C_N>3)?3:(C_N>1)?2:1;input[C_SYMBOL_WIDTH-1:0]DATA_IN;input SYNC,CLK,CE,ERASE,RESET,SR;output[IOOlO1OlllI111L0I1lL1OLO1l-1:0]ERR_CNT;output[IOI1IlOl1IOL0O0IO01L1lIOOO-1:0]ERASE_CNT;output ERR_FOUND,FAIL,BLK_STRT,BLK_END,READY;output[C_SYMBOL_WIDTH-1:0]DATA_OUT;output[C_SYMBOL_WIDTH-1:0]DATA_DEL;parameter IIl0II0O0LII0LlLlIl1LO1O0I=1;parameter IOO1ILIL10LLl0IO0O01OII000=C_N-C_K;parameter IO1OI1LOIIllIlI00IIlIOI1LO=IOO1ILIL10LLl0IO0O01OII000/2;parameter IIlLlLL1O1l0I0Ll0lLILlIOO1={C_SYMBOL_WIDTH{1'b0}};parameter IO10IIlO0III0LO01lLI0L1I10=(C_SPEC==1)?1'b1:1'b0;parameter IIlLLL10LllllLO0I1ILIIIO0L=(1<<C_SYMBOL_WIDTH)-1;parameter IIIl11l1OlLLLO1OLIO01lLl01=(C_HAS_ERASE==0)?((IO1OI1LOIIllIlI00IIlIOI1LO*IO1OI1LOIIllIlI00IIlIOI1LO)+2*(3*IO1OI1LOIIllIlI00IIlIOI1LO+((IO1OI1LOIIllIlI00IIlIOI1LO+1)*(IO1OI1LOIIllIlI00IIlIOI1LO+2)/2))+2)/C_CLKS_PER_SYM+((C_CLKS_PER_SYM>1)?1:0):((3*IOO1ILIL10LLl0IO0O01OII000)+2*(((IOO1ILIL10LLl0IO0O01OII000+1)*(IOO1ILIL10LLl0IO0O01OII000+2)/2))+3)/C_CLKS_PER_SYM+((C_CLKS_PER_SYM>1)?1:0);parameter IILL10000OllL0OI1lLI0I0IO0=IIIl11l1OlLLLO1OLIO01lLl01+C_N+((C_SYMBOL_WIDTH==8)?6:5)-((C_CLKS_PER_SYM>1)?1:0);parameter IIO1lL0IOL000IOOl11IL11IlI=(IO10IIlO0III0LO01lLI0L1I10==1'b1)?IILL10000OllL0OI1lLI0I0IO0-1:IILL10000OllL0OI1lLI0I0IO0-3;parameter IOOLLI0OlILIOIO10lIlL11L1O=(IO10IIlO0III0LO01lLI0L1I10==1'b1)?IILL10000OllL0OI1lLI0I0IO0-(C_N+1):IILL10000OllL0OI1lLI0I0IO0-(C_N+2);parameter IO1L000LOl0OIOOlLO11IILlIO=(IO10IIlO0III0LO01lLI0L1I10==1'b1)?IILL10000OllL0OI1lLI0I0IO0:IILL10000OllL0OI1lLI0I0IO0-2;parameter II0000OII1l1LLLOI1LL0Ll1OO=(IO10IIlO0III0LO01lLI0L1I10==1'b1)?IILL10000OllL0OI1lLI0I0IO0+1:IILL10000OllL0OI1lLI0I0IO0-1;parameter IOI1L1I1OlLLOO1I1l011l0I1l=(IO10IIlO0III0LO01lLI0L1I10==1'b1)?C_N-IILL10000OllL0OI1lLI0I0IO0-1:C_N-IILL10000OllL0OI1lLI0I0IO0+1;parameter IOO0LOILl1lO0I1010L0LOI00O=C_SYMBOL_WIDTH-2;parameter IIL10OOIlIIL1lOIOLOllOOILl=C_SYMBOL_WIDTH-1;parameter II0O1l1lOLl01LO1O0LI1OLlOI=IIIl11l1OlLLLO1OLIO01lLl01-C_N;parameter IIII0Ll1l1OI010L1llLll1L0L=(IO10IIlO0III0LO01lLI0L1I10==1'b1)?IILL10000OllL0OI1lLI0I0IO0+1:IILL10000OllL0OI1lLI0I0IO0-1;parameter IOLOIL0I0lIL0I0lO11IOL1110=(C_HAS_ERASE==0)?IO1OI1LOIIllIlI00IIlIOI1LO:IOO1ILIL10LLl0IO0O01OII000;parameter II0I1OL0IOll111L0llLI10IL1=IOLOIL0I0lIL0I0lO11IOL1110-1;parameter IOOlI0l1lIO1llOIL00LLIL101=12;integer i;integer index_last;reg[C_SYMBOL_WIDTH-1:0]data_out_shift[IILL10000OllL0OI1lLI0I0IO0-C_N:0];reg shift_cnt;reg sync_bit;reg flag_funny;reg flag_funnv;reg flag_funny_d;reg flag_funnv_d;reg funnv_shift[IILL10000OllL0OI1lLI0I0IO0+1:0];reg funny_shift[IILL10000OllL0OI1lLI0I0IO0+1:0];wire FAIL;reg fail_out;wire ERR_FOUND;reg err_found_out;wire[IOOlO1OlllI111L0I1lL1OLO1l-1:0]ERR_CNT;reg[IOOlO1OlllI111L0I1lL1OLO1l-1:0]err_cnt_out;wire[IOI1IlOl1IOL0O0IO01L1lIOOO-1:0]ERASE_CNT;reg[IOI1IlOl1IOL0O0IO01L1lIOOO-1:0]erase_cnt_out;wire BLK_STRT;reg blk_strt_out;wire BLK_END;reg blk_end_out;wire READY;reg ready_out;wire[C_SYMBOL_WIDTH-1:0]DATA_OUT;reg[C_SYMBOL_WIDTH-1:0]data_out_out;reg[C_SYMBOL_WIDTH-1:0]data_del_out;reg[C_SYMBOL_WIDTH-1:0]data_out_db;reg[C_SYMBOL_WIDTH-1:0]data_out_db_var;reg[C_SYMBOL_WIDTH-1:0]data_del_db;reg ce_d;reg[C_SYMBOL_WIDTH-1:0]data_in_d;wire[C_SYMBOL_WIDTH-1:0]data_in_d_sig;reg[C_SYMBOL_WIDTH-1:0]data_in_db;reg[C_SYMBOL_WIDTH-1:0]data_in_d_var;reg[C_SYMBOL_WIDTH-1:0]gf_field[-1:(1<<C_SYMBOL_WIDTH)-2];reg start;reg sr_flag;reg sr_d;integer sym_clk;integer gf_ap[0:(1<<C_SYMBOL_WIDTH)-1];integer r_ap[C_N-1:0];integer reset_cnt;integer reset_high_cnt;integer input_count;integer sym_int[C_N-1:0];integer errors[C_N-1:0];integer symbol_corrected[C_N-1:0];integer lambda_var[IOLOIL0I0lIL0I0lO11IOL1110:0];integer corrected_message[C_N-1:0];integer b_var[IOLOIL0I0lIL0I0lO11IOL1110:0];integer temp_poly[IOLOIL0I0lIL0I0lO11IOL1110:0];integer temp7;integer discrep;integer temp;integer temp2;integer temp3;integer temp4;integer delta;integer gamma;integer l;integer num_errors_var;integer num_erasures;integer deg_cnt;integer index_var;integer temp8;integer omega_var[II0I1OL0IOll111L0llLI10IL1:0];integer erase_locator[IOO1ILIL10LLl0IO0O01OII000:0];integer error_locator[IOLOIL0I0lIL0I0lO11IOL1110:0];integer error_evaluator[II0I1OL0IOll111L0llLI10IL1:0];integer lambda_diff_var[IOLOIL0I0lIL0I0lO11IOL1110:0];integer deg_lambda;integer deg_omega;integer reciprocal;integer lambda_value;integer lambda_diff_value;integer omega_value;integer substitute;integer index_out;integer ready_dc;integer index;integer gf_int;integer p;integer scaler;integer j;integer z;reg[C_SYMBOL_WIDTH-1:0]code_buff_in[IILL10000OllL0OI1lLI0I0IO0:0];reg blk_strt_shift[IILL10000OllL0OI1lLI0I0IO0:0];reg blk_strt_sig;reg blk_end_shift[IILL10000OllL0OI1lLI0I0IO0:0];reg blk_end_sig;reg erase_d;wire erase_d_sig;reg erase_db;reg[IOI1IlOl1IOL0O0IO01L1lIOOO-1:0]erase_cnt_shift[IILL10000OllL0OI1lLI0I0IO0:0];reg[IOI1IlOl1IOL0O0IO01L1lIOOO-1:0]erase_cnt_sig;reg[IOOlO1OlllI111L0I1lL1OLO1l-1:0]err_cnt_sig;reg[IOOlO1OlllI111L0I1lL1OLO1l-1:0]err_cnt_shift[IILL10000OllL0OI1lLI0I0IO0:0];reg err_found_sig;reg err_found_shift[IILL10000OllL0OI1lLI0I0IO0:0];reg fail_sig;reg fail_shift[IILL10000OllL0OI1lLI0I0IO0:0];reg sync_db;reg sync_d;reg sync_dd;wire sync_d_sig;integer syndromes[(C_N-C_K)-1:0];reg pwr_on_reset;reg[7:0]db_to_normal[255:0];reg[7:0]normal_to_db[255:0];initial begin#1;gen_field;gen_ap;if(IO10IIlO0III0LO01lLI0L1I10==1'b1)begin gen_db_roms;end power_on_reset;pwr_on_reset<=1;#1 pwr_on_reset<=0;end task power_on_reset;begin data_in_db<=IIlLlLL1O1l0I0Ll0lLILlIOO1;data_out_db<=IIlLlLL1O1l0I0Ll0lLILlIOO1;data_del_db<=IIlLlLL1O1l0I0Ll0lLILlIOO1;data_out_out<=IIlLlLL1O1l0I0Ll0lLILlIOO1;data_del_out<=IIlLlLL1O1l0I0Ll0lLILlIOO1;err_cnt_out<=0;err_found_out<=0;erase_cnt_out<=0;fail_out<=0;fail_sig<=0;blk_strt_out<=0;blk_strt_sig<=0;blk_end_out<=0;blk_end_sig<=0;ready_out<=1;reset_cnt<=0;reset_high_cnt<=0;input_count<=-1;index<=-1;err_found_sig<=0;fail_sig<=0;start<=0;index_out<=0;index_last<=0;sym_clk<=0;flag_funny<=0;flag_funnv<=0;flag_funny_d<=0;flag_funnv_d<=0;reset_code_buf;end endtask task calc_db_array;input[63:0]conv_bit_array;inout[2047:0]basis_contents;reg[7:0]and_val;reg[7:0]comp_val;reg[8:0]sym;reg[4:0]j,k,bit;begin basis_contents={2048{1'b0}};for(sym=0;sym<256;sym=sym+1)begin for(j=0;j<8;j=j+1)begin for(k=0;k<8;k=k+1)begin comp_val=1<<k;if(sym[k]==1'b1&&comp_val[k]==1'b1)begin and_val=1<<j;for(bit=0;bit<8;bit=bit+1)basis_contents[(sym*8)+bit]=basis_contents[(sym*8)+bit]^(conv_bit_array[((7-k)*8)+bit]&and_val[bit]);end end end end end endtask task gen_db_roms;reg[63:0]ccsds_basis_conv;reg[2047:0]db_array;reg[7:0]db_symbol;integer i,bit;begin ccsds_basis_conv={8'd123,8'd175,8'd153,8'd250,8'd134,8'd236,8'd239,8'd141};calc_db_array(ccsds_basis_conv,db_array);for(i=0;i<256;i=i+1)begin for(bit=0;bit<8;bit=bit+1)db_symbol[bit]=db_array[i*8+bit];normal_to_db[i]=db_symbol;end ccsds_basis_conv={8'd204,8'd172,8'd121,8'd240,8'd253,8'd46,8'd66,8'd197};calc_db_array(ccsds_basis_conv,db_array);for(i=0;i<256;i=i+1)begin for(bit=0;bit<8;bit=bit+1)db_symbol[bit]=db_array[i*8+bit];db_to_normal[i]=db_symbol;end end endtask task gen_field;integer use_poly;reg shift_out;reg[IIL10OOIlIIL1lOIOLOllOOILl:0]field_poly;reg[IIL10OOIlIIL1lOIOLOllOOILl:0]gfelement;integer i,j;integer field;begin if(C_POLYNOMIAL==0)begin if(C_SYMBOL_WIDTH==12)use_poly=4179;if(C_SYMBOL_WIDTH==11)use_poly=2053;if(C_SYMBOL_WIDTH==10)use_poly=1033;if(C_SYMBOL_WIDTH==9)use_poly=529;if(C_SYMBOL_WIDTH==8)use_poly=285;if(C_SYMBOL_WIDTH==7)use_poly=137;if(C_SYMBOL_WIDTH==6)use_poly=67;if(C_SYMBOL_WIDTH==5)use_poly=37;if(C_SYMBOL_WIDTH==4)use_poly=19;if(C_SYMBOL_WIDTH==3)use_poly=11;if(C_SYMBOL_WIDTH==2)use_poly=7;if(C_SYMBOL_WIDTH==1)use_poly=0;if(C_SYMBOL_WIDTH==0)use_poly=0;end else use_poly=C_POLYNOMIAL;gfelement=0;field=(1<<(IIL10OOIlIIL1lOIOLOllOOILl+1))-1;for(i=0;i<=field;i=i+1)begin shift_out=gfelement[IIL10OOIlIIL1lOIOLOllOOILl];gfelement={gfelement[IOO0LOILl1lO0I1010L0LOI00O:0],1'b0};if(i==1)begin gfelement=0;gfelement[0]=1;end else if(shift_out==1)begin gfelement=gfelement^use_poly;end gf_field[i-1]=gfelement;end gf_field[-1]=0;end endtask task gen_ap;reg shift_out;reg[IIL10OOIlIIL1lOIOLOllOOILl:0]field_poly;reg[IIL10OOIlIIL1lOIOLOllOOILl:0]gfelement;integer i,j,num;integer field;integer use_poly;begin if(C_POLYNOMIAL==0)begin if(C_SYMBOL_WIDTH==12)use_poly=4179;if(C_SYMBOL_WIDTH==11)use_poly=2053;if(C_SYMBOL_WIDTH==10)use_poly=1033;if(C_SYMBOL_WIDTH==9)use_poly=529;if(C_SYMBOL_WIDTH==8)use_poly=285;if(C_SYMBOL_WIDTH==7)use_poly=137;if(C_SYMBOL_WIDTH==6)use_poly=67;if(C_SYMBOL_WIDTH==5)use_poly=37;if(C_SYMBOL_WIDTH==4)use_poly=19;if(C_SYMBOL_WIDTH==3)use_poly=11;if(C_SYMBOL_WIDTH==2)use_poly=7;if(C_SYMBOL_WIDTH==1)use_poly=0;if(C_SYMBOL_WIDTH==0)use_poly=0;end else use_poly=C_POLYNOMIAL;gfelement=0;field=(1<<(IIL10OOIlIIL1lOIOLOllOOILl+1))-1;for(i=0;i<=field;i=i+1)begin shift_out=gfelement[IIL10OOIlIIL1lOIOLOllOOILl];gfelement={gfelement[IOO0LOILl1lO0I1010L0LOI00O:0],1'b0};if(i==1)begin gfelement=0;gfelement[0]=1;end else if(shift_out==1)gfelement=gfelement^use_poly;num=gfelement;gf_ap[num]=i-1;end end endtask function integer gf_add;input[15:0]a,b;reg[IIL10OOIlIIL1lOIOLOllOOILl:0]bin_a;reg[IIL10OOIlIIL1lOIOLOllOOILl:0]bin_b;reg[IIL10OOIlIIL1lOIOLOllOOILl:0]result_bin;integer result_int;begin if(a==65535)bin_a=0;else bin_a=gf_field[a];if(b==65535)bin_b=0;else bin_b=gf_field[b];result_bin=bin_a^bin_b;if(result_bin==0)result_int=0;else result_int=result_bin;gf_add=gf_ap[result_int];end endfunction task get_syndromes;integer mult_out[0:IIIIl00OII0lOOL0010L1OOLOI-1];integer syndromes_var[0:IIIIl00OII0lOOL0010L1OOLOI-1];integer j,i;begin for(i=0;i<=IIIIl00OII0lOOL0010L1OOLOI-1;i=i+1)syndromes_var[i]=-1;for(i=C_N-1;i>=0;i=i-1)begin for(j=IIIIl00OII0lOOL0010L1OOLOI-1;j>=0;j=j-1)begin mult_out[j]=gf_mult(C_H*(j+C_GEN_START),syndromes_var[j]);syndromes_var[j]=gf_add(r_ap[i],mult_out[j]);end end for(i=0;i<=IIIIl00OII0lOOL0010L1OOLOI-1;i=i+1)syndromes[i]=syndromes_var[i];end endtask task update_erase_locator;begin for(i=C_N-C_K;i>0;i=i-1)erase_locator[i]=gf_add(erase_locator[i],gf_mult(erase_locator[i-1],(C_H*index_var)%IIlLLL10LllllLO0I1ILIIIO0L));erase_locator[0]=0;end endtask function integer gf_mult;input[15:0]a;input[15:0]b;integer result_var;integer field;begin field=(1<<(IIL10OOIlIIL1lOIOLOllOOILl+1))-1;if(a==65535)result_var=-1;else if(b==65535)result_var=-1;else begin result_var=a+b;while(result_var>(field-1))result_var=result_var-field;end gf_mult=result_var;end endfunction task init_erase_locator;begin for(i=C_N-C_K;i>0;i=i-1)erase_locator[i]=-1;erase_locator[0]=0;end endtask task reset_proc3;integer i;begin for(i=C_N-1;i>=0;i=i-1)begin errors[i]=-1;symbol_corrected[i]=-1;corrected_message[i]=-1;end for(i=IOLOIL0I0lIL0I0lO11IOL1110;i>=0;i=i-1)begin lambda_var[i]=-1;b_var[i]=-1;temp_poly[i]=-1;error_locator[i]=-1;lambda_diff_var[i]=-1;end for(i=II0I1OL0IOll111L0llLI10IL1;i>=0;i=i-1)begin omega_var[i]=-1;error_evaluator[i]=-1;end for(i=IIIIl00OII0lOOL0010L1OOLOI-1;i>=0;i=i-1)syndromes[i]=-1;sync_dd<=0;deg_lambda=0;deg_omega=0;reciprocal=-1;lambda_value=-1;lambda_diff_value=-1;omega_value=-1;substitute=-1;num_errors_var=0;num_erasures=0;discrep=-1;temp=-1;temp2=-1;temp3=-1;temp4=-1;temp7=-1;temp8=-1;delta=-1;gamma=-1;l=0;deg_cnt=0;err_cnt_out<=0;err_cnt_sig<=0;if(C_HAS_ERASE!=0)begin erase_cnt_out<=0;erase_cnt_sig<=0;end err_found_out<=0;err_found_sig<=0;fail_out<=0;fail_sig<=0;blk_strt_out<=0;blk_strt_sig<=0;blk_end_out<=0;blk_end_sig<=0;ready_out<=1;ready_dc=0;index<=-1;input_count<=-1;init_erase_locator;end endtask task reset_proc2;integer i;begin for(i=C_N-1;i>=0;i=i-1)begin sym_int[i]=0;r_ap[i]=-1;errors[i]=-1;symbol_corrected[i]=-1;corrected_message[i]=-1;end for(i=IOLOIL0I0lIL0I0lO11IOL1110;i>=0;i=i-1)begin lambda_var[i]=-1;b_var[i]=-1;temp_poly[i]=-1;error_locator[i]=-1;lambda_diff_var[i]=-1;end for(i=II0I1OL0IOll111L0llLI10IL1;i>=0;i=i-1)begin omega_var[i]=-1;error_evaluator[i]=-1;end for(i=IIIIl00OII0lOOL0010L1OOLOI-1;i>=0;i=i-1)syndromes[i]=-1;sync_dd<=0;deg_lambda=0;deg_omega=0;reciprocal=-1;lambda_value=-1;lambda_diff_value=-1;omega_value=-1;substitute=-1;num_errors_var=0;num_erasures=0;discrep=-1;temp=-1;temp2=-1;temp3=-1;temp4=-1;temp7=-1;temp8=-1;delta=-1;gamma=-1;l=0;deg_cnt=0;index_var=0;data_out_out<=0;if(C_HAS_DATA_DEL!=0)data_del_out<=0;if(C_HAS_ERASE!=0)begin erase_cnt_out<=0;erase_cnt_sig<=0;end err_cnt_out<=0;err_cnt_sig<=0;

⌨️ 快捷键说明

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