數據校驗的基礎運算原理是模2運算,也就是異或運算。
簡單講述一下CRC的原理, CRC校準首先要確定一個多項式M(x), 例如
根據這個多項式的最高系數5, 在數據后補充5位0. 然后對新增0的數據進行模2除法。例如數據0010, 根據上式, M(x)可以寫成 110101。那么模2的最終結果為 11111,那么把這個運算結果替換為原先補充的5位0,這就是用于校驗的冗余碼。這樣輸出傳輸后,接收方利用同樣的多項式運算,得到的結果是0, 即數據沒有傳輸錯誤。
更多的CRC內容介紹可以網上查詢資料,此處不再贅述。
那么在高速通信中,數據以串行傳輸的方式在外部傳輸,但是在內部數據處理還是以并行數據為主。如何實現CRC硬件計算的并行化處理呢?
第一種方法,把運算過程實現,也就是輸入與對應的位數做異或。然后多次并行例化這個過程,把上一輪計算的結果作為下一次計算的輸入。運算結果的流程如下圖:
reg [5:0] lsfr_tmp [3:0] ;
genvar i;
generate for (i = 0; i < 4; i = i + 1) begin: cdc_cal
always @ (posedge clk or posedge rst) begin
if (rst) begin
lsfr_tmp[i] <= 'd0;
end
else if (i != 0) begin
lsfr_tmp[i][0] <= lsfr_tmp[i-1][4] ^ data[3-i];
lsfr_tmp[i][1] <= lsfr_tmp[i-1][0] ;
lsfr_tmp[i][2] <= lsfr_tmp[i-1][4] ^ data[3-i] ^ lsfr_tmp[i-1][1];
lsfr_tmp[i][3] <= lsfr_tmp[i-1][2] ;
lsfr_tmp[i][4] <= lsfr_tmp[i-1][4] ^ data[3-i] ^ lsfr_tmp[i-1][3];
end
else begin
lsfr_tmp[0] <= 'd0;
lsfr_tmp[0][0] <= data_in[3] ;
lsfr_tmp[0][2] <= data_in[3] ;
lsfr_tmp[0][4] <= data_in[3] ;
end
end
end
endgenerate
assign crc_out = lsfr_tmp[3] ;
這種方法確實可行,在中間插入流水線的話,數據的吞吐率應該也不小。
但我們還有第二種方法,根據多項式的LSFR,推導參考資料[1]可以自動生成Verilog代碼如下,得出最終的冗余碼與輸入和多項式之間的映射關系。
還是以4 bits的數據輸入和上面的多項式為例,根據得到的verilog CRC并行化代碼如下,它的輸出與上一次的CRC冗余碼也存在關系:
//-----------------------------------------------------------------------------
// CRC module for data[3:0] , crc[4:0]=1+x^2+x^4+x^5;
//-----------------------------------------------------------------------------
module crc(
input [3:0] data_in,
input crc_en,
output [4:0] crc_out,
input rst,
input clk);
reg [4:0] lfsr_q,lfsr_c;
assign crc_out = lfsr_q;
always @(*) begin
lfsr_c[0] = lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[3] ^ data_in[0] ^ data_in[1] ^ data_in[2];
lfsr_c[1] = lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[4] ^ data_in[1] ^ data_in[2] ^ data_in[3];
lfsr_c[2] = lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[4] ^ data_in[0] ^ data_in[1] ^ data_in[3];
lfsr_c[3] = lfsr_q[2] ^ lfsr_q[3] ^ data_in[1] ^ data_in[2];
lfsr_c[4] = lfsr_q[0] ^ lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[4] ^ data_in[0] ^ data_in[1] ^ data_in[3];
end // always
always @(posedge clk, posedge rst) begin
if(rst) begin
lfsr_q <= {5{1'b1}};
end
else begin
lfsr_q <= crc_en ? lfsr_c : lfsr_q;
end
end // always
endmodule // crc
那么它們之間的關系是如何得出的呢?根據參考資料2 提供的資料來看,關系的得出如下。
首先,輸入的數據以及多項式的值會影響輸出的結果。
其次,整個過程是模2運算,也就是非0即1。那么,可以把輸入數據和多項式對數據結果的影響分開計算,最后整合。且我們可以用獨熱碼的形式計算輸入的每一位對輸出的影響。
因此,首先考慮輸入數據對結果的影響,將多項式的初始數值設為0;輸入數據分別設為0001, 0010, 0100, 1000. 帶入到上圖的LFSR中計算,最后得到的輸出數據為:
然后,設輸入數據為0000, 多項式的初始數值為00001, 00010, 00100, 01000, 10000;帶入LFSR中計算,得到的輸出數據為:
根據上述的兩表,可得out[0]跟輸入數據0,1,2 bit以及多項式的1,2,3bit有關。因此做異或運算;然后依次類推,得到了所有的映射關系。然后就可以得到上述Verilog中lfsr的運算關系了。
當然,如果你的CRC的多項式初始數值默認為0,即與之前的CRC校驗冗余碼無關,那么其實可以不用計算多項式數值的情況,只看第一個表。現在拿第一個表的對應關系,計算下0010的冗余碼。就是11111.
-
CRC校驗
+關注
關注
0文章
84瀏覽量
15277 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8309 -
LSFR算法
+關注
關注
0文章
2瀏覽量
1078
發布評論請先 登錄
相關推薦
在Virtex-5 FPGA中使用CRC硬模塊
Xmodem協議中CRC算法的FPAG實現
![Xmodem協議中<b class='flag-5'>CRC</b>算法的FPAG<b class='flag-5'>實現</b>](https://file.elecfans.com/web2/M00/49/5A/pYYBAGKhtEiAUVAzAAAKTtZZEA8603.jpg)
一種基于矩陣的并行CRC校驗算法
![一種基于矩陣的<b class='flag-5'>并行</b><b class='flag-5'>CRC</b>校驗算法](https://file.elecfans.com/web2/M00/49/3A/poYBAGKhwJGASCjGAAAL6K4cbDI904.jpg)
基于CRC-32并行在千兆以太網中應用
![基于<b class='flag-5'>CRC</b>-32<b class='flag-5'>并行</b>在千兆以太網中應用](https://file.elecfans.com/web2/M00/49/52/poYBAGKhwKCAal9dAAARyq-L1jE907.jpg)
基于FPGA的并行CRC算法的UART控制器
![基于FPGA的<b class='flag-5'>并行</b><b class='flag-5'>CRC</b>算法的UART控制器](https://file1.elecfans.com//web2/M00/A6/EC/wKgZomUMQUeAC4BlAABvHzYVHys801.png)
基于Matlab和GPU的BESO方法的全流程并行計算策略
![基于Matlab和GPU的BESO<b class='flag-5'>方法</b>的全流程<b class='flag-5'>并行</b>計算策略](https://file.elecfans.com/web2/M00/49/82/poYBAGKhwMCAAxNxAAAY330dOX0373.jpg)
如何使用FPGA實現32位并行數據的CRC16編碼器
![如何使用FPGA<b class='flag-5'>實現</b>32位<b class='flag-5'>并行</b>數據的<b class='flag-5'>CRC</b>16編碼器](https://file.elecfans.com/web1/M00/E4/3F/o4YBAGBIfH-ASaBSAACLrqL5c0c918.png)
使用FPGA實現高速CRC并行算法的設計研究
![使用FPGA<b class='flag-5'>實現</b>高速<b class='flag-5'>CRC</b><b class='flag-5'>并行</b>算法的設計研究](https://file.elecfans.com/web1/M00/E6/D2/pIYBAGBZnpOAMH0pAADyE5UKRlA406.png)
并行CRC電路HDL代碼的快速生成
![<b class='flag-5'>并行</b><b class='flag-5'>CRC</b>電路HDL代碼的快速生成](https://file.elecfans.com/web1/M00/E7/9F/pIYBAGBf3J2AZgEGAABVqU4DXv4074.jpg)
USB數據傳輸中CRC校驗碼的并行算法實現
![USB數據傳輸中<b class='flag-5'>CRC</b>校驗碼的<b class='flag-5'>并行</b>算法<b class='flag-5'>實現</b>](https://file.elecfans.com/web1/M00/E7/9F/pIYBAGBf3QOAM9ByAAA7IBcPm3s194.jpg)
CRC校驗碼并行計算的FPGA實現
![<b class='flag-5'>CRC</b>校驗碼<b class='flag-5'>并行</b>計算的FPGA<b class='flag-5'>實現</b>](https://file.elecfans.com/web1/M00/E7/26/o4YBAGBf3YOAasnvAABj5JK-a4U654.jpg)
關于STM32F4xx的硬件CRC32校驗
![<b class='flag-5'>關于</b>STM32F4xx的<b class='flag-5'>硬件</b><b class='flag-5'>CRC</b>32校驗](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論