新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于ARM的CRC算法和基于FPGA的算法性能比較

基于ARM的CRC算法和基于FPGA的算法性能比較

作者: 時間:2016-11-09 來源:網(wǎng)絡 收藏
CRC是一種實際通信中應用很廣泛的線性分組碼,具有很強的檢錯能力,但沒有糾錯能力。在應用的時候可以根據(jù)不同的場合選擇硬件電路或者軟件算法來實現(xiàn),硬件實現(xiàn)的原理是根據(jù)特定的CRC多項式對輸入信號和上一次校驗結果進行移位異或操作,得到本次CRC校驗結果;軟件則可以采用多種不同算法進行計算,相應的時間復雜度會有所差別

題目分析:本題目的設計意圖在于使用FPGA中硬件資源對某些流程固定的軟件算法進行加速,即algorithm-hardware codesign,是軟硬協(xié)同設計中更為具體的一種形式,本題目中的CRC算法只是其中一種實例。這種由硬件電路實現(xiàn)的軟件算法通常能夠很大程度上的降低計算時間,代價僅是FPGA內部所消耗的一些邏輯、存儲資源,但對于如今的FPGA芯片來講是完全可以接受的。本題目的設立將充分驗證MicroZed開發(fā)板中Zynq系列芯片的優(yōu)勢,因為它集成了高性能ARM處理器內核、充足外設資源和FPGA邏輯資源,對于軟硬件協(xié)同設計的嵌入式應用,是很好的選擇。

本文引用地址:http://2s4d.com/article/201611/317911.htm

(二)過程說明

1.軟件學習:Vivado+ SDK

要在兩周時間內完成挑戰(zhàn)題目,需盡快學會題目規(guī)定的Vivado + SDK軟件開發(fā)流程。其中第一個目標就是要搭建起基于ARM CortexA9的嵌入式系統(tǒng),才能夠進行下一步CRC算法的實現(xiàn)和調試。在Vivado 2013.4及以上的版本中都包含支持MicroZed開發(fā)板的硬件定義和板級支持包,新建工程時選中就會將開發(fā)板的所有信息導入到工程中,十分快捷。


有很多網(wǎng)友或MicroZed、Zynq使用者上傳過很詳細的圖文開發(fā)流程,在這里我就不再重復演示了。這些教程包含了從入門級到專家級的MicroZed開發(fā)板、Vivado/SDK軟件使用教程甚至代碼。正是由于這些人樂于分享的精神,才使得國內FPGA設計技術能夠快速、深入的發(fā)展起來。在這里跟大家推薦一個名字叫“亞當泰勒玩轉MicroZed”的連載,中英版都有,但英文版的更全一些。這個入門級的圖文教學可以教大家如何從一個新手快速熟悉基于Vivado+SDK的MicroZed開發(fā)流程,本題目能夠順利完成離不開這位外國友人的幫助。連載中除了說明開發(fā)板的使用、軟件設計/調試流程外,還包含部分PS基本外設的使用方法,比如GPIO、中斷控制器、三重定時器以及PS與PL進行通信使用的AXI4總線搭建/調試方法等。在這里提一下用Vivado進行設計的一個典型特點:在搭建嵌入式硬件系統(tǒng)時,它采用的是模塊圖的形式比PlanAhead更直觀一些,下圖就是本題目最終設計的系統(tǒng)模塊圖:

其中包含了CortexA9處理器系統(tǒng)、AXI總線互連IP以及PL實現(xiàn)的自定義CRC算法IP。

2.基于ARM的CRC算法實現(xiàn)(PS端)及性能比較流程

軟件CRC算法實現(xiàn)方法有很多種,目前大多使用查表法,具有較低的算法復雜度和運行時間。但是此題目的目的在于比較硬件加速對某種軟件算法的性能提升,需要使用與PL端相同的算法實現(xiàn)才更有說服性。所以在ARM中實現(xiàn)的32bit CRC校驗采用根據(jù)生產(chǎn)多項式按bit異或的方式,需要將輸入的32bit整型數(shù)據(jù)拆分為32個單bit數(shù)據(jù)進行運算,然后將結果重新組合為32bit整型,如下所示

另外,為確保以太網(wǎng)數(shù)據(jù)包CRC校驗的真實性,在本題目中使用了Wireshark從網(wǎng)絡中隨意抓取的一個ARP廣播包,如下圖:

下面向大家說明本題目進行性能比較時采用的流程:

首先,在進行性能比較時,統(tǒng)一時間標準是必要的。由于PS端進行時間計算采用的是TTC三重定時器,將其工作頻率設為系統(tǒng)內部ARM_PLL產(chǎn)生的CPU_1X,約為133MHz。同時將其通過FCLK_CLK0信號輸出到PL端用作CRC校驗模塊的工作時鐘,能夠確保PS端與PL端的計時標準一致性,如下圖:

另外,為體現(xiàn)CRC循環(huán)冗余校驗中的“循環(huán)”特點,本人將ARP數(shù)據(jù)包的完整校驗過程分步呈現(xiàn)了出來。使用了開發(fā)板上唯一的GPIO按鍵進行過程控制,每次按鍵產(chǎn)生一次中斷,執(zhí)行一次中斷比較程序。每次中斷比較程序進行對比的數(shù)據(jù)包都會比上一次多一組(32bit),直到完整的ARP數(shù)據(jù)包完成CRC校驗,則繼續(xù)重復初始的校驗過程。

按鍵中斷程序中,首先進行PS端的CRC校驗和計時,之后將數(shù)據(jù)包通過GP總線傳送到PL端,PL端接收到完整數(shù)據(jù)包后進行自動校驗和計時,完成后將結果返回PS端,流程如下:Reset Timer—>Start Timer—>Start CRC Calculate Function—>StopTimer—>Get Counter Value—>Output PS Result—>.Packet Transmit—>StartPL CRC FSM—>Read Back Result—> Output PL Result—>Reset Control Reg—>Return.

按鍵中斷比較程序輸出內容如下:

Ø每次按鍵觸發(fā)后,首先輸出提示:

“**********CRC Calculate Begin!**************”

Ø隨后輸出本次PS與PL進行CRC校驗的數(shù)據(jù):

“---------Packet is :-----------”

“數(shù)據(jù)包內容”(32bit為一組)

“---------------------------------”

Ø首先輸出PS端CRC校驗結果以及計算時間:

“PS_CRC = 0x......; PS_CRC_TIME = ……”

Ø之后輸出PL端CRC校驗結果以及計算時間:

“PL_CRC = 0x......; PL_CRC_TIME = ……”

連續(xù)按下按鍵,則超級終端返回內容如下:

以上就是本題目的CRC算法比較流程以及PS端的實現(xiàn)方案,接下來介紹PL端的實現(xiàn)方法。

3.基于FPGA的CRC算法實現(xiàn)(PL端)

題目要求使用GP,HP,ACP總線完成數(shù)據(jù)幀的傳輸,如何完成數(shù)據(jù)幀的傳輸并界定幀的起始和截止是任務的重點。由于數(shù)據(jù)幀的長度并不大,也沒有高速傳輸?shù)囊?,因此采用了最常用的GP總線。

實現(xiàn)方案:本人選擇通過GP總線對自定義外設myip_crc_0中的4個控制/數(shù)據(jù)寄存器reg0~3進行讀寫,來完成數(shù)據(jù)幀的傳輸以及結果的返回功能。其中reg0為控制寄存器,包含標記幀起始的SOP和幀截止的EOP信號;reg1為數(shù)據(jù)寄存器,用于接收對端發(fā)送的32bit數(shù)據(jù)幀;reg2和reg3用于存儲CRC校驗的結果和消耗的時間。在一次幀傳輸開始后,所有接收的32bit數(shù)據(jù)會被自動存入FIFO中,當EOP信號有效時開始對FIFO內的全部數(shù)據(jù)進行連續(xù)的CRC校驗并進行計時,校驗完成后將結果存儲到寄存器中并返回給PS端。

設計細節(jié):生成帶有AXI從接口的自定義IP核是本題目設計中的一個重點,需要選擇好對應參數(shù),并同時生成驅動以備軟件使用:


建立好新的IP后需要在AddressEditor中為其分配地址空間

然后進入IP Packager中對其進行各項配置

并且每次修改后記得進入“Reviewand Package”中點擊”Re-package IP”進行保存。

IP核生成之后,下一步需要對AXI從接口模塊源文件“myip_crc_v1_0_S00_AXI.v”進行部分修改并在其中例化自定義功能模塊。該源文件包含AXI Slave接口中每個輸入輸出信號的含義注釋以及AXI協(xié)議功能實現(xiàn)部分的代碼注釋,方便設計人員進行閱讀和修改。

在myip_crc_v1_0_S00_AXI.v中除了例化自定義的模塊外,對協(xié)議本身部分的代碼也進行了少許修改,使寄存器reg0~reg3可以同時被PL端進行賦值,并且控制向reg1寫入的數(shù)據(jù)自動寫入FIFO中。當接收到EOP信號后,啟動CRC運算,連續(xù)讀取FIFO中的數(shù)據(jù)包并進行校驗,直到FIFO讀空后完成本次校驗并將結果寫入寄存器reg2、reg3中返回。

仿真結果:

下圖為數(shù)據(jù)包接收及校驗過程仿真,測試的是數(shù)據(jù)包長度為五的情況

下圖為五組連續(xù)的校驗結果,與超級終端返回的初始五次比較結果吻合

以上便是PL端CRC算法的設計實現(xiàn)方法。

(三)總結

本次為期兩周的Zynq極客挑戰(zhàn)賽告于段落了,對于樓主來說這次比賽的挑戰(zhàn)性還不小。困難主要體現(xiàn)在比賽之前我僅有過MicroBlaze + XPS的SOC經(jīng)驗,沒有接觸過Zynq器件和Vivado。在短時間內熟悉軟硬件、設計流程需要十分專注的學習和嘗試,并且尋找合適的學習資源。另外,時間也是一個問題,在挑戰(zhàn)期間突發(fā)的事情會打亂設計調試的進度,真正用來進行開發(fā)的時間也就一個星期左右。優(yōu)勢在于之前是做計算機網(wǎng)絡應用方面的,對題目二中CRC算法的FPGA設計實現(xiàn)有一定經(jīng)驗。最終,在規(guī)定的時間內完成了題目中的前四個要求,只是還有一些想法未能及時實現(xiàn),比如使用MAC控制器從網(wǎng)絡中實時抓取長度可變、內容較大的數(shù)據(jù)包進行CRC校驗,使本次設計具有更大的應用意義并提高設計難度。

最后,再次感謝EETOP論壇給予本次挑戰(zhàn)機會。希望越來越多的FPGA、嵌入式愛好者參與到其中,從中學習、思考、體驗,收獲更多的知識和技能。同時也祝愿中國的電子設計、制造行業(yè)能夠迅速發(fā)展,不斷進步!



關鍵詞: ARMCRC算法FPG

評論


技術專區(qū)

關閉