基于ARM的CRC算法和基于FPGA的算法性能比較
題目分析:本題目的設(shè)計(jì)意圖在于使用FPGA中硬件資源對(duì)某些流程固定的軟件算法進(jìn)行加速,即algorithm-hardware codesign,是軟硬協(xié)同設(shè)計(jì)中更為具體的一種形式,本題目中的CRC算法只是其中一種實(shí)例。這種由硬件電路實(shí)現(xiàn)的軟件算法通常能夠很大程度上的降低計(jì)算時(shí)間,代價(jià)僅是FPGA內(nèi)部所消耗的一些邏輯、存儲(chǔ)資源,但對(duì)于如今的FPGA芯片來(lái)講是完全可以接受的。本題目的設(shè)立將充分驗(yàn)證MicroZed開發(fā)板中Zynq系列芯片的優(yōu)勢(shì),因?yàn)樗闪烁咝阅?strong>ARM處理器內(nèi)核、充足外設(shè)資源和FPGA邏輯資源,對(duì)于軟硬件協(xié)同設(shè)計(jì)的嵌入式應(yīng)用,是很好的選擇。
本文引用地址:http://www.ex-cimer.com/article/201611/317911.htm(二)過(guò)程說(shuō)明
1.軟件學(xué)習(xí):Vivado+ SDK
要在兩周時(shí)間內(nèi)完成挑戰(zhàn)題目,需盡快學(xué)會(huì)題目規(guī)定的Vivado + SDK軟件開發(fā)流程。其中第一個(gè)目標(biāo)就是要搭建起基于ARM CortexA9的嵌入式系統(tǒng),才能夠進(jìn)行下一步CRC算法的實(shí)現(xiàn)和調(diào)試。在Vivado 2013.4及以上的版本中都包含支持MicroZed開發(fā)板的硬件定義和板級(jí)支持包,新建工程時(shí)選中就會(huì)將開發(fā)板的所有信息導(dǎo)入到工程中,十分快捷。
有很多網(wǎng)友或MicroZed、Zynq使用者上傳過(guò)很詳細(xì)的圖文開發(fā)流程,在這里我就不再重復(fù)演示了。這些教程包含了從入門級(jí)到專家級(jí)的MicroZed開發(fā)板、Vivado/SDK軟件使用教程甚至代碼。正是由于這些人樂(lè)于分享的精神,才使得國(guó)內(nèi)FPGA設(shè)計(jì)技術(shù)能夠快速、深入的發(fā)展起來(lái)。在這里跟大家推薦一個(gè)名字叫“亞當(dāng)泰勒玩轉(zhuǎn)MicroZed”的連載,中英版都有,但英文版的更全一些。這個(gè)入門級(jí)的圖文教學(xué)可以教大家如何從一個(gè)新手快速熟悉基于Vivado+SDK的MicroZed開發(fā)流程,本題目能夠順利完成離不開這位外國(guó)友人的幫助。連載中除了說(shuō)明開發(fā)板的使用、軟件設(shè)計(jì)/調(diào)試流程外,還包含部分PS基本外設(shè)的使用方法,比如GPIO、中斷控制器、三重定時(shí)器以及PS與PL進(jìn)行通信使用的AXI4總線搭建/調(diào)試方法等。在這里提一下用Vivado進(jìn)行設(shè)計(jì)的一個(gè)典型特點(diǎn):在搭建嵌入式硬件系統(tǒng)時(shí),它采用的是模塊圖的形式比PlanAhead更直觀一些,下圖就是本題目最終設(shè)計(jì)的系統(tǒng)模塊圖:
其中包含了CortexA9處理器系統(tǒng)、AXI總線互連IP以及PL實(shí)現(xiàn)的自定義CRC算法IP。
2.基于ARM的CRC算法實(shí)現(xiàn)(PS端)及性能比較流程
軟件CRC算法實(shí)現(xiàn)方法有很多種,目前大多使用查表法,具有較低的算法復(fù)雜度和運(yùn)行時(shí)間。但是此題目的目的在于比較硬件加速對(duì)某種軟件算法的性能提升,需要使用與PL端相同的算法實(shí)現(xiàn)才更有說(shuō)服性。所以在ARM中實(shí)現(xiàn)的32bit CRC校驗(yàn)采用根據(jù)生產(chǎn)多項(xiàng)式按bit異或的方式,需要將輸入的32bit整型數(shù)據(jù)拆分為32個(gè)單bit數(shù)據(jù)進(jìn)行運(yùn)算,然后將結(jié)果重新組合為32bit整型,如下所示
另外,為確保以太網(wǎng)數(shù)據(jù)包CRC校驗(yàn)的真實(shí)性,在本題目中使用了Wireshark從網(wǎng)絡(luò)中隨意抓取的一個(gè)ARP廣播包,如下圖:
下面向大家說(shuō)明本題目進(jìn)行性能比較時(shí)采用的流程:
首先,在進(jìn)行性能比較時(shí),統(tǒng)一時(shí)間標(biāo)準(zhǔn)是必要的。由于PS端進(jìn)行時(shí)間計(jì)算采用的是TTC三重定時(shí)器,將其工作頻率設(shè)為系統(tǒng)內(nèi)部ARM_PLL產(chǎn)生的CPU_1X,約為133MHz。同時(shí)將其通過(guò)FCLK_CLK0信號(hào)輸出到PL端用作CRC校驗(yàn)?zāi)K的工作時(shí)鐘,能夠確保PS端與PL端的計(jì)時(shí)標(biāo)準(zhǔn)一致性,如下圖:
另外,為體現(xiàn)CRC循環(huán)冗余校驗(yàn)中的“循環(huán)”特點(diǎn),本人將ARP數(shù)據(jù)包的完整校驗(yàn)過(guò)程分步呈現(xiàn)了出來(lái)。使用了開發(fā)板上唯一的GPIO按鍵進(jìn)行過(guò)程控制,每次按鍵產(chǎn)生一次中斷,執(zhí)行一次中斷比較程序。每次中斷比較程序進(jìn)行對(duì)比的數(shù)據(jù)包都會(huì)比上一次多一組(32bit),直到完整的ARP數(shù)據(jù)包完成CRC校驗(yàn),則繼續(xù)重復(fù)初始的校驗(yàn)過(guò)程。
按鍵中斷程序中,首先進(jìn)行PS端的CRC校驗(yàn)和計(jì)時(shí),之后將數(shù)據(jù)包通過(guò)GP總線傳送到PL端,PL端接收到完整數(shù)據(jù)包后進(jìn)行自動(dòng)校驗(yàn)和計(jì)時(shí),完成后將結(jié)果返回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.
按鍵中斷比較程序輸出內(nèi)容如下:
Ø每次按鍵觸發(fā)后,首先輸出提示:
“**********CRC Calculate Begin!**************”
Ø隨后輸出本次PS與PL進(jìn)行CRC校驗(yàn)的數(shù)據(jù):
“---------Packet is :-----------”
“數(shù)據(jù)包內(nèi)容”(32bit為一組)
“---------------------------------”
Ø首先輸出PS端CRC校驗(yàn)結(jié)果以及計(jì)算時(shí)間:
“PS_CRC = 0x......; PS_CRC_TIME = ……”
Ø之后輸出PL端CRC校驗(yàn)結(jié)果以及計(jì)算時(shí)間:
“PL_CRC = 0x......; PL_CRC_TIME = ……”
連續(xù)按下按鍵,則超級(jí)終端返回內(nèi)容如下:
以上就是本題目的CRC算法比較流程以及PS端的實(shí)現(xiàn)方案,接下來(lái)介紹PL端的實(shí)現(xiàn)方法。
3.基于FPGA的CRC算法實(shí)現(xiàn)(PL端)
題目要求使用GP,HP,ACP總線完成數(shù)據(jù)幀的傳輸,如何完成數(shù)據(jù)幀的傳輸并界定幀的起始和截止是任務(wù)的重點(diǎn)。由于數(shù)據(jù)幀的長(zhǎng)度并不大,也沒(méi)有高速傳輸?shù)囊螅虼瞬捎昧俗畛S玫腉P總線。
實(shí)現(xiàn)方案:本人選擇通過(guò)GP總線對(duì)自定義外設(shè)myip_crc_0中的4個(gè)控制/數(shù)據(jù)寄存器reg0~3進(jìn)行讀寫,來(lái)完成數(shù)據(jù)幀的傳輸以及結(jié)果的返回功能。其中reg0為控制寄存器,包含標(biāo)記幀起始的SOP和幀截止的EOP信號(hào);reg1為數(shù)據(jù)寄存器,用于接收對(duì)端發(fā)送的32bit數(shù)據(jù)幀;reg2和reg3用于存儲(chǔ)CRC校驗(yàn)的結(jié)果和消耗的時(shí)間。在一次幀傳輸開始后,所有接收的32bit數(shù)據(jù)會(huì)被自動(dòng)存入FIFO中,當(dāng)EOP信號(hào)有效時(shí)開始對(duì)FIFO內(nèi)的全部數(shù)據(jù)進(jìn)行連續(xù)的CRC校驗(yàn)并進(jìn)行計(jì)時(shí),校驗(yàn)完成后將結(jié)果存儲(chǔ)到寄存器中并返回給PS端。
設(shè)計(jì)細(xì)節(jié):生成帶有AXI從接口的自定義IP核是本題目設(shè)計(jì)中的一個(gè)重點(diǎn),需要選擇好對(duì)應(yīng)參數(shù),并同時(shí)生成驅(qū)動(dòng)以備軟件使用:
建立好新的IP后需要在AddressEditor中為其分配地址空間
然后進(jìn)入IP Packager中對(duì)其進(jìn)行各項(xiàng)配置
并且每次修改后記得進(jìn)入“Reviewand Package”中點(diǎn)擊”Re-package IP”進(jìn)行保存。
IP核生成之后,下一步需要對(duì)AXI從接口模塊源文件“myip_crc_v1_0_S00_AXI.v”進(jìn)行部分修改并在其中例化自定義功能模塊。該源文件包含AXI Slave接口中每個(gè)輸入輸出信號(hào)的含義注釋以及AXI協(xié)議功能實(shí)現(xiàn)部分的代碼注釋,方便設(shè)計(jì)人員進(jìn)行閱讀和修改。
在myip_crc_v1_0_S00_AXI.v中除了例化自定義的模塊外,對(duì)協(xié)議本身部分的代碼也進(jìn)行了少許修改,使寄存器reg0~reg3可以同時(shí)被PL端進(jìn)行賦值,并且控制向reg1寫入的數(shù)據(jù)自動(dòng)寫入FIFO中。當(dāng)接收到EOP信號(hào)后,啟動(dòng)CRC運(yùn)算,連續(xù)讀取FIFO中的數(shù)據(jù)包并進(jìn)行校驗(yàn),直到FIFO讀空后完成本次校驗(yàn)并將結(jié)果寫入寄存器reg2、reg3中返回。
仿真結(jié)果:
下圖為數(shù)據(jù)包接收及校驗(yàn)過(guò)程仿真,測(cè)試的是數(shù)據(jù)包長(zhǎng)度為五的情況
下圖為五組連續(xù)的校驗(yàn)結(jié)果,與超級(jí)終端返回的初始五次比較結(jié)果吻合
以上便是PL端CRC算法的設(shè)計(jì)實(shí)現(xiàn)方法。
(三)總結(jié)
本次為期兩周的Zynq極客挑戰(zhàn)賽告于段落了,對(duì)于樓主來(lái)說(shuō)這次比賽的挑戰(zhàn)性還不小。困難主要體現(xiàn)在比賽之前我僅有過(guò)MicroBlaze + XPS的SOC經(jīng)驗(yàn),沒(méi)有接觸過(guò)Zynq器件和Vivado。在短時(shí)間內(nèi)熟悉軟硬件、設(shè)計(jì)流程需要十分專注的學(xué)習(xí)和嘗試,并且尋找合適的學(xué)習(xí)資源。另外,時(shí)間也是一個(gè)問(wèn)題,在挑戰(zhàn)期間突發(fā)的事情會(huì)打亂設(shè)計(jì)調(diào)試的進(jìn)度,真正用來(lái)進(jìn)行開發(fā)的時(shí)間也就一個(gè)星期左右。優(yōu)勢(shì)在于之前是做計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用方面的,對(duì)題目二中CRC算法的FPGA設(shè)計(jì)實(shí)現(xiàn)有一定經(jīng)驗(yàn)。最終,在規(guī)定的時(shí)間內(nèi)完成了題目中的前四個(gè)要求,只是還有一些想法未能及時(shí)實(shí)現(xiàn),比如使用MAC控制器從網(wǎng)絡(luò)中實(shí)時(shí)抓取長(zhǎng)度可變、內(nèi)容較大的數(shù)據(jù)包進(jìn)行CRC校驗(yàn),使本次設(shè)計(jì)具有更大的應(yīng)用意義并提高設(shè)計(jì)難度。
最后,再次感謝EETOP論壇給予本次挑戰(zhàn)機(jī)會(huì)。希望越來(lái)越多的FPGA、嵌入式愛(ài)好者參與到其中,從中學(xué)習(xí)、思考、體驗(yàn),收獲更多的知識(shí)和技能。同時(shí)也祝愿中國(guó)的電子設(shè)計(jì)、制造行業(yè)能夠迅速發(fā)展,不斷進(jìn)步!
評(píng)論