這一篇文章聊一聊CRC算法的硬件電路實(shí)現(xiàn):串行電路和并行電路。
下面的內(nèi)容還是IC君的朋友文武寫的,IC君稍微做了優(yōu)化排版和少量的編輯工作提升大家的閱讀體驗(yàn)。
1
CRC硬件電路的實(shí)現(xiàn)很簡單,下圖給出教科書上任意生成多項(xiàng)式G(X)=gnXn+gn-1Xn-1+···+g1X+g0的電路結(jié)構(gòu):
為什么從右邊輸入data?
因?yàn)镃RC是除余數(shù),所以從右邊輸入數(shù)據(jù),相當(dāng)于把信息位data先左移位。
以簡單的CRC8舉例,多項(xiàng)式G(x)=X8 +X7 +X6 +X4 +X2 +1 的電路示意圖如下:
對應(yīng)的Verilog code代碼如下:
上面的Verilog code上用了LFSR這種變量聲明,有沒有感到奇怪?
LFSR(線性移位寄存器)和CRC的算法很像的,有興趣的可去看看LFSR的相關(guān)知識。
一位串行輸入的CRC電路實(shí)現(xiàn)方法很簡單,每周期的組合邏輯鏈路簡單延時短。它的缺點(diǎn)是輸入位寬只有一位,所以一個clock周期只能算一位,如果是64bit的信息位就要64個clock周期。如果需要傳輸?shù)奈粩?shù)比較多,會對系統(tǒng)的性能產(chǎn)生比較大的影響。
假設(shè)要把輸入位寬變成8位(byte)輸入,電路將是什么樣的呢?并行的CRC其實(shí)也簡單,可以用提前抽取的概念來實(shí)現(xiàn)。
用下圖來解釋一下,CRCM有M個校驗(yàn)位就是有M個寄存器,現(xiàn)在把輸入變成N位。
提前抽取就是通過關(guān)系函數(shù)得到下一個clock寄存器的輸入nxt_crc[M-1:0]:
關(guān)系函數(shù)CN如下:
nxt_crc=CN(crc_out,data),
crc_out是前一個clock的寄存器輸出;
data是當(dāng)前的輸入數(shù)據(jù);
函數(shù)CN就是一個組合邏輯網(wǎng)絡(luò),也可叫做所謂的scramble。怎樣得出這個CN呢?如果數(shù)字信號處理學(xué)的好,可以去推導(dǎo)一下。網(wǎng)上有各種算法,很多很多。下面介紹一種方法。
2
以CRC8,G(x)=X8 +X7 +X6 +X4 +X2 +1為例子產(chǎn)生一個CRC8_8的CN,下面直接給出CRC8_8的Verilog code,后面講怎么得到這個CN。
上面的Verilog code 的代碼是由下面的矩陣得出的
把N_in作為數(shù)據(jù),M_in作為CRC的上一個clock的值就有:
LFSR_S[0] =DATA[0]^DATA[1]^DATA[3]^DATA[6]^DATA[7]^LFSR_N[0]^LFSR_N[1]^LFSR_N[3]^LFSR_N[6]^LFSR_N[7];
怎么獲得這個矩陣呢?
CRCM_N(M_in,N_in)= CRCM_N(M_in,0)+ CRCM_N(0,N_in)
可以用crc8_parallel(N_in):輸入data_in 的是8‘b00000001,得到crc8的值,就是H1的第一行8’hd5;輸入data_in 的是8‘b00000010,得到crc8的值,就是H1的第二行8’h7f;以此類推。計(jì)算出上面矩陣H1=[]NxM。計(jì)算H2=[]MxM的方法和H1是一樣的。
有上面的矩陣就有CN函數(shù)。有了CN就可很容易得出CRC硬件電路了。上面的方法其實(shí)可寫成一個腳本,實(shí)現(xiàn)任意多項(xiàng)式任意位寬輸入的并行CRC硬件電路。www.OutputLogic.com 有自動生成器,不過大家最好自己寫一寫。提醒:上面有LSB和MSB誰先輸入到并行CRC里面去的問題?琢磨一下吧!
-
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124523 -
CRC算法
+關(guān)注
關(guān)注
0文章
15瀏覽量
8957 -
串行電路
+關(guān)注
關(guān)注
0文章
2瀏覽量
6412
原文標(biāo)題:CRC算法的硬件電路實(shí)現(xiàn):串行電路和并行電路
文章出處:【微信號:icstudy,微信公眾號:跟IC君一起學(xué)習(xí)集成電路】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
從焊接角度聊一聊,設(shè)計(jì)PCB的5個建議

聊一聊stm32的低功耗調(diào)試
聊一聊平衡小車代碼的實(shí)現(xiàn)
Xmodem協(xié)議中CRC算法的FPAG實(shí)現(xiàn)

基于SATAⅡ協(xié)議的CRC32并行算法的研究

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

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

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

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

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

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

評論