2015-11-03 328 views
-1

我有8位输入数据,我必须计算输入字节的累积CRC-16。请帮助我生成CRC的verilog代码-16代与多项式0x8408。16位CRC生成与8408 8位输入数据verilog中的polisomial

function bit [15:0] ecc::cal_crc(input bit [31:0] data[$]); 
bit [15:0] rCRC = 16'hFFFF; 
bit [31:0] payload; 
begin 
foreach(data[i]) 
begin 
    payload = data[i]; 
    rCRC[0] = rCRC[0]^rCRC[4]^rCRC[5]^rCRC[6]^rCRC[10]^rCRC[12] 
      ^rCRC[13]^payload[0]^payload[1]^payload[1]^payload[2] 
      ^payload[2]^payload[4]^payload[5]^payload[6]^payload[8] 
     ^payload[8]^payload[9]^payload[9]^payload[10]^payload[12] 
    ^payload[13]^payload[16]^payload[16]^payload[17]^payload[17] 
     ^payload[20]^payload[21]^payload[24]^payload[28]; 
    rCRC[1] = rCRC[0]^rCRC[1]^rCRC[5]^rCRC[6]^rCRC[7]^rCRC[11]^ rCRC[13]^rCRC[14]        ^payload[0]^payload[1]^payload[2]^payload[2]^payload[3]^payload[3]^payload[5]^payload[6]^payload[7]^payload[9]^payload[9]^payload[10]^payload[10]^payload[11]^payload[13]^payload[14]^payload[17]^payload[17]^payload[18]^payload[18]^payload[21]^payload[22]^payload[25]^payload[29]; 
    rCRC[2] = rCRC[1]^rCRC[2]^rCRC[6]^rCRC[7]^rCRC[8]^rCRC[12]^rCRC[14]^rCRC[15]        ^payload[1]^payload[2]^payload[3]^payload[3]^payload[4]^payload[4]^payload[6]^payload[7]^payload[8]^payload[10]^payload[10]^payload[11]^payload[11]^payload[12]^payload[14]^payload[15]^payload[18]^payload[18]^payload[19]^payload[19]^payload[22]^payload[23]^payload[26]^payload[30]; 
    rCRC[3] = rCRC[0]^rCRC[2]^rCRC[3]^rCRC[7]^rCRC[8]^rCRC[9]^rCRC[13]^rCRC[15]        ^payload[0]^payload[2]^payload[3]^payload[4]^payload[4]^payload[5]^payload[5]^payload[7]^payload[8]^payload[9]^payload[11]^payload[11]^payload[12]^payload[12]^payload[13]^payload[15]^payload[16]^payload[19]^payload[19]^payload[20]^payload[20]^payload[23]^payload[24]^payload[27]^payload[31]; 
    rCRC[4] = rCRC[0]^rCRC[1]^rCRC[3]^rCRC[5]^rCRC[6]^rCRC[8]^rCRC[9]^rCRC[12]^rCRC[13]^rCRC[14]   ^payload[0]^payload[1]^payload[1]^payload[1]^payload[2]^payload[2]^payload[3]^payload[4]^payload[4]^payload[5]^payload[5]^payload[5]^payload[6]^payload[8]^payload[9]^payload[9]^payload[9]^payload[10]^payload[10]^payload[12]^payload[13]^payload[14]^payload[16]^payload[17]^payload[20]^payload[21]^payload[25]; 
    rCRC[5] = rCRC[0]^rCRC[1]^rCRC[2]^rCRC[4]^rCRC[6]^rCRC[7]^rCRC[9]^rCRC[10]^rCRC[13]^rCRC[14]^rCRC[15]^payload[0]^payload[1]^payload[2]^payload[2]^payload[2]^payload[3]^payload[3]^payload[4]^payload[5]^payload[5]^payload[6]^payload[6]^payload[6]^payload[7]^payload[9]^payload[10]^payload[10]^payload[10]^payload[11]^payload[11]^payload[13]^payload[14]^payload[15]^payload[17]^payload[18]^payload[21]^payload[22]^payload[26]; 
    rCRC[6] = rCRC[1]^rCRC[2]^rCRC[3]^rCRC[5]^rCRC[7]^rCRC[8]^rCRC[10]^rCRC[11]^rCRC[14]^rCRC[15]   ^payload[0]^payload[0]^payload[1]^payload[2]^payload[3]^payload[3]^payload[3]^payload[4]^payload[4]^payload[5]^payload[6]^payload[6]^payload[7]^payload[7]^payload[7]^payload[8]^payload[10]^payload[11]^payload[11]^payload[11]^payload[12]^payload[12]^payload[14]^payload[15]^payload[16]^payload[18]^payload[19]^payload[22]^payload[23]^payload[27]; 
    rCRC[7] = rCRC[0]^rCRC[2]^rCRC[3]^rCRC[4]^rCRC[6]^rCRC[8]^rCRC[9]^rCRC[11]^rCRC[12]^rCRC[15]   ^payload[0]^payload[0]^payload[0]^payload[1]^payload[1]^payload[2]^payload[3]^payload[4]^payload[4]^payload[4]^payload[5]^payload[5]^payload[6]^payload[7]^payload[7]^payload[8]^payload[8]^payload[8]^payload[9]^payload[11]^payload[12]^payload[12]^payload[12]^payload[13]^payload[13]^payload[15]^payload[16]^payload[17]^payload[19]^payload[20]^payload[23]^payload[24]^payload[28]; 
    rCRC[8] = rCRC[1]^rCRC[3]^rCRC[4]^rCRC[5]^rCRC[7]^rCRC[9]^rCRC[10]^rCRC[12]^rCRC[13]      ^payload[0]^payload[0]^payload[1]^payload[1]^payload[1]^payload[2]^payload[2]^payload[3]^payload[4]^payload[5]^payload[5]^payload[5]^payload[6]^payload[6]^payload[7]^payload[8]^payload[8]^payload[9]^payload[9]^payload[9]^payload[10]^payload[12]^payload[13]^payload[13]^payload[13]^payload[14]^payload[14]^payload[16]^payload[17]^payload[18]^payload[20]^payload[21]^payload[24]^payload[25]^payload[29]; 
    rCRC[9] = rCRC[2]^rCRC[4]^rCRC[5]^rCRC[6]^rCRC[8]^rCRC[10]^rCRC[11]^rCRC[13]^rCRC[14]      ^payload[0]^payload[0]^payload[1]^payload[1]^payload[2]^payload[2]^payload[2]^payload[3]^payload[3]^payload[4]^payload[5]^payload[6]^payload[6]^payload[6]^payload[7]^payload[7]^payload[8]^payload[9]^payload[9]^payload[10]^payload[10]^payload[10]^payload[11]^payload[13]^payload[14]^payload[14]^payload[14]^payload[15]^payload[15]^payload[17]^payload[18]^payload[19]^payload[21]^payload[22]^payload[25]^payload[26]^payload[30]; 
    rCRC[10] = rCRC[0]^rCRC[3]^rCRC[5]^rCRC[6]^rCRC[7]^rCRC[9]^rCRC[11]^rCRC[12]^rCRC[14]^rCRC[15]   ^payload[0]^payload[1]^payload[1]^payload[2]^payload[2]^payload[3]^payload[3]^payload[3]^payload[4]^payload[4]^payload[5]^payload[6]^payload[7]^payload[7]^payload[7]^payload[8]^payload[8]^payload[9]^payload[10]^payload[10]^payload[11]^payload[11]^payload[11]^payload[12]^payload[14]^payload[15]^payload[15]^payload[15]^payload[16]^payload[16]^payload[18]^payload[19]^payload[20]^payload[22]^payload[23]^payload[26]^payload[27]^payload[31]; 
    rCRC[11] = rCRC[0]^rCRC[1]^rCRC[5]^rCRC[7]^rCRC[8]^rCRC[15]              ^payload[0]^payload[1]^payload[3]^payload[3]^payload[4]^payload[4]^payload[5]^payload[7]^payload[8]^payload[11]^payload[11]^payload[12]^payload[12]^payload[15]^payload[16]^payload[19]^payload[23]^payload[27]; 
    rCRC[12] = rCRC[0]^rCRC[1]^rCRC[2]^rCRC[6]^rCRC[8]^rCRC[9]              ^payload[0]^payload[1]^payload[2]^payload[4]^payload[4]^payload[5]^payload[5]^payload[6]^payload[8]^payload[9]^payload[12]^payload[12]^payload[13]^payload[13]^payload[16]^payload[17]^payload[20]^payload[24]^payload[28]; 
    rCRC[13] = rCRC[1]^rCRC[2]^rCRC[3]^rCRC[7]^rCRC[9]^rCRC[10]              ^payload[1]^payload[2]^payload[3]^payload[5]^payload[5]^payload[6]^payload[6]^payload[7]^payload[9]^payload[10]^payload[13]^payload[13]^payload[14]^payload[14]^payload[17]^payload[18]^payload[21]^payload[25]^payload[29]; 
    rCRC[14] = rCRC[2]^rCRC[3]^rCRC[4]^rCRC[8]^rCRC[10]^rCRC[11]              ^payload[0]^payload[0]^payload[2]^payload[3]^payload[4]^payload[6]^payload[6]^payload[7]^payload[7]^payload[8]^payload[10]^payload[11]^payload[14]^payload[14]^payload[15]^payload[15]^payload[18]^payload[19]^payload[22]^payload[26]^payload[30]; 
    rCRC[15] = rCRC[3]^rCRC[4]^rCRC[5]^rCRC[9]^rCRC[11]^rCRC[12]              ^payload[0]^payload[0]^payload[1]^payload[1]^payload[3]^payload[4]^payload[5]^payload[7]^payload[7]^payload[8]^payload[8]^payload[9]^payload[11]^payload[12]^payload[15]^payload[15]^payload[16]^payload[16]^payload[19]^payload[20]^payload[23]^payload[27]^payload[31]; 
end 
cal_crc = rCRC; 
end 
endfunction 

这是在我的系统verilog设计。我驾驶4个字节的数据; 32'h000000B0。预期的结果是62BD但我得到了56F1

任何人都可以建议我解决这个问题吗?

+0

到目前为止你做了什么? – e19293001

+1

你需要先显示你的努力。那么只有人可以帮助你。 – ssgr

+0

请阅读http://stackoverflow.com/help/how-to-ask这将帮助您重新解释您的问题,以便您可以得到可能的答案。 –

回答

0

生成CRC计算器代码在跟踪哪些位的输入和先前的CRC值进入结果CRC值的每个位时都是(几乎)平凡的练习,并且通过对输入数据字的每个位迭代CRC位来实现。您可以使用您认识的任何编程语言来创建脚本,以便为您生成所需CRC生成器的verilog代码。

有一些陷阱,不管怎样:

  1. CRC寄存器转移的方向 - 可以向左或向右
  2. 数据字进入CRC的方式位:可能是最显著位第一或最重要的第一。
  3. 数据字的字节方式进入CRC(如果数据字中有8位以上) - 最重要或最不重要的字节在前。
  4. CRC寄存器的初始值(通常全为1)
  5. CRC计算后CRC值的变化:可能是某种方式的反转或位反转,例如以太网CRC兼有。

对于宽数据字的情况,有2个流水线的流水线可能是有利可图的,首先是预先存储数据字,然后将xor全部一起存入CRC寄存器。这样,CRC寄存器的每一位都只能从单个预先存储的数据位输入。

+0

这里还有我的crc生成脚本的输出:http://pastebin.com/HyNKAKYT – lvd

0

我试着用下面的代码,它对我很好,

function bit [15:0] cal_16crc(input bit [7:0] pkt_bytes[$]); 
     reg [7:0] d; 
     bit int_lsb; 
     reg [15:0] c = 16'hFFFF; 
     reg [15:0] newcrc; 
    begin 
    foreach(pkt_bytes[i]) 
    begin  
      d = pkt_bytes[i]; //Data; 
      $display("DATA:%0h",d); 

     c = c^d; 
     for(int i=0;i<8;i++) 
     begin 
      int_lsb = c & 16'h0001; 
      c = c >> 1; 
      c = c & 16'h7FFF; 
      if(int_lsb == 1) 
      c = c^16'h8408; 
     end 

    end 
    newcrc[7:0] = c & 16'h00FF; 
    newcrc[15:8] = (c >> 8) & 16'h00FF; 
    cal_16crc = newcrc; 
    end 

    endfunction 

There is certain condition that the data will be driven from LSB to MSB. 
Hope this may helpful to others. 

thanks, 
mahesh