基于FPGA的CRC編解碼器設(shè)計(jì)說明書
基于FPGA的CRC編解碼器設(shè)計(jì)說明書,基于,fpga,crc,編解碼器,設(shè)計(jì),說明書,仿單
基于FPGA的CRC編解碼器的設(shè)計(jì)
摘要:CRC校驗(yàn)碼是數(shù)據(jù)通信領(lǐng)域中最常用的一種差錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長度可以任意選定。它依靠某種數(shù)學(xué)上約定的形式進(jìn)行檢查。校驗(yàn)的結(jié)果是可靠或不可靠,如果可靠就對(duì)數(shù)據(jù)進(jìn)行處理,如果不可靠,就丟棄重發(fā)或者進(jìn)行修復(fù)。CRC檢驗(yàn)的基本思想是利用線性編碼理論,在發(fā)送端根據(jù)要傳送的k 位二進(jìn)制碼序列,以一定的規(guī)則產(chǎn)生一個(gè)檢驗(yàn)碼r位(就是CRC碼),附在信息后面,構(gòu)成一個(gè)新的二進(jìn)制碼序列數(shù)共(k+r)位,最后發(fā)送出去。接收端根據(jù)同樣的規(guī)則校驗(yàn),以確定傳送中是否出錯(cuò)。CRC循環(huán)冗余校驗(yàn)具有比奇偶校驗(yàn)強(qiáng)得多的檢錯(cuò)能力。在實(shí)際設(shè)計(jì)中CRC校驗(yàn)碼獲得了非常廣泛的應(yīng)用。
本論文首先介紹了FPGA的基本知識(shí),包括對(duì)FPGA的開發(fā)軟件工具Quartus II 和硬件描述語言VHDL的詳細(xì)介紹,然后對(duì)循環(huán)校驗(yàn)碼的原理進(jìn)行了分析,給出設(shè)計(jì)方案,進(jìn)行編寫VHDL代碼設(shè)計(jì),用Quartus II軟件自動(dòng)生成封裝圖進(jìn)行連線,利用Modelsim進(jìn)行軟件仿真,并對(duì)結(jié)果與進(jìn)行驗(yàn)證,驗(yàn)證顯示設(shè)計(jì)完全正確。
關(guān)鍵詞:CRC;VHDL;FPGA;檢錯(cuò)
Cyclic code circuit design based on FPGA
Abstract:CRC checksum is the most common kind of error checking code in data communications, that the length of the information field and a check field can be arbitrarily selected is its feature. It checks relaying on some kind of agreement in the form of mathematics. Whether results of the check is reliable, if its reliable,then process the data, if its not reliable, then discarded and retransmitted or repair. The basic idea of CRC check is using linear coding theory, at the transmitting end according to k-bit binary code sequence to be transmitted, in certain rules to generate a r bits -checksum(this is CRC data). And attached the information to the back, to form a new binary Total number of code sequences (k + r) bits, and finally sent. The receiving end according to the same rules check to determine whether transmission error. CRC cyclic redundancy check error detection capability than parity much stronger. In the actual design of CRC received very wide range of applications.
This thesis introduces the basic knowledge of FPGA, including details of Quartus II development software tools of FPGA and hardware description language VHDL. Then analysised the principle of cyclic checksum, be written in VHDL code design automatically generated by the Quartus II software package, and wiring diagram. Using Modelsim simulation software to simulate, and verif the results and the verification display design is correct.
Keywords: CRC ; VHDL;FPGA; error detection
目 錄
1概述 1
1.1 背景意義 1
1.2 發(fā)展現(xiàn)狀 1
1.3 EDA技術(shù) 2
1.4 課題的主要工作 2
2 算法實(shí)現(xiàn) 4
2.1 CRC編解碼理論 4
2.2 模2運(yùn)算原理 6
2.3 CRC基礎(chǔ)計(jì)算 6
2.4 CRC編碼方法 8
2.4.1 CRC產(chǎn)生操作過程 9
2.5循環(huán)碼解碼方法 9
2.5.1 CRC解碼操作過程 10
3 仿真實(shí)現(xiàn) 11
3.1 仿真實(shí)現(xiàn)方案分析 11
3.1.1 查表法實(shí)現(xiàn)方案分析 11
3.1.2逐位運(yùn)算法實(shí)現(xiàn)方案分析 12
3.1.3 需求分析 14
3.2 編解碼設(shè)計(jì) 14
3.2.1 編碼模塊 14
3.2.2 解碼模塊 17
3.3 仿真驗(yàn)證 19
3.3.1 編碼器仿真 19
3.3.2 解碼器仿真 21
3.4分析與總結(jié) 23
4 結(jié)束語 25
參考文獻(xiàn) 26
致謝 27
附錄1:程序清單 28
附錄2:設(shè)計(jì)圖紙 31
基于FPGA的CRC編解碼器的設(shè)計(jì)
1概述
1.1 背景意義
如今科技的發(fā)展突飛猛進(jìn),尤其是在通訓(xùn)這個(gè)方面,幾乎人手一部手機(jī)、一臺(tái)PC。然而人們?cè)谖镔|(zhì)水平提高的同時(shí),對(duì)科技的需求也越來越高。比如在通信方面,人們會(huì)要求各種信息、數(shù)據(jù)準(zhǔn)確無誤的傳達(dá),并且一定要足夠清晰,幾乎不受外界的干擾。
但在實(shí)際應(yīng)用中,傳輸數(shù)據(jù)的無線信道非常復(fù)雜。由于信道有時(shí)變性、衰減性、帶寬資源有限、干擾大等特點(diǎn)。信號(hào)會(huì)受到信道噪聲的干擾,也會(huì)因?yàn)樾诺辣旧淼膹?fù)雜衰落變化而造成影響;而這兩種因素也是導(dǎo)致接收出現(xiàn)誤碼的主要原因。對(duì)于話音或圖像,誤碼會(huì)造成話音或圖像質(zhì)量的下降;而對(duì)于各種數(shù)據(jù)文件,誤碼則可能使得整個(gè)文件作廢。差錯(cuò)控制中的循環(huán)碼技術(shù)正是降低誤比特率、提高通信質(zhì)量的主要技術(shù)手段之一。
在本課題的研究中,我們還要涉及到VHDL語言的編程,利用它來實(shí)現(xiàn)差錯(cuò)控制中的循環(huán)碼。即使使用當(dāng)前最先進(jìn)的計(jì)算機(jī),如果使用人類語言來描述數(shù)字系統(tǒng),并希望計(jì)算機(jī)能夠理解設(shè)計(jì)者的意圖,這仍然是不可能的。計(jì)算機(jī)要求定義具有嚴(yán)格規(guī)則的語言。VHDL就是一種應(yīng)用廣泛的計(jì)算機(jī)編程語言。
通過本課題的研究,我可以深入了解循環(huán)碼,熟悉并掌握其實(shí)現(xiàn)方法;熟悉VHDL的編程方法,并能熟練地運(yùn)用VHDL編程實(shí)現(xiàn)循環(huán)碼CRC-8實(shí)現(xiàn)電路;熟悉Quatus Ⅱ的基本功能,能利用它進(jìn)行仿真并用其產(chǎn)生電路,實(shí)現(xiàn)循環(huán)碼的功能;掌握通信原理二次開發(fā)模板上各個(gè)按鈕的功能,并能在二次模板上實(shí)現(xiàn)循環(huán)碼的實(shí)測(cè)。由此親身體驗(yàn)循環(huán)碼在生活中的重要性。
1.2 發(fā)展現(xiàn)狀
信息在傳遞數(shù)據(jù)的過程中,有可能會(huì)因?yàn)槟撤N因素使信息所包含的數(shù)據(jù)發(fā)生錯(cuò)誤.為了減少并且防止這一類錯(cuò)誤的發(fā)生,除了從外部減弱干擾提高可靠性外,也應(yīng)該在數(shù)據(jù)的編碼上完成檢查錯(cuò)誤和糾正錯(cuò)誤的過程??梢赃@樣來完成:在要傳遞的數(shù)據(jù)代碼中加入數(shù)個(gè)校驗(yàn)位,在傳遞的過程中如果收到干擾發(fā)生錯(cuò)誤就會(huì)生成錯(cuò)誤代碼而被發(fā)現(xiàn),更能夠根據(jù)錯(cuò)誤代碼而確定錯(cuò)誤的位置并且糾錯(cuò)。這就是校驗(yàn)碼。當(dāng)傳遞數(shù)據(jù)時(shí)校驗(yàn)位和數(shù)據(jù)位一起被發(fā)出,如果在傳輸過程中沒有錯(cuò)誤發(fā)生時(shí),接收的一方去掉校驗(yàn)位而留住數(shù)據(jù)位,否則檢驗(yàn)后得到正確的代碼,或請(qǐng)求重傳(錯(cuò)誤檢測(cè)碼),其中循環(huán)冗余校驗(yàn)可以實(shí)現(xiàn)兩種功能,而且誤差校正(關(guān)于選擇和生成多項(xiàng)式),是一個(gè)以數(shù)據(jù)塊為對(duì)象有效和可靠的誤差檢測(cè)和校正方法,因?yàn)樗木幗獯a器設(shè)計(jì)簡(jiǎn)單,強(qiáng)糾錯(cuò)功能和低的概率發(fā)生錯(cuò)誤的判斷,這已經(jīng)在工業(yè)測(cè)量和控制應(yīng)用程序和通信系統(tǒng)中應(yīng)用很廣。
FPGA在過去30年產(chǎn)生了長足的發(fā)展。尤其是工藝的不斷提高使得FPGA的生產(chǎn)成本不斷降低,同時(shí)性能卻在大幅度的提升。他的應(yīng)用成本已經(jīng)能夠?yàn)橐恍┰O(shè)計(jì)所接受。另外由于其具有通用性好,代碼的可移植性強(qiáng)。設(shè)計(jì)的保密性和穩(wěn)定性高等特點(diǎn)受到越來越多的設(shè)計(jì)者青睞,他們已經(jīng)不再只是軍工領(lǐng)域的專享產(chǎn)品。由于FPGA的結(jié)構(gòu)可以很好的并行,適合做大量的數(shù)據(jù)處理的工作。能更有效的保證系統(tǒng)的實(shí)時(shí)性,另外基于FPGA的設(shè)計(jì)能夠具有很好的靈活性和可重用性。
1.3 EDA技術(shù)
EDA是一門新興技術(shù),發(fā)展快速,它在設(shè)計(jì)上的載體主要是規(guī)模龐大并且可以編程運(yùn)行的邏輯器件。主要的系統(tǒng)描述方式是硬件描述語言??梢宰詣?dòng)用軟件完成各種設(shè)計(jì),非常的方便快捷。國際上對(duì)于EDA應(yīng)用的范疇很寬。在機(jī)械、通信、航天航空、化工、電子、醫(yī)學(xué)等多個(gè)領(lǐng)域中都有廣泛的應(yīng)用。相比之下國內(nèi)定義的EDA范圍就比較狹隘了,主要是指IC、PCB以及電子電路的設(shè)計(jì)。本次設(shè)計(jì)所涉及的EDA技術(shù)主要是對(duì)CRC生成及校驗(yàn)進(jìn)行驗(yàn)證仿真,先通過Quartus Ⅱ?qū)υO(shè)計(jì)程序進(jìn)行編譯無誤后,再使用Modelsim仿真驗(yàn)證,確保設(shè)計(jì)可以準(zhǔn)確無誤的運(yùn)行。
FPGA是現(xiàn)場(chǎng)可編程門陣列的簡(jiǎn)稱,可分為邏輯元件、輸入輸出元件和連線三個(gè)部分,最能代表的優(yōu)點(diǎn)就是高集成度,高速和高可靠性。時(shí)鐘延時(shí)短,在很多應(yīng)用領(lǐng)域具有廣闊的應(yīng)用前景。設(shè)計(jì)完善的話,不會(huì)出現(xiàn)別的軟件會(huì)出現(xiàn)的一系列問題。
而且它的集成規(guī)模很大,可以用EDA技術(shù)進(jìn)行前期設(shè)計(jì)和后期開發(fā)。強(qiáng)大的兼容性使得FPGA可以與EDA技術(shù)很好的結(jié)合在一起,使得產(chǎn)品的設(shè)計(jì)速度大幅變快。
VHDL語言是一種設(shè)計(jì)數(shù)字電子系統(tǒng)的描述語言,在美國發(fā)起,經(jīng)過一段時(shí)間的調(diào)整、完善、開發(fā),最終標(biāo)準(zhǔn)化并且使得集成電路高度系統(tǒng)化。VHDL的語法很嚴(yán)格,描述方法多樣,對(duì)新手來說難以上手,但是對(duì)于熟練的用戶來說就是一種很棒的編程語言。歸納起來,VHDL語言具有以下優(yōu)點(diǎn):功能強(qiáng)大,設(shè)計(jì)方式多樣;具有強(qiáng)大的硬件描述能力;具有很強(qiáng)的移植能力;設(shè)計(jì)描述與器件無關(guān);程序易于共享和復(fù)用。
Quartus II 13.1是Altera公司淘汰Maxplus II后開發(fā)出來的一款PLD開發(fā)平臺(tái)軟件。支持多種設(shè)計(jì)以及器件的開發(fā),并且還支持多種設(shè)計(jì)方式,內(nèi)部自帶多種綜合仿真器,可以完成完整的PLD設(shè)計(jì)。Quartus II與Modelsim結(jié)合在一起,可以實(shí)現(xiàn)設(shè)計(jì),仿真的一個(gè)很好的平臺(tái),并且方便。隨著Quartus II版本不斷更新,軟件的更新主要體現(xiàn)在對(duì)于支持的芯片類型更多。本文設(shè)計(jì)中采用了比較可靠的Quartus II 13.1版本。
1.4 課題的主要工作
本論文設(shè)計(jì)了一款基于FPGA的循環(huán)碼產(chǎn)生電路,通過對(duì)在Quartus II上進(jìn)行具體的設(shè)計(jì);完成了功能仿真和驗(yàn)證、分析、改進(jìn),直至能夠得出功能完善并且方便的CRC編解碼器。本論文的具體內(nèi)容共分為四節(jié):
第一節(jié)概述主要介紹了本設(shè)計(jì)的研究背景以及意義、發(fā)展的現(xiàn)狀以及EDA技術(shù)的概述。
第二節(jié)主要介紹了CRC編解碼的算法理論、實(shí)現(xiàn)以及各視圖的解釋。
第三節(jié)主要介紹了編解碼器的仿真驗(yàn)證。
第四節(jié)是結(jié)論,對(duì)整個(gè)研究工作進(jìn)行歸納和綜合的總結(jié),包括研究所得結(jié)果、與已有結(jié)果的比較、本次研究中尚存在的問題、對(duì)進(jìn)一步研究的見解與建議。
2 算法實(shí)現(xiàn)
2.1 CRC編解碼理論
需要額外增加數(shù)個(gè)監(jiān)督碼元來完成信道的編碼,可以用來檢查錯(cuò)誤和糾正錯(cuò)誤。舉個(gè)例子,用三位二進(jìn)制碼組來說明檢查錯(cuò)誤和糾正錯(cuò)誤的原理。三位二進(jìn)制碼組共有8種可能的組合,下面分三種情況討論:
a)如果這8種碼組都用于傳送消息,就是說其中的每個(gè)碼組都是可用的。在傳輸信息的過程如果出現(xiàn)誤碼,那么一種碼組會(huì)錯(cuò)誤地成為另外七個(gè)碼組中的一個(gè)。這樣的編碼既不能檢查錯(cuò)誤,也不能糾正錯(cuò)誤,沒有任何抵抗抗干擾的能力。
b)如果選擇其中的000、011、101、110作為可用的碼組。除上述4種可用的碼組以外,另外的4種碼組稱為不可用碼組。經(jīng)觀察我們可以發(fā)現(xiàn),可用碼組中“1”偶數(shù)個(gè),不可用碼組中“1”為奇數(shù)個(gè)。如果在傳輸過程中發(fā)生了一位或三位的錯(cuò)碼,則“1”的個(gè)數(shù)就變?yōu)槠鏀?shù)個(gè),許用碼組就變?yōu)榻么a組;如果不可用碼組被接收方發(fā)現(xiàn),就可以說明傳輸過程有錯(cuò)。有一個(gè)或者有三個(gè)錯(cuò)誤可以被這種簡(jiǎn)單的校驗(yàn)發(fā)現(xiàn),但是并不能糾錯(cuò)。比如說,接收到的碼組是010,可以確定它是不可用碼組,不過不能看出來原來的正確的碼組是哪個(gè)。即使原發(fā)送碼組是101的可能性很小,但是還是會(huì)有這種情況發(fā)生的;哪怕傳輸信息的過程中只出現(xiàn)了一個(gè)誤碼,也有三種可能的發(fā)送碼組。顯然,上述編碼無法發(fā)現(xiàn)2個(gè)錯(cuò)碼。上面所描述的編碼方法只是傳遞了三位二進(jìn)制碼組的前兩位一共四種信息,并且第三位是額外的監(jiān)督位。這位附加的監(jiān)督碼位與前面兩位信息碼元和在一起,保證碼組中“1”碼的個(gè)數(shù)為偶數(shù)。下表示出了這種情況:
表2-1 信息位與監(jiān)督位的關(guān)系
信息位
監(jiān)督位
晴
00
0
云
01
1
陰
10
1
雨
11
0
c)假設(shè)限制兩種可用碼組:000和 111。那么可以看出,這種明了的方法可以發(fā)現(xiàn)小于等于2個(gè)的誤碼;或者能夠糾正一位錯(cuò)碼。糾正一位錯(cuò)碼的方法是:將 8個(gè)碼組分成二個(gè)子集,其中{000、 100、 010、001}與許用碼組000對(duì)應(yīng),{111、011、101、110}與許用碼組111對(duì)應(yīng);這樣,在接收端如果認(rèn)為碼組中僅有一個(gè)錯(cuò)碼,只要收到第一子集中的碼組即判為 000,收到第二子集中的碼組即判為 111。如果接收的碼組是不可用碼組100時(shí),假設(shè)這個(gè)碼組中只有1個(gè)錯(cuò)誤的碼,就可以確定這個(gè)錯(cuò)碼發(fā)生在“1”位,然后吧錯(cuò)誤糾正成000;假設(shè)接收碼組中的錯(cuò)碼的個(gè)數(shù)小于等于兩個(gè),就可能有兩種情況:000錯(cuò)一位,111錯(cuò)兩位都有成為100的可能,所以不能糾錯(cuò)只能檢驗(yàn)到錯(cuò)誤。
分組碼一般用數(shù)學(xué)符號(hào)表示,符號(hào)中k是每個(gè)碼組中信息碼的數(shù)目;n是每個(gè)碼組的總位數(shù),又稱為碼組長度(碼長),的數(shù)字是每碼組中的監(jiān)督碼元的個(gè)數(shù)。通常,將分組碼規(guī)定為具有如下圖所示的結(jié)構(gòu)。圖中前面k位(an-1…ar)為信息位,后面附加個(gè)監(jiān)督位(ar-1…a0)。
K個(gè)
信息位
碼長n=k+r
r個(gè)
監(jiān)督位
圖2-1分組碼的結(jié)構(gòu)
在信道編碼中,碼重就是碼組中不是零的碼元的個(gè)數(shù),比如說, 1101碼組的碼重是3,1100碼組的碼重為2。兩個(gè)碼組中所對(duì)應(yīng)碼位上所具有的不同二進(jìn)制碼元的位數(shù)就是兩個(gè)碼組之間的距離,稱為碼距。最小碼距可記為。上面三位二進(jìn)制碼組的討論中,8種碼組都是可以用的碼組的時(shí)候,兩個(gè)碼組之間的最小距離是1,可以記成。四種碼組都是可用碼組的話,最小碼距式中;使用了兩種可用碼組的時(shí)候,。
從上面可以知道,最小碼距關(guān)系到編碼碼的糾正錯(cuò)誤和檢測(cè)錯(cuò)誤的能力,所以說最小碼距在信道編碼中是重要參數(shù)。沒有特殊的情況下,對(duì)于分組碼有下面幾個(gè)結(jié)論:
a)為檢測(cè)e個(gè)誤碼,要求該編碼的最小碼距
b)為糾正t個(gè)誤碼,要求該編碼的最小碼距
c)為糾正t個(gè)誤碼,同時(shí)檢測(cè)e(e>t)個(gè)誤碼,要求最小碼距
“檢測(cè)e個(gè)誤碼的同時(shí)糾正t個(gè)誤碼”,說的是當(dāng)接收碼組與某一個(gè)可用碼組間的距離在糾錯(cuò)能達(dá)到的范圍內(nèi),就自動(dòng)糾正誤碼;與隨意可用碼組間的距離都超過t時(shí),則按“糾檢結(jié)合的方式”工作。
簡(jiǎn)單分析了編碼的糾錯(cuò)和檢錯(cuò)的能力之后,再看看差錯(cuò)控制編碼的能力。
如果在信道中傳輸“0”和“l(fā)”并且發(fā)生錯(cuò)誤的概率P一樣,并且P<<1,那么在碼長為n位的碼組中出現(xiàn)r位錯(cuò)碼的概率為;
例如,當(dāng)碼長n=7,時(shí),則有:
可見,采用了差錯(cuò)控制編碼,哪怕僅僅糾正(或檢測(cè))出了碼組中的一或二個(gè)錯(cuò)誤碼,還是能夠讓誤碼率下降許多。這就能夠說明,僅僅糾錯(cuò)(檢測(cè))出一到二個(gè)錯(cuò)碼編碼也很有用,即使只是很簡(jiǎn)單的編碼。
2.2 模2運(yùn)算原理
模2運(yùn)算是一種二進(jìn)制算法,CRC校驗(yàn)技術(shù)中的核心部分,因此,我們?cè)诜治鯟RC算法之前,必須掌握模2運(yùn)算的規(guī)則。與四則運(yùn)算相同,模2運(yùn)算也包括模2加、模2減、模2乘、模2除四種二進(jìn)制運(yùn)算。而且,模2運(yùn)算也使用與四則運(yùn)算相同的運(yùn)算符,即“+”表示模2加,“-”表示模2減,“×”或“·”表示模2乘,“÷”或“/”表示模2除。這樣,兩個(gè)二進(jìn)制位相運(yùn)算時(shí),這兩個(gè)位的值就能確定運(yùn)算結(jié)果,不受前一次運(yùn)算的影響,也不對(duì)下一次造成影響。
a)模2加法運(yùn)算定義為:
0+0=0; 0+1=1; 1+0=1; 1+1=0
b)模2減法運(yùn)算定義為:
0-0=0; 0-1=1; 1-0=1; 1-1=0
c)模2乘法運(yùn)算定義為:
0×0=0; 0×1=0; 1×0=0; 1×1=1
多位二進(jìn)制模2乘法類似于普通意義上的多位二進(jìn)制乘法,不同之處在于后者累加中間結(jié)果(或稱部分積)時(shí)采用帶進(jìn)位的加法,而模2乘法對(duì)中間結(jié)果的處理方式采用的是模2加法。
d)模2除法運(yùn)算定義為:
0÷1=0 1÷1=1
多位二進(jìn)制模2除法也類似于普通意義上的多位二進(jìn)制除法,但是在如何確定商的問題上兩者采用不同的規(guī)則。按帶借位的二進(jìn)制減法,通過計(jì)算余數(shù)減除數(shù)能不能夠減確定商0還是商1,若夠減則商1,否則商0。多位模2除法采用模2減法,不帶借位的二進(jìn)制減法,因此考慮余數(shù)夠減除數(shù)與否是沒有意義的。實(shí)際上,在CRC運(yùn)算中,總能保證除數(shù)的首位為1,則模2除法運(yùn)算的商是由余數(shù)首位與除數(shù)首位的模2除法運(yùn)算結(jié)果確定。因?yàn)槌龜?shù)首位總是1,按照模2除法運(yùn)算法則,那么余數(shù)首位是1就商1,是0就商0。
2.3 CRC基礎(chǔ)計(jì)算
循環(huán)碼屬于分組碼也記為(n,k),可分為線性循環(huán)碼和非線性循環(huán)碼兩種。循環(huán)碼仍是線性分組碼,但另有循環(huán)移位不變特性。
循環(huán)碼的碼字和多項(xiàng)式:
設(shè)循環(huán)碼的任一個(gè)碼字為:
在二元情況下,只取1或0,為了完整描述一個(gè)碼字,需要知道的取值及其在碼字中的位置。用多項(xiàng)式來描述碼字是很方便的,于是表示的碼字用次多項(xiàng)式來表示,即:
上式表示一個(gè)n位長的碼字可以用一個(gè)次多項(xiàng)式來表示??梢姸囗?xiàng)式僅是碼字的一個(gè)數(shù)學(xué)描述工具,但不是碼字本身,但兩者有一一對(duì)應(yīng)的關(guān)系。
如果改寫為:
就可以讓碼字中的碼元循環(huán)向左移一位,所對(duì)照的多項(xiàng)式就相當(dāng)于乘以:
上式中采用了模多項(xiàng)式運(yùn)算,表明碼字的左移,相對(duì)于多項(xiàng)式乘(升冪)后取的模剩余。同理左移位相對(duì)于乘。兩多項(xiàng)式間一個(gè)常用的運(yùn)算是加法,應(yīng)為同冪次項(xiàng)系數(shù)相加,在二元的情況下應(yīng)做模2加,例如:
則:
其中的一對(duì)和由于模2加消掉了,也可以認(rèn)為做了減法。
多項(xiàng)式另一個(gè)常用的運(yùn)算是除法,可排豎式長除法。
已知多項(xiàng)式:
列豎式做:
可見不能除盡,故有余式。如果將余式加到被除式即:
2.4 CRC編碼方法
在編碼時(shí),首先要根據(jù)給定的(n,k)值選定生成多項(xiàng)式,即從()的因子中選一個(gè)(n-k)次多項(xiàng)式作為。
所有碼多項(xiàng)式都可以被整除。根據(jù)這條原則,就可以對(duì)給定的信息位進(jìn)行編碼:設(shè)為信息碼多項(xiàng)式,其次數(shù)小于k。用乘,得到的次數(shù)必定小于n。用除,得到余式,的次數(shù)必定小于的次數(shù),即小于。把這個(gè)余式加在信息位后面當(dāng)成監(jiān)督位,就是讓+,他們加的結(jié)果的多項(xiàng)式肯定是一個(gè)多項(xiàng)式。是因?yàn)樗欢〞?huì)被整除。
根據(jù)上述原理,編碼步驟如下:
用乘。
用除,得到商和余式,即:
編出的碼組為:
2.4.1 CRC產(chǎn)生操作過程
以下是一個(gè)8位的數(shù)據(jù)0x02產(chǎn)生一個(gè)16位的CRC的過程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
8 0 0 F
圖2-2 8位數(shù)據(jù)0x02的16位CRC數(shù)據(jù)產(chǎn)生
可以從上圖得出,0x02擴(kuò)充到了24位,之后和0x8005(CRC-16生成多項(xiàng)式)做模2運(yùn)算。運(yùn)算的時(shí)候,第17位一直被丟掉。第16位如果是0的話,只能和0x0000異或,就是數(shù)據(jù)向左移一位。如果是1的話,就要和0x8005作異或運(yùn)算。每次計(jì)算完,拋棄最高的位,然后將數(shù)據(jù)的下一位移過來,繼續(xù)進(jìn)行模2運(yùn)算,一直到所有的數(shù)位移完才停止。
2.5循環(huán)碼解碼方法
解碼器有兩個(gè)要求:檢測(cè)錯(cuò)誤和糾正錯(cuò)誤。因?yàn)殡S便一個(gè)碼組多項(xiàng)式都是能夠被生成多項(xiàng)式整除的,那么在接收端接收的碼組用多項(xiàng)式去除。如果傳輸?shù)倪^程中并沒有發(fā)生錯(cuò)誤,那么接收碼組與發(fā)送碼組一樣,就是,所以接收碼組一定能夠被整除;如果碼組在傳輸?shù)倪^程有錯(cuò),那么,被除時(shí)會(huì)出現(xiàn)除不盡而有余項(xiàng)的情況,所以,可以看余項(xiàng)是否為零判斷接收碼組中有沒有錯(cuò)的碼。
提出一點(diǎn),有可能除的盡R(x)。這個(gè)時(shí)候的錯(cuò)誤碼就不能檢測(cè)出來。這種不在誤差之內(nèi)的錯(cuò)誤就叫做不可檢錯(cuò)誤。不可檢錯(cuò)誤中的誤碼數(shù)超出了這種編碼的檢錯(cuò)能力。
2.5.1 CRC解碼操作過程
以前文0x02數(shù)據(jù)(CRC = 0x800F)為例,計(jì)算如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
圖2-3 8位數(shù)據(jù)0x02的16位CRC數(shù)據(jù)校驗(yàn)
當(dāng)然,也可以使用比較直觀的辦法,求數(shù)據(jù)0x02的CRC值,如果相等,那么也可以表明數(shù)據(jù)沒有問題。
3 仿真實(shí)現(xiàn)
3.1 仿真實(shí)現(xiàn)方案分析
硬件和軟件都可以實(shí)現(xiàn)CRC算法,硬件實(shí)現(xiàn)的方式電路結(jié)構(gòu)復(fù)雜,使得應(yīng)用系統(tǒng)功能模塊增多,增大系統(tǒng)體積降低了集成度,批量生產(chǎn)的產(chǎn)品中提高了產(chǎn)品成本;使用軟件實(shí)現(xiàn)的方法計(jì)算的速度受限于系統(tǒng)CPU的速度,但是隨著科技的發(fā)展,CPU已經(jīng)足以讓這樣的影響忽略不計(jì),所以采用軟件實(shí)現(xiàn)的方法增加了系統(tǒng)集成度,從而提升系統(tǒng)的通信效率,在進(jìn)行批量生產(chǎn)時(shí)可以極大的降低成本。
利用軟件實(shí)現(xiàn)可以采用的器件有MCU和CPLD,基于MCU的方案中由于MCU的處理數(shù)據(jù)的位寬固定,且運(yùn)行速度不如基于CPLD的方法快,基于CPLD的方案管腳配置更靈活,運(yùn)行速度更快更穩(wěn)定。故次設(shè)計(jì)中采用基于CPLD的軟件實(shí)現(xiàn)方法來完成CRC的編解碼校驗(yàn)。
根據(jù)應(yīng)用的需要,有兩種常用的方法,來實(shí)現(xiàn)CRC的算法,查表法和逐位運(yùn)算法,它們特點(diǎn)如下。
3.1.1 查表法實(shí)現(xiàn)方案分析
查表法,就是在編寫代碼之前計(jì)算好各種基本CRC的值,并且存儲(chǔ)在存儲(chǔ)器里面,需要時(shí)直接查詢存儲(chǔ)器中的CRC數(shù)據(jù)表,不用進(jìn)行耗時(shí)的位運(yùn)算,因?yàn)槭褂米趾妥止?jié)存在里面的。這樣查表法的速度就會(huì)增加,與基于位運(yùn)算的方法相比在達(dá)到同等效果的時(shí)候就可以降低系統(tǒng)主頻和功耗,但是需要大量的寄存器來存儲(chǔ)CRC值。
8位數(shù)據(jù)的CRC查表法實(shí)現(xiàn)流程圖如下:
是
否
CRC與表數(shù)據(jù)做異或運(yùn)算
運(yùn)算結(jié)束
CRC左移n位
產(chǎn)生CRC表索引
初始化CRC寄存器
開始
最后異或運(yùn)算
結(jié)束
圖3-1 查表法流程圖
3.1.2逐位運(yùn)算法實(shí)現(xiàn)方案分析
逐位運(yùn)算法,利用表3-2的原理來實(shí)現(xiàn)。數(shù)據(jù)左移一位時(shí),要再次對(duì)每一位進(jìn)行第二次運(yùn)算,所以,總的數(shù)據(jù)位數(shù) - 16=移位操作的次數(shù)。
這樣子就可以得到,CPU使用的時(shí)間也不是太多的,當(dāng)數(shù)據(jù)位數(shù)比較多時(shí)。數(shù)據(jù)位數(shù)越多,就要使用更多的CPU,為了超越查表法的速度,需要大幅度提高系統(tǒng)主頻,會(huì)增加功耗。
8位數(shù)據(jù)逐位運(yùn)算法實(shí)現(xiàn)CRC的流程圖如下:
否
是
否
是
高位為1?
左移1位
異或運(yùn)算
最后異或運(yùn)算
結(jié)束
運(yùn)算結(jié)束嗎
初始化CRC寄存器
設(shè)定下一個(gè)字節(jié)
開始
左移1位
圖3-2 逐位運(yùn)算法流程圖
3.1.3 需求分析
根據(jù)對(duì)查表法和逐位運(yùn)算法的分析與比較,發(fā)現(xiàn)雖然查表法能夠使用系統(tǒng)主頻低的cpu,而且只需要很小的功耗,但是,現(xiàn)在科技發(fā)展迅速,系統(tǒng)主頻的要求并不算難以應(yīng)付,就是功耗會(huì)大一點(diǎn),而且逐位運(yùn)算法的速度很快,比較方便。所以,決定使用逐位運(yùn)算法來實(shí)現(xiàn)CRC編解碼的設(shè)計(jì)。
3.2 編解碼設(shè)計(jì)
先進(jìn)行簡(jiǎn)單的12位信息加5位CRC校驗(yàn)碼發(fā)送、接收設(shè)計(jì),由兩個(gè)模塊構(gòu)成CRC校驗(yàn)生成模塊(發(fā)送)和CRC校驗(yàn)檢錯(cuò)模塊(接收),其中CRC生成多項(xiàng)式采用,二進(jìn)制表示為110101。輸入、輸出都為并行的CRC校驗(yàn)生成方式。
3.2.1 編碼模塊
數(shù)據(jù)生成模塊就是要生成17位串行的數(shù)據(jù),用這個(gè)數(shù)據(jù)來做CRC校驗(yàn)的輸入,該部分代碼的實(shí)體定義如下所示:
entity shishikan is
Port (
clk : in std_logic;
coded_data : out STD_LOGIC_VECTOR(16 downto 0);
send : out std_logic;
data: in std_logic_vector(11 downto 0):="110011010101";
load : in std_logic
);
end shishikan;
其中,每個(gè)實(shí)體的含義如下:
data:12位的待發(fā)送信息;
clk:時(shí)鐘信號(hào);
load:data的裝載信號(hào);
send:生成、檢錯(cuò)模塊的握手信號(hào),協(xié)調(diào)相互之間關(guān)系;
coded_data:在生成模塊被發(fā)送。
該部分代碼生成的模塊如下圖:
圖3-3 CRC生成模塊
該部分的結(jié)構(gòu)體定義如下圖:
architecture Behavioral of shishikan is
constant multi_coef: std_logic_vector(5 downto 0) :="110101";
signal data_r: std_logic_vector(11 downto 0):="110011010101";
signal cnt: std_logic_vector(7 downto 0);
begin
process(clk)
variable crcvar : std_logic_vector(5 downto 0);
VARIABLE dtemp: STD_LOGIC_VECTOR(11 DOWNTO 0);
VARIABLE sdatam: STD_LOGIC_VECTOR(11 DOWNTO 0);
variable st: std_logic :='0';
begin
if(clk'event and clk = '1')then
if(st='0'and load='1')then
dtemp:=data_r; sdatam:=data_r; cnt<=(others=>'0'); send<='0'; st:='1';
elsif(st='1' and cnt<7)then
cnt<=cnt+1;
if(dtemp(11)='1')then
crcvar:=dtemp(11 downto 6)xor multi_coef(5 downto 0); dtemp:=crcvar(4 downto 0)& dtemp(5 downto 0) & '0';
else dtemp:=dtemp(10 downto 0) & '0';
end if;
elsif(st='1' and cnt=7)then
coded_data<=sdatam & dtemp(11 downto 7);
data<=data_r;
send<='1';cnt<=cnt+1;
elsif(st='1' and cnt=8)then
send<='0'; st:='0';
end if; end if;
end process;
end Behavioral;
對(duì)該部分代碼進(jìn)行編譯綜合之后產(chǎn)生的rtl視圖和technology視圖見附錄2.1-2.5
附錄2.1-2.3表示的是寄存器cnt通過加法器自加,并且通過觸發(fā)器向內(nèi)部傳輸信號(hào)。Coded_data通過與dtemp的不停的互動(dòng)輸出最后的數(shù)據(jù),而dtemp則不停的左移然后和crc-5異或得到數(shù)據(jù)送給coded_data.
資源使用圖如下:
圖3-4 編碼器資源使用圖
3.2.2 解碼模塊
解碼模塊的設(shè)計(jì)是本文的主要功能,該部分的代碼的實(shí)體定義如下所示:
entity jiemaqia is
Port (
clk : in std_logic;
coded_data : in STD_LOGIC_VECTOR(16 downto 0):="11001101010101000";
reception : in std_logic;
decode_data: out std_logic_vector(11 downto 0);
error1: out std_logic;
datafini : out std_logic
);
end jiemaqia;
每個(gè)實(shí)體的含義如下:
clk:時(shí)鐘信號(hào);
error1:誤碼警告信號(hào) ;
datafini:數(shù)據(jù)接收校驗(yàn)完成;
reception:解碼模塊的握手信號(hào),協(xié)調(diào)相互之間關(guān)系;
decode_data:接收模塊(檢錯(cuò)模塊)接收的12位有效信息數(shù)據(jù);
coded_data:附加上5位CRC校驗(yàn)碼的17位CRC碼,在生成模塊被發(fā)送。
該部分代碼生成的模塊如下圖:
圖3-5 crc解碼模塊
該部分的結(jié)構(gòu)體定義如下:
architecture Behavioral of jiemaqia is
constant multi_coef: std_logic_vector(5 downto 0) :="110101";
signal coded_data_r: std_logic_vector(16 downto 0):="11001101010101000";
signal rcnt: std_logic_vector(7 downto 0);
begin
process(clk,reception)
variable rcrcvar : std_logic_vector(5 downto 0);
variable rdtemp : std_logic_vector(11 downto 0);
variable rt: std_logic :='0';
variable rdatacrc : std_logic_vector(16 downto 0);
begin
if(clk'event and clk = '1')then
if(rt='0'and reception='1')then
rdtemp:=coded_data_r(16 DOWNTO 5);rdatacrc:=coded_data_r;
rcnt<=(others=>'0'); error1<='0';rt:='1';
elsif(rt='1'and rcnt<7)then
datafini<='0';rcnt<=rcnt+1;
rcrcvar:=rdtemp(11 downto 6)xor multi_coef;
if(rdtemp(11)='1')then
rdtemp:=rcrcvar(4 downto 0)& rdtemp(5 downto 0)& '0';
else rdtemp:=rdtemp(10 downto 0) & '0';
end if;
elsif(rt='1' and rcnt=7)then datafini<='1';
decode_data<=rdatacrc(16 downto 5); rt:='0';
if(rdatacrc(4 downto 0) /=rdtemp(11 downto 7)) then
error1<='1';
end if; end if; end if;
end process; end Behavioral;
對(duì)該部分代碼進(jìn)行編譯綜合之后產(chǎn)生的rtl視圖以及technology視圖見附錄2.6-2.9
Rtl視圖表示了其中電路連接以及邏輯運(yùn)算情況,17位數(shù)據(jù)輸入,12位數(shù)據(jù)輸出。通過邏輯元件進(jìn)行運(yùn)算。
資源使用圖如下:
圖3-6 解碼器資源使用圖
3.3 仿真驗(yàn)證
在Quartus Ⅱ中編譯過代碼后打開Modelsim 進(jìn)行仿真并且驗(yàn)證。
3.3.1 編碼器仿真
添加激勵(lì)信號(hào)clk時(shí)鐘信號(hào)周期為10ns,數(shù)據(jù)裝載load為1,輸入數(shù)據(jù)data:110011010101
Testbench代碼如下:
LIBRARY altera ;
LIBRARY cycloneiii ;
LIBRARY ieee ;
USE altera.altera_primitives_components.all ;
USE cycloneiii.cycloneiii_components.all ;
USE ieee.std_logic_1164.all ;
ENTITY shishikan_tb IS
END ;
ARCHITECTURE shishikan_tb_arch OF shishikan_tb IS
SIGNAL load : STD_LOGIC :='0' ;
SIGNAL coded_data : std_logic_vector (16 downto 0) ;
SIGNAL data : std_logic_vector (11 downto 0) ;
SIGNAL send : STD_LOGIC ;
SIGNAL clk : STD_LOGIC :='0' ;
COMPONENT shishikan
PORT (
load : in STD_LOGIC ;
coded_data : buffer std_logic_vector (16 downto 0) ;
data : buffer std_logic_vector (11 downto 0) ;
send : buffer STD_LOGIC ;
clk : in STD_LOGIC );
END COMPONENT ;
BEGIN
DUT : shishikan
PORT MAP (
load => load ,
coded_data => coded_data ,
data => data ,
send => send ,
clk => clk ) ;
clk <= not clk after 10ns;
load <='1' after 20ns;
END ;
給clk賦初值為0,給load賦初值為0,添加代碼clk <= not clk after 10ns;和 load <='1' after 20ns;設(shè)置時(shí)鐘周期為20ns,load在20ns后置1,開始編碼。
仿真結(jié)果如下圖:
圖3-7 編碼器仿真圖
可以看出在8個(gè)時(shí)鐘周期后,編碼完成,由一開始的信息碼輸入OXCD5變成了輸出0X19AA8。
110011010101多項(xiàng)式表示為:
110101多項(xiàng)式表示為:
多項(xiàng)式五位二進(jìn)制表示01000
編碼后的CRC編碼:11001101010101000用信息多項(xiàng)式表示為
不難看出11001101010101000轉(zhuǎn)換成16進(jìn)制數(shù)就是0X19AA8.所以CRC編碼模塊功能正常。
3.3.2 解碼器仿真
添加激勵(lì)信號(hào)clk時(shí)鐘信號(hào)周期為10ns,數(shù)據(jù)裝載reception為1,輸入數(shù)據(jù)coded_data: 11001101010101000,激勵(lì)信號(hào)添加完成,按照軟件設(shè)計(jì)進(jìn)行仿真。
Testbench代碼如下:
LIBRARY altera ;
LIBRARY cycloneiii ;
LIBRARY ieee ;
USE altera.altera_primitives_components.all ;
USE cycloneiii.cycloneiii_components.all ;
USE ieee.std_logic_1164.all ;
ENTITY jiemaqia_tb IS
END ;
ARCHITECTURE jiemaqia_tb_arch OF jiemaqia_tb IS
SIGNAL datafini : STD_LOGIC ;
SIGNAL coded_data : std_logic_vector (16 downto 0) ;
SIGNAL decode_data : std_logic_vector (11 downto 0) ;
SIGNAL reception : STD_LOGIC :'1' ;
SIGNAL clk : STD_LOGIC :='0';
SIGNAL error1 : STD_LOGIC ;
COMPONENT jiemaqia
PORT (
datafini : out STD_LOGIC ;
coded_data : out std_logic_vector (16 downto 0) ;
decode_data : out std_logic_vector (11 downto 0) ;
reception : in STD_LOGIC ;
clk : in STD_LOGIC ;
error1 : out STD_LOGIC );
END COMPONENT ;
BEGIN
DUT : jiemaqia
PORT MAP (
datafini => datafini ,
coded_data => coded_data ,
decode_data => decode_data ,
reception => reception ,
clk => clk ,
error1 => error1 ) ;
clk <= not clk after 10ns;
END ;
同樣的,給clk賦初值0,
收藏
編號(hào):12803027
類型:共享資源
大?。?span id="8gc7qz3" class="font-tahoma">7.78MB
格式:ZIP
上傳時(shí)間:2020-05-24
20
積分
- 關(guān) 鍵 詞:
-
基于
fpga
crc
編解碼器
設(shè)計(jì)
說明書
仿單
- 資源描述:
-
基于FPGA的CRC編解碼器設(shè)計(jì)說明書,基于,fpga,crc,編解碼器,設(shè)計(jì),說明書,仿單
展開閱讀全文
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學(xué)習(xí)交流,未經(jīng)上傳用戶書面授權(quán),請(qǐng)勿作他用。