原创 CRC码的FPGA的verilog实现与仿真

2013-8-20 21:10 1483 7 7 分类: FPGA/CPLD
具体的原理请参考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 [7:0]m_x;//发送的数据为8位
input en;     //??????????????
output [7:0] Data_M_Out;
output err;

wire [23:0]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 [7:0]m_x;//发送的数据为8位
input en;     //??????????????

output [23:0]data_x;// jieshou 24位
//output hsend;   //???????????????

//reg [7:0]m_x_r1;     //发送模块寄存器
reg [23:0]data_x_r;
reg [15:0]yanzheng;  //验证码模块寄存器
//reg hsend_r;
reg [23:0]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[23]  )  dtemp[23:7]<=dtemp[23:7]^polynomial;
    if( dtemp[22]  )  dtemp[22:6]<=dtemp[22:6]^polynomial;
    if( dtemp[21]  )  dtemp[21:5]<=dtemp[21:5]^polynomial;
    if( dtemp[20]  )  dtemp[20:4]<=dtemp[20:4]^polynomial;
    if( dtemp[19]  )  dtemp[19:3]<=dtemp[19:3]^polynomial;
    if( dtemp[18]  )  dtemp[18:2]<=dtemp[18:2]^polynomial;
    if( dtemp[17]  )  dtemp[17:1]<=dtemp[17:1]^polynomial;
    if( dtemp[16]  )  dtemp[16:0]<=dtemp[16:0]^polynomial;   
    data_x_r<={m_x,dtemp[15:0]};  //dtemp[15:0]为得到的余数式
   // 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 [23:0]data_x;
//input hsend;

output reg[7:0] Data_M_Out;
output reg err;
reg [23:0]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[23]  )  dtemp[23:7]<=dtemp[23:7]^polynomial;
   if( dtemp[22]  )  dtemp[22:6]<=dtemp[22:6]^polynomial;
   if( dtemp[21]  )  dtemp[21:5]<=dtemp[21:5]^polynomial;
   if( dtemp[20]  )  dtemp[20:4]<=dtemp[20:4]^polynomial;
   if( dtemp[19]  )  dtemp[19:3]<=dtemp[19:3]^polynomial;
   if( dtemp[18]  )  dtemp[18:2]<=dtemp[18:2]^polynomial;
   if( dtemp[17]  )  dtemp[17:1]<=dtemp[17:1]^polynomial;
   if( dtemp[16]  )  dtemp[16:0]<=dtemp[16:0]^polynomial; 
   if(dtemp[15:0] == 16'b0000000000000000)
    begin
     Data_M_Out <= data_x[23:16];
     err <= 1;
    end
  end
endmodule

下面是仿真图形

aa.jpg

发送和接受匹配。。。。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条