2015-11-03 44 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