還有半個多月就要過年了,工作之后時間過得真是飛快啊,才剛剛熟悉在各種文件上簽2018的日期,現(xiàn)在竟然又變成2019了。最郁悶的是又老了一歲,找誰說理去
大家都知道芯片有輸入輸出,根據(jù)不同的傳輸協(xié)議,輸入輸出的數(shù)據(jù)有可能是一串長長的數(shù)據(jù),幾十個或者幾百個byte甚至更多。在數(shù)據(jù)傳輸過程中,由于某些意外的原因?qū)е履承゜it出現(xiàn)錯誤(0變?yōu)?,或者1變?yōu)?),從而接受方接收到錯誤的數(shù)據(jù)。
為盡量提高接受方收到數(shù)據(jù)的正確率,在接收方接收數(shù)據(jù)后需要對數(shù)據(jù)進(jìn)行校驗(yàn),當(dāng)且僅當(dāng)校驗(yàn)的結(jié)果為正確時接收方才真正收下數(shù)據(jù)。循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check, CRC)算法通常用于數(shù)字傳輸系統(tǒng)或者存儲器中,用來檢測意外事件對原數(shù)據(jù)的影響,判斷接受到的數(shù)據(jù)是否正確。
下面是IC君文武雙全的朋友文武寫的CRC文章,IC君稍微做了優(yōu)化排版和少量的編輯工作提升大家的閱讀體驗(yàn)。
1
前言:
因?yàn)镃RC循環(huán)冗余校驗(yàn)碼的算法和硬件電路結(jié)構(gòu)比較簡單,所以CRC是一種在工程中常用的數(shù)據(jù)校驗(yàn)方法。盡管CRC簡單,但在工程應(yīng)用中還是有些問題會對工程師產(chǎn)生困惑。這篇文章將從以下三個方面介紹以下CRC,希望對大家有所幫助。
CRC 的數(shù)學(xué)原理;
CRC的通項(xiàng)公式,怎樣選取一個適合的通項(xiàng)公式;
CRC 硬件電路實(shí)現(xiàn),串行電路到并行電路的實(shí)現(xiàn)。
2
CRC的數(shù)學(xué)原理:
在講CRC的數(shù)學(xué)原理之前,首先看一下下面的圖。圖1是A要給B發(fā)送1bit的信息0或者1。假設(shè)A發(fā)
圖1
送一個0給B,系統(tǒng)正常的情況下B會接受到一個0。但是如果有個干擾(比如信號線的串?dāng)_)在A和B相連的傳輸線上,那么B就有可能接受到一個1,傳輸數(shù)據(jù)發(fā)生錯誤。
為了改進(jìn)這個傳輸過程,A和B約定(圖2)。
圖2
如果A要發(fā)送一個0給B,A就在一段時間連續(xù)發(fā)送兩個0(2’b00’)給B;
如果A要發(fā)送一個1信息給B,那么A就在一段時間連續(xù)發(fā)送兩個1(2’b11’)給B。
如果B接受了一個2’b01或者2’b10,B就知道他們之間有干擾;
要是B接受到了一個2’b00,B就會認(rèn)為A發(fā)送的信息是個0;
那么A有沒有可能發(fā)的信息是2個1?這也是有可能的,不過2’b00變成2’b11比1’b0變成1’b1的概率要低的多。
如果A和B約定以圖3的方式進(jìn)行傳輸,假設(shè)A要發(fā)送一個0給B,那么A就在一段時間連續(xù)發(fā)送3個0(3’b000)給B;如果A要發(fā)送一個1信息給B,那么A就在一段時間連續(xù)發(fā)送三個1(3’b111’)給B;
如果B接受到的值為3’b001、3’b010或者3’b100,B就知道他們之間有干擾,
圖3
并且B會自我判斷A給自己發(fā)送的信息是0不是1。這種判斷是合理的,因?yàn)檎`判的概率很低。
圖1,圖2,圖3可以概括成圖4。
圖4 箭頭上的數(shù)字是海明距(HD)
海明距離HD的定義
兩個碼字的對應(yīng)比特值不同(異或)的總數(shù)目稱為這兩個碼字的海明距離。一個有效編碼集中,任意兩個碼字的海明距離的最小值稱為該編碼集的海明距離。
圖4的第一種情況就是沒有編碼,0和1的碼距(HD海明距)是1;
第二種情況其實(shí)就是奇偶校驗(yàn),碼距是2,可以檢測1個錯誤;
第三種情況就是糾錯碼了,海明距是3,如果出現(xiàn)了1個錯誤是可以自己糾錯的,出現(xiàn)小于3個錯誤可以檢測。
第三種情況的有效碼字000,其中0是信息位,00是校驗(yàn)位,2位的校驗(yàn)碼來確定一位數(shù)據(jù)位,看上去有點(diǎn)太浪費(fèi)了。
一種編碼的校驗(yàn)和糾錯能力取決于它的海明距離。為檢測出d比特錯,需要使用碼距d+1的編碼;因?yàn)閐個單比特錯決不可能將一個有效的碼字轉(zhuǎn)變成另一個有效的碼字。當(dāng)接收方看到無效的碼字,它就能明白發(fā)生傳輸錯誤。
同樣,為了糾正d比特錯,必須使用碼距為2d+1的編碼,這是因?yàn)橛行Тa字的距離遠(yuǎn)到即使發(fā)生d個變化,這個發(fā)生了變化的碼字仍然比其它碼字都接近原始碼字。
通過上面的例子大家理解了碼字(CODEWORD),信息位(DATA),校驗(yàn)位(CHECK SUM),海明距(HD)等概念。
下面看一看圖5的CRC計算過程
圖5(來自wikipedia)
CRC在數(shù)學(xué)上就是除余運(yùn)算,除數(shù)是個通項(xiàng)公式(固定數(shù)),
例如G(X)=X3+X+1 (1011),
被除數(shù)11010011101100,除數(shù)1011
DATA=11010011101100,
最終得到的余數(shù) CHECK SUM=100,
所以需要傳輸?shù)腃ODEWORD=11010011101100100。
用上面CRC算法作為A和B的通信協(xié)議,傳輸數(shù)據(jù)只添加了3bit的checksum,編碼效率比圖2、圖3提高不少。但是編碼和解碼算法會變復(fù)雜,所以有得必有失吧。
具體傳輸過程如下:
A發(fā)送DATA=11010011101100給B,
發(fā)送之前先編碼
假設(shè)初始CODEWORD=11010011101100000
對G(X)=X3+X+1 (1011)除余數(shù),
最后用初始DATA加上CHECK SUM=100得到最終發(fā)送:
CODEWORD=11010011101100100。
在B接受到CODEWORD 通過解碼來檢查A的發(fā)送有沒有錯。
解碼的過程:
用CODEWORD=11010011101100100對G(X)=X3+X+1 (1011)除余數(shù),如果余數(shù)等于0即CHECK SUM=000,就認(rèn)為B接受到的數(shù)據(jù)就沒有問題。
圖6
余數(shù)等于0,就一定沒有出錯嗎?當(dāng)然不是,只能說出錯的概率很低。這個可靠性跟CRC的G(X)通項(xiàng)公式和信息位的長度相關(guān);
怎樣選取一個適合的CRC通項(xiàng)公式呢?
CRC通項(xiàng)公式(生成多項(xiàng)式)很容易找到,網(wǎng)上隨便一搜就會有很多。
圖7(來自wikipedia)
生成多項(xiàng)式有很多表示方法,CRC3多項(xiàng)式表示法G(X)=X3+X+1;數(shù)字表示法0x3、0x6、0x5等。數(shù)字表示法簡潔,在用軟件語言實(shí)現(xiàn)CRC算法時常用。
提醒一下:當(dāng)看到代碼poly=0x03,很難知道多項(xiàng)式是什么?因?yàn)閿?shù)字表示法沒有統(tǒng)一的定義,容易產(chǎn)生歧義。建議寫數(shù)字表示的時候附上多項(xiàng)式,這樣不會產(chǎn)生誤會;程序變量poly=0x03,最好后面是注釋G(X)=X3+X+1。
下面總結(jié)一下數(shù)字表示法圖8,CRC的最高位和最低位系數(shù)都有。這些表示法無非就是順序排列丟掉高位或者低位;或者逆序排列丟掉高位或者低位。
圖8
數(shù)字表示法這樣定義是為了遵循CRC的研究者的習(xí)慣。
CRC多項(xiàng)式的檢錯能力其實(shí)有很多研究成果,這里以koopman phail舉例,因?yàn)榭梢栽谧髡叩膫€人主頁上找到一些算好的數(shù)據(jù)。作者還是美國著名的卡內(nèi)基梅隆大學(xué)的Associate Porofesor。
在講他的成果之前,先還是給出一下一些概念。用圖6的CRC3的多項(xiàng)式 G(X)=X3+X+1編碼:
DATA=11010011101100,
CHECK SUM=100,
CODEWORD=11010011101100100。CRC3就3個校驗(yàn)位最多也就8個狀態(tài),要編碼的DATA=11010011101100有14位,總共就有2^14種可能的接受DATA,這么多的DATA肯定有很多校驗(yàn)位是相同的。
校驗(yàn)位CHECK SUM=100的DATA變成相同校驗(yàn)位但是數(shù)據(jù)不同的DATA1,在接受端是沒有辦法知道出錯了的。所以koopman phail就把“幾乎所有的多項(xiàng)式”做了統(tǒng)計,這些多項(xiàng)式隨信息位DATA的長度的變化對應(yīng)CRC多項(xiàng)式的海明距HD的關(guān)系。
圖9就是論文中的一張圖,虛線表示所有CRC8多項(xiàng)式的海明距的邊界,橫坐標(biāo)表示的信息數(shù)據(jù)的長度;縱坐標(biāo)表示誤碼率,誤碼率越小越好。
如果信息位是8bit以下,0x9C是比較好的多項(xiàng)式;
如果信息位是16bit到64bit之間, 0xEA和0x97都是比較好的多項(xiàng)式。
其實(shí)普通人也可以統(tǒng)計出來的,只要每個長度的DATA都窮舉所有的碼字空間再把它們的海明距找到就行。但是計算過程的運(yùn)算量還是很大的,作為工程師去查koopman phail給的表就好了。如果你還是不夠用,可以去koopman phail的主頁上去找。
圖10
現(xiàn)在根據(jù)圖10的表格來選個好的多項(xiàng)式,假設(shè)CRC需要檢測2(HD=3)錯誤,你的信息位DATA的長度是256bit那就選0x167多項(xiàng)式。
-
存儲器
+關(guān)注
關(guān)注
38文章
7484瀏覽量
163764 -
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1880瀏覽量
64558 -
crc
+關(guān)注
關(guān)注
0文章
199瀏覽量
29461
原文標(biāo)題:想知道數(shù)據(jù)傳輸?shù)恼_性?CRC算法來檢查
文章出處:【微信號:icstudy,微信公眾號:跟IC君一起學(xué)習(xí)集成電路】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論