热度 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 下面是仿真图形 发送和接受匹配。。。。