0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于CRC硬件并行化運(yùn)算的實(shí)現(xiàn)方法的探討

冬至子 ? 來源:Bug記錄 ? 作者:woodfan ? 2023-06-20 15:27 ? 次閱讀

數(shù)據(jù)校驗(yàn)的基礎(chǔ)運(yùn)算原理是模2運(yùn)算,也就是異或運(yùn)算。

簡單講述一下CRC的原理, CRC校準(zhǔn)首先要確定一個多項(xiàng)式M(x), 例如

1.jpg

根據(jù)這個多項(xiàng)式的最高系數(shù)5, 在數(shù)據(jù)后補(bǔ)充5位0. 然后對新增0的數(shù)據(jù)進(jìn)行模2除法。例如數(shù)據(jù)0010, 根據(jù)上式, M(x)可以寫成 110101。那么模2的最終結(jié)果為 11111,那么把這個運(yùn)算結(jié)果替換為原先補(bǔ)充的5位0,這就是用于校驗(yàn)的冗余碼。這樣輸出傳輸后,接收方利用同樣的多項(xiàng)式運(yùn)算,得到的結(jié)果是0, 即數(shù)據(jù)沒有傳輸錯誤。

圖片

更多的CRC內(nèi)容介紹可以網(wǎng)上查詢資料,此處不再贅述。

那么在高速通信中,數(shù)據(jù)以串行傳輸?shù)姆绞皆谕獠總鬏?,但是在?nèi)部數(shù)據(jù)處理還是以并行數(shù)據(jù)為主。如何實(shí)現(xiàn)CRC硬件計(jì)算的并行化處理呢?

第一種方法,把運(yùn)算過程實(shí)現(xiàn),也就是輸入與對應(yīng)的位數(shù)做異或。然后多次并行例化這個過程,把上一輪計(jì)算的結(jié)果作為下一次計(jì)算的輸入。運(yùn)算結(jié)果的流程如下圖:

圖片

轉(zhuǎn)成Verilog如下,僅作為一個例子,未仿真驗(yàn)證過:

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] ;

這種方法確實(shí)可行,在中間插入流水線的話,數(shù)據(jù)的吞吐率應(yīng)該也不小。

但我們還有第二種方法,根據(jù)多項(xiàng)式的LSFR,推導(dǎo)參考資料[1]可以自動生成Verilog代碼如下,得出最終的冗余碼與輸入和多項(xiàng)式之間的映射關(guān)系。

還是以4 bits的數(shù)據(jù)輸入和上面的多項(xiàng)式為例,根據(jù)得到的verilog CRC并行化代碼如下,它的輸出與上一次的CRC冗余碼也存在關(guān)系:

//-----------------------------------------------------------------------------
// 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

那么它們之間的關(guān)系是如何得出的呢?根據(jù)參考資料2 提供的資料來看,關(guān)系的得出如下。

首先,輸入的數(shù)據(jù)以及多項(xiàng)式的值會影響輸出的結(jié)果。

其次,整個過程是模2運(yùn)算,也就是非0即1。那么,可以把輸入數(shù)據(jù)和多項(xiàng)式對數(shù)據(jù)結(jié)果的影響分開計(jì)算,最后整合。且我們可以用獨(dú)熱碼的形式計(jì)算輸入的每一位對輸出的影響。

因此,首先考慮輸入數(shù)據(jù)對結(jié)果的影響,將多項(xiàng)式的初始數(shù)值設(shè)為0;輸入數(shù)據(jù)分別設(shè)為0001, 0010, 0100, 1000. 帶入到上圖的LFSR中計(jì)算,最后得到的輸出數(shù)據(jù)為:

1.jpg

然后,設(shè)輸入數(shù)據(jù)為0000, 多項(xiàng)式的初始數(shù)值為00001, 00010, 00100, 01000, 10000;帶入LFSR中計(jì)算,得到的輸出數(shù)據(jù)為:

1.jpg

根據(jù)上述的兩表,可得out[0]跟輸入數(shù)據(jù)0,1,2 bit以及多項(xiàng)式的1,2,3bit有關(guān)。因此做異或運(yùn)算;然后依次類推,得到了所有的映射關(guān)系。然后就可以得到上述Verilog中l(wèi)fsr的運(yùn)算關(guān)系了。

當(dāng)然,如果你的CRC的多項(xiàng)式初始數(shù)值默認(rèn)為0,即與之前的CRC校驗(yàn)冗余碼無關(guān),那么其實(shí)可以不用計(jì)算多項(xiàng)式數(shù)值的情況,只看第一個表?,F(xiàn)在拿第一個表的對應(yīng)關(guān)系,計(jì)算下0010的冗余碼。就是11111.

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • CRC校驗(yàn)
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    15149
  • Verilog語言
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    8192
  • LSFR算法
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1044
收藏 人收藏

    評論

    相關(guān)推薦

    Verilog并行CRC校驗(yàn)

    Verilog并行CRC校驗(yàn)
    發(fā)表于 08-20 21:52

    在Virtex-5 FPGA中使用CRC硬模塊

    作為硬莫塊提供的CRC模塊可加速檢錯進(jìn)程 CRC計(jì)算所依據(jù)的原理,并且探討用線性反饋移位寄存器實(shí)現(xiàn)硬件
    發(fā)表于 06-18 10:04 ?21次下載

    Xmodem協(xié)議中CRC算法的FPAG實(shí)現(xiàn)

    基于解決Xmodem協(xié)議中CRC校驗(yàn)的目的,以經(jīng)典的LFSR硬件電路為基礎(chǔ),采用了按字節(jié)并行運(yùn)算CRC校驗(yàn)碼,以及多字節(jié)CRC算法的
    發(fā)表于 05-07 15:29 ?47次下載
    Xmodem協(xié)議中<b class='flag-5'>CRC</b>算法的FPAG<b class='flag-5'>實(shí)現(xiàn)</b>

    一種基于矩陣的并行CRC校驗(yàn)算法

    串行編碼原理得到8 位并行數(shù)據(jù)的CRC 校驗(yàn)矩陣,之后對矩陣進(jìn)行迭代簡化,得到32 位并行數(shù)據(jù)的參數(shù)矩陣,此參數(shù)矩陣作為該CRC 算法的核心實(shí)現(xiàn)
    發(fā)表于 10-30 16:39 ?3次下載
    一種基于矩陣的<b class='flag-5'>并行</b><b class='flag-5'>CRC</b>校驗(yàn)算法

    基于CRC-32并行在千兆以太網(wǎng)中應(yīng)用

    。CRC實(shí)現(xiàn)方式分為串行方式和并行方式,由于并行方式一個時(shí)鐘周期內(nèi)可以處理8個bit,與千兆以太網(wǎng)的C;MIl接口協(xié)議相符合,故千兆以太網(wǎng)的CRC
    發(fā)表于 11-13 14:20 ?12次下載
    基于<b class='flag-5'>CRC</b>-32<b class='flag-5'>并行</b>在千兆以太網(wǎng)中應(yīng)用

    基于FPGA的并行CRC算法的UART控制器

    基于串行異步收發(fā)器(UART)的通信中經(jīng)常用到循環(huán)冗余校驗(yàn)(CRC),常見的CRC校驗(yàn)電路多為串行校驗(yàn),校驗(yàn)所需時(shí)鐘周期較多,基于查找表或輸入矩陣轉(zhuǎn)換的并行算法,需要存儲余數(shù)表,占用大量的硬件
    發(fā)表于 11-18 11:24 ?1974次閱讀
    基于FPGA的<b class='flag-5'>并行</b><b class='flag-5'>CRC</b>算法的UART控制器

    基于Matlab和GPU的BESO方法的全流程并行計(jì)算策略

    針對傳統(tǒng)并行計(jì)算方法實(shí)現(xiàn)結(jié)構(gòu)拓?fù)鋬?yōu)化快速計(jì)算的硬件成本高、程序開發(fā)效率低的問題,提出了一種基于Matlab和圖形處理器(GPU)的雙向漸進(jìn)結(jié)構(gòu)優(yōu)化(BESO)方法的全流程
    發(fā)表于 12-21 15:04 ?2次下載
    基于Matlab和GPU的BESO<b class='flag-5'>方法</b>的全流程<b class='flag-5'>并行</b>計(jì)算策略

    如何使用FPGA實(shí)現(xiàn)32位并行數(shù)據(jù)的CRC16編碼器

    在數(shù)據(jù)通信中, 提高數(shù)據(jù)在通信中的可靠性,以及快速的數(shù)據(jù)處理能力一直是人們所追求的,循環(huán)冗余校驗(yàn)CRC就是一種廣泛采用的差錯控制方法,也是一種最常用的信道編碼方法。在介紹CRC碼原理之
    發(fā)表于 03-10 15:50 ?14次下載
    如何使用FPGA<b class='flag-5'>實(shí)現(xiàn)</b>32位<b class='flag-5'>并行</b>數(shù)據(jù)的<b class='flag-5'>CRC</b>16編碼器

    使用FPGA實(shí)現(xiàn)高速CRC并行算法的設(shè)計(jì)研究

    的高速CRC并行吏現(xiàn)遞推公式,可適用于并行處理位寬小于等于生成多項(xiàng)式階數(shù)和大于生成多項(xiàng)式階數(shù)條件下的并行幀校驗(yàn)應(yīng)用。最后分別設(shè)計(jì)了這2種條件下的硬件
    發(fā)表于 03-23 15:44 ?13次下載
    使用FPGA<b class='flag-5'>實(shí)現(xiàn)</b>高速<b class='flag-5'>CRC</b><b class='flag-5'>并行</b>算法的設(shè)計(jì)研究

    并行CRC電路HDL代碼的快速生成

    CRC校驗(yàn)的實(shí)現(xiàn)基于串行位移寄存器,如果要處理并行數(shù)據(jù),需要對電路進(jìn)行改進(jìn)。本文介紹了一種并行CRC電路HDL代碼的快速生成鐘算法,只需要帶
    發(fā)表于 03-28 09:29 ?16次下載
    <b class='flag-5'>并行</b><b class='flag-5'>CRC</b>電路HDL代碼的快速生成

    USB數(shù)據(jù)傳輸中CRC校驗(yàn)碼的并行算法實(shí)現(xiàn)

    文章介紹了用于 USB 總線數(shù)據(jù)傳輸?shù)?b class='flag-5'>CRC 校驗(yàn)的原理和算法,并且采用并行電路實(shí)現(xiàn) USB2.0 中的 CRC產(chǎn)生和CRC校驗(yàn),與傳統(tǒng)的串
    發(fā)表于 03-28 09:32 ?11次下載
    USB數(shù)據(jù)傳輸中<b class='flag-5'>CRC</b>校驗(yàn)碼的<b class='flag-5'>并行</b>算法<b class='flag-5'>實(shí)現(xiàn)</b>

    CRC校驗(yàn)碼并行計(jì)算的FPGA實(shí)現(xiàn)

    用軟件實(shí)現(xiàn) CRC 校驗(yàn)碼計(jì)算很難滿足高速數(shù)據(jù)通信的要求 ,基于硬件實(shí)現(xiàn)方法中 ,有串行經(jīng)典算法 LFSR 電路 以及由軟件算法推導(dǎo)出來的
    發(fā)表于 03-28 09:34 ?30次下載
    <b class='flag-5'>CRC</b>校驗(yàn)碼<b class='flag-5'>并行</b>計(jì)算的FPGA<b class='flag-5'>實(shí)現(xiàn)</b>

    關(guān)于STM32F4xx的硬件CRC32校驗(yàn)

    關(guān)于STM32F4xx的硬件CRC32校驗(yàn)一、概述前段時(shí)間由于項(xiàng)目所需,要對MCU上某些數(shù)據(jù)進(jìn)行CRC32校驗(yàn),MCU選用的是STM32F4系列,以前看到過STM32有
    發(fā)表于 12-03 15:51 ?19次下載
    <b class='flag-5'>關(guān)于</b>STM32F4xx的<b class='flag-5'>硬件</b><b class='flag-5'>CRC</b>32校驗(yàn)

    一種并行CRC計(jì)算的通用算法及其實(shí)現(xiàn)

    摘要:本文從一已提出的通用數(shù)學(xué)表達(dá)式出發(fā),研究了一種并行循環(huán)冗余校驗(yàn)(CRC)計(jì)算的新算法,該算法是一種迭代算法,可以逐步更新校驗(yàn)序列,適用于CRC計(jì)算的各種參數(shù)選擇。這一算法適合硬件
    發(fā)表于 02-21 09:45 ?0次下載

    N32G45x硬件CRC計(jì)算Modbus的CRC16

    以前都是使用軟件CRC,浪費(fèi)計(jì)算時(shí)間,有硬件CRC不用,真是可惜。本次使用硬件CRC對ModBus的CR
    的頭像 發(fā)表于 10-16 15:01 ?903次閱讀
    N32G45x<b class='flag-5'>硬件</b><b class='flag-5'>CRC</b>計(jì)算Modbus的<b class='flag-5'>CRC</b>16