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