tag 标签: crc码

相关博文
  • 热度 7
    2013-8-20 21:10
    1486 次阅读|
    0 个评论
    具体的原理请参考 http://www.cnblogs.com/BitArt/archive/2012/12/26/2833100.html ,在此不讲原理。。。。。。。。。。贴出代码 /******************************************************* 假设需要发送的数据为8位,校验多项式一般为X16+X12+X5+1。************************************************************/ module CRC_Prj(clk,rst,m_x,en,Data_M_Out,err); input clk; input rst; input m_x;//发送的数据为8位 input en;     //?????????????? output Data_M_Out; output err; wire data_x; //wire hsend; fasong u1(  .clk(clk),  .rst(clk),  .m_x(m_x),  .en(en),  .data_x(data_x) // .hsend(hsend) ); jieshou u2(  .clk(clk),  .rst(rst),  .data_x(data_x), // .hsend(hsend),  .Data_M_Out(Data_M_Out),  .err(err) ); endmodule   module fasong(  clk,rst,  m_x,en,  data_x//,hsend ); input clk; input rst; input m_x;//发送的数据为8位 input en;     //?????????????? output data_x;// jieshou 24位 //output hsend;   //??????????????? //reg m_x_r1;     //发送模块寄存器 reg data_x_r; reg yanzheng;  //验证码模块寄存器 //reg hsend_r; reg dtemp;  // 被除数 assign data_x = data_x_r; //assign hsend = hsend_r; parameter polynomial = 17'b10001000000100001;//多项式一般为X16+X12+X5+1。 always@(posedge clk or negedge rst)  if(!rst)                             //初始化   begin    dtemp = 24'd0;    //hsend_r = 1'b0;   end  else if(en == 1'b1)    begin     dtemp = {m_x,16'd0}; //     if( dtemp   )  dtemp =dtemp ^polynomial;     if( dtemp   )  dtemp =dtemp ^polynomial;     if( dtemp   )  dtemp =dtemp ^polynomial;     if( dtemp   )  dtemp =dtemp ^polynomial;     if( dtemp   )  dtemp =dtemp ^polynomial;     if( dtemp   )  dtemp =dtemp ^polynomial;     if( dtemp   )  dtemp =dtemp ^polynomial;     if( dtemp   )  dtemp =dtemp ^polynomial;        data_x_r={m_x,dtemp };  //dtemp 为得到的余数式    // hsend_r=1'b1;    end   //else   // hsend_r = 1'b0; endmodule module jieshou(    clk,rst,    data_x,    //hsend,    Data_M_Out,err   ); input clk; input rst; input data_x; //input hsend; output reg Data_M_Out; output reg err; reg dtemp; parameter polynomial = 17'b10001000000100001;//多项式一般为X16+X12+X5+1。 always@(posedge clk or negedge rst)  if(!rst)   begin    Data_M_Out = 8'b00000000;    err = 0;   end  else// if(hsend == 1)   begin    dtemp=data_x;    if( dtemp   )  dtemp =dtemp ^polynomial;    if( dtemp   )  dtemp =dtemp ^polynomial;    if( dtemp   )  dtemp =dtemp ^polynomial;    if( dtemp   )  dtemp =dtemp ^polynomial;    if( dtemp   )  dtemp =dtemp ^polynomial;    if( dtemp   )  dtemp =dtemp ^polynomial;    if( dtemp   )  dtemp =dtemp ^polynomial;    if( dtemp   )  dtemp =dtemp ^polynomial;     if(dtemp == 16'b0000000000000000)     begin      Data_M_Out = data_x ;      err = 1;     end   end endmodule 下面是仿真图形 发送和接受匹配。。。。