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

📄 kesblock.v

📁 rs编码vvhdl 希望能通过 我不晓得具体对大家有用否 希望懂rs编码的多多交流
💻 V
字号:
//*******************************************************************//// This Key Equation Solver (KES) block implements reformulated      //// inverse-free Berlekamp-Massey algorithm. The inverse-free         //// Berlekamp-Massey is described by Irving S. Reed, M.T. Smith       //// and T.K. Truong in their paper entitled "VLSI design of           //// inverse-free Berlekamp-Massey (BM) algorithm" in Proc. IEEE,      //// Sept 1991. With the algorithm, inverse/division operation is not  //// needed. Hence, it simplifies the implementation of                //// Berlekamp-Massey algorithm.                                       //// Then, in the paper entitled "High speed architectures for         //// Reed-Solomon Decoders" in IEEE Trans. VLSI Systems, October 2001, //// Dilip P. Sarwate and Naresh R. Shanbhag proposed a reformulated   //// version of the inverse-free algorithm. The reformulated algorithm //// is aimed mainly to reduce critical path delay and also to         //// simplify inverse-free algorithm implementation even more.         ////*******************************************************************//module KES_block(active_kes, clock1, clock2, reset, syndvalue0, syndvalue1,                 syndvalue2, syndvalue3, syndvalue4, syndvalue5, syndvalue6,                 syndvalue7, syndvalue8, syndvalue9, syndvalue10, syndvalue11,                 lambda0, lambda1, lambda2, lambda3, lambda4, lambda5,                 lambda6, homega0, homega1, homega2, homega3, homega4,                 homega5, lambda_degree, finish);input active_kes, clock1, clock2, reset;input [4:0] syndvalue0, syndvalue1, syndvalue2,             syndvalue3, syndvalue4, syndvalue5, syndvalue6, syndvalue7,            syndvalue8, syndvalue9, syndvalue10, syndvalue11;output [4:0] lambda0, lambda1, lambda2, lambda3, lambda4, lambda5, lambda6;output [4:0] homega0, homega1, homega2, homega3, homega4, homega5;output [2:0] lambda_degree;output finish;wire load, hold, init, iter_control;wire [4:0] delta0, delta1, delta2, delta3, delta4, delta5, delta6,            delta7, delta8, delta9, delta10, delta11, delta12, delta13,            delta14, delta15, delta16, delta17, delta18;wire [4:0] gamma, delta;wire koefcomp1, koefcomp2, koefcomp3, koefcomp4, koefcomp5, koefcomp6;PE PE0(delta1, syndvalue0, gamma, delta, clock1, load, init,        hold, iter_control, delta0);PE PE1(delta2, syndvalue1, gamma, delta, clock1, load, init,            hold, iter_control, delta1);PE PE2(delta3, syndvalue2, gamma, delta, clock1, load, init,        hold, iter_control, delta2);PE PE3(delta4, syndvalue3, gamma, delta, clock1, load, init,        hold, iter_control, delta3);PE PE4(delta5, syndvalue4, gamma, delta, clock1, load, init,        hold, iter_control, delta4);PE PE5(delta6, syndvalue5, gamma, delta, clock1, load, init,        hold, iter_control, delta5);PE PE6(delta7, syndvalue6, gamma, delta, clock1, load, init,        hold, iter_control, delta6);PE PE7(delta8, syndvalue7, gamma, delta, clock1, load, init,        hold, iter_control, delta7);PE PE8(delta9, syndvalue8, gamma, delta, clock1, load, init,        hold, iter_control, delta8);PE PE9(delta10, syndvalue9, gamma, delta, clock1, load, init,        hold, iter_control, delta9);PE PE10(delta11, syndvalue10, gamma, delta, clock1, load, init,        hold, iter_control, delta10);PE PE11(delta12, syndvalue11, gamma, delta, clock1, load, init,        hold, iter_control, delta11);PE_12 PE12(delta13, gamma, delta, clock1, load, init,            hold, iter_control, delta12);PE_12 PE13(delta14, gamma, delta, clock1, load, init,            hold, iter_control, delta13);PE_12 PE14(delta15, gamma, delta, clock1, load, init,            hold, iter_control, delta14);PE_12 PE15(delta16, gamma, delta, clock1, load, init,            hold, iter_control, delta15);PE_12 PE16(delta17, gamma, delta, clock1, load, init,            hold, iter_control, delta16);PE_12 PE17(delta18, gamma, delta, clock1, load, init,            hold, iter_control, delta17);PE_18 PE18(delta, clock1, load, init, hold, iter_control,           delta18);control mcontrol(delta0, gamma, active_kes, reset, delta, iter_control,                  finish, load, init, hold, clock1, clock2);assign homega0 = delta0;assign homega1 = delta1;assign homega2 = delta2;assign homega3 = delta3;assign homega4 = delta4;assign homega5 = delta5;assign lambda0 = delta6;assign lambda1 = delta7;assign lambda2 = delta8;assign lambda3 = delta9;assign lambda4 = delta10;assign lambda5 = delta11;assign lambda6 = delta12;// this statements below counts degree of error location polynomial // (lambda)assign koefcomp1 = (lambda1[0]|lambda1[1])|(lambda1[2]|lambda1[3])|                    lambda1[4];assign koefcomp2 = (lambda2[0]|lambda2[1])|(lambda2[2]|lambda2[3])|                    lambda2[4];assign koefcomp3 = (lambda3[0]|lambda3[1])|(lambda3[2]|lambda3[3])|                    lambda3[4];assign koefcomp4 = (lambda4[0]|lambda4[1])|(lambda4[2]|lambda4[3])|                    lambda4[4];assign koefcomp5 = (lambda5[0]|lambda5[1])|(lambda5[2]|lambda5[3])|                    lambda5[4];assign koefcomp6 =  (lambda6[0]|lambda6[1])|(lambda6[2]|lambda6[3])|                    lambda6[4];priority_encoder pencoder(koefcomp1,koefcomp2,koefcomp3,koefcomp4,                          koefcomp5,koefcomp6, lambda_degree);endmodule                  //************************************************************//module control(delta0_in, gamma, active_kes, reset, delta0_out,                iter_control, finish, load, init, hold,                clock1, clock2);input [4:0] delta0_in;input clock1, clock2, active_kes, reset;output [4:0] delta0_out, gamma;output iter_control, finish, load, hold, init;reg [3:0] cntr;reg load, hold, init, finish;wire [4:0] kr, inv_kr, outadder;wire [4:0] outmux1, outmux2;wire zerodetect, negdetect;wire [4:0] incr;wire carrybit;parameter [2:0] st0=0, st1=1, st2=2, st3=3, st4=4, st5=5;reg [2:0] state, nxt_state;// Counter //always@(posedge clock1)begin    if(load)       cntr <= cntr + 1;    else       cntr <= 4'b0;end//******//// FSM  ////******//always@(active_kes or cntr or state)begin    case(state)        st0 : begin               if(active_kes)                  nxt_state = st1;               else                  nxt_state = st0;              end        st1 : nxt_state = st2;        st2 : begin               if(cntr == 12)                  nxt_state = st3;               else                  nxt_state = st2;              end        st3 : nxt_state = st4;        st4 : begin              if(active_kes)                 nxt_state = st4;              else                 nxt_state = st0;              end        default: nxt_state = st0;    endcaseendalways@(posedge clock2 or negedge reset)begin   if(~reset)      state = st0;   else      state = nxt_state;endalways@(state)begin    case(state)        st0 :  begin     //start state               init = 0;               finish = 0;               load = 0;               hold = 0;               end        st1 :  begin      //initialization state               init = 1;               finish = 0;               load = 0;               hold = 0;               end        st2 :  begin      //computation state               finish = 0;               load = 1;               hold = 0;               init = 0;               end        st3 :  begin      //finish state               finish = 1;               load = 0;               hold = 1;               init = 0;               end        st4 :  begin      //hold output data               finish = 0;               load = 0;               hold = 1;               init = 0;               end        default:  begin                  finish = 0;                  load = 0;                  hold = 0;                  init = 0;                  end    endcaseend               assign incr = 1;assign carrybit = 0;assign zerodetect = (delta0_in[0]|delta0_in[1])|(delta0_in[2]|delta0_in[3])|delta0_in[4];assign negdetect = ~kr[4];assign iter_control = zerodetect & negdetect;assign inv_kr = ~kr;assign delta0_out = delta0_in;mux2_to_1 multiplexer1(gamma, delta0_in, outmux1, iter_control);mux2_to_1 multiplexer2(outadder, inv_kr, outmux2, iter_control);fulladder adder(kr, incr, carrybit, outadder);regamma reggamma(outmux1, gamma, load, init, clock1);regkr regkr(outmux2, kr, load, init, clock1);endmodule//****************************************//// Full Adder 5 bit                       //// carry bit for MSB cell is discarded    ////****************************************//module fulladder(in1, in2, carryin, out);input [4:0] in1, in2;input carryin;output [4:0] out;    wire carry0, carry1, carry2, carry3;    assign carry0 = ((in1[0] ^ in2[0])&carryin) | (in1[0]&in2[0]);assign carry1 = ((in1[1] ^ in2[1])&carry0) | (in1[1]&in2[1]);assign carry2 = ((in1[2] ^ in2[2])&carry1) | (in1[2]&in2[2]);assign carry3 = ((in1[3] ^ in2[3])&carry2) | (in1[3]&in2[3]);assign out[0] = in1[0] ^ in2[0] ^ carryin;assign out[1] = in1[1] ^ in2[1] ^ carry0;assign out[2] = in1[2] ^ in2[2] ^ carry1;assign out[3] = in1[3] ^ in2[3] ^ carry2;assign out[4] = in1[4] ^ in2[4] ^ carry3;endmodule//*********************************************//// register for storing gamma with synchronous //// load and initialize                         ////*********************************************//module regamma(datain, dataout, load, initialize, clock);input [4:0] datain;input load, initialize;input clock;output [4:0] dataout;reg [4:0] out;always @(posedge clock)begin    if(initialize)       out <= 5'b10000;    else if(load)       out <= datain;    else       out <= 5'b0;endassign dataout = out;endmodule//********************************************//// register for storing k(r) with synchronous //// load and initialize                        ////********************************************//module regkr(datain, dataout, load, initialize, clock);input [4:0] datain;input load, initialize;input clock;output [4:0] dataout;reg [4:0] out;always @(posedge clock)begin    if(initialize)       out <= 5'b0;    else if(load)       out <= datain;    else       out <= 5'b0;endassign dataout = out;endmodule//******************//// Priority Encoder ////******************//module priority_encoder(in1,in2,in3,in4,in5,in6,out);input in1, in2, in3, in4, in5, in6;output [2:0] out;reg [2:0] out;always@({in6,in5,in4,in3,in2,in1})begin	if(in6==1)					  out = 6;	else if(in5==1)  out = 5;	else if(in4==1)  out = 4;	else if(in3==1)  out = 3;	else if(in2==1)  out = 2;	else if(in1==1)  out = 1;	else out = 3'b0;endendmodule//****************************************************************//module PE(delta_cflex_in, syndval, gamma, delta, clock, load, init,            hold, iter_control, delta_cflex_out);input [4:0] delta_cflex_in, syndval;input [4:0] gamma;input [4:0] delta;input clock, load, hold, iter_control, init;output [4:0] delta_cflex_out;wire [4:0] outmult1, outmult2, outreg1, outreg2, outmux, outadder;lcpmult multiplier1(delta_cflex_in, gamma, outmult1);lcpmult multiplier2(delta, outreg1, outmult2);register_pe reg1(outadder, syndval, outreg2 , load, init, hold, clock);register_pe reg2(outmux, syndval, outreg1 , load, init, hold, clock);mux2_to_1 multiplexer(outreg1, delta_cflex_in, outmux, iter_control);assign outadder[4] = outmult2[4] ^ outmult1[4];assign outadder[3] = outmult2[3] ^ outmult1[3];assign outadder[2] = outmult2[2] ^ outmult1[2];assign outadder[1] = outmult2[1] ^ outmult1[1];assign outadder[0] = outmult2[0] ^ outmult1[0];assign delta_cflex_out = outreg2;endmodule//***********************************************************//module PE_12(delta_cflex_in, gamma, delta, clock, load, init,            hold, iter_control, delta_cflex_out);input [4:0] delta_cflex_in;input [4:0] gamma;input [4:0] delta;input clock, load, hold, iter_control, init;output [4:0] delta_cflex_out;wire [4:0] outmult1, outmult2, outreg1, outreg2, outmux, outadder;wire [4:0] initdata;assign initdata = 5'b0;lcpmult multiplier1(delta_cflex_in, gamma, outmult1);lcpmult multiplier2(delta, outreg1, outmult2);register_pe reg1(outadder, initdata, outreg2 , load, init, hold, clock);register_pe reg2(outmux, initdata, outreg1 , load, init, hold, clock);mux2_to_1 multiplexer(outreg1, delta_cflex_in, outmux, iter_control);assign outadder[4] = outmult2[4] ^ outmult1[4];assign outadder[3] = outmult2[3] ^ outmult1[3];assign outadder[2] = outmult2[2] ^ outmult1[2];assign outadder[1] = outmult2[1] ^ outmult1[1];assign outadder[0] = outmult2[0] ^ outmult1[0];assign delta_cflex_out = outreg2;endmodule //******************************************************//module PE_18(delta, clock, load, init, hold, iter_control,             delta_cflex_out);input [4:0] delta;input clock, load, init, hold, iter_control;output [4:0] delta_cflex_out;wire [4:0] outmult, outreg1, outreg2, outmux; wire [4:0] initdata;wire [4:0] delta_cflex_19;assign initdata = 5'b10000;assign delta_cflex_19 = 5'b0;lcpmult multiplier(delta, outreg1, outmult);register_pe reg1(outmult, initdata, outreg2 , load, init, hold, clock);register_pe reg2(outmux, initdata, outreg1 , load, init, hold, clock);mux2_to_1 multiplexer(outreg1, delta_cflex_19, outmux, iter_control);assign delta_cflex_out = outreg2;endmodule//*****************************************************////PE Register with synchronous load, intialize, hold //module register_pe(datain, initdata, dataout, load, initialize, hold, clock);input [4:0] datain, initdata;input load, hold, initialize;input clock;output [4:0] dataout;reg [4:0] out;always @(posedge clock)begin    if(initialize)       out <= initdata;    else if(load)       out <= datain;    else if(hold)       out <= out;    else       out <= 5'b0;endassign dataout = out;endmodule

⌨️ 快捷键说明

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