基于Zynq
引言
隨著數(shù)字信號處理技術(shù)的日益蓬勃發(fā)展,在雷達(dá)信號處理、航測等諸多領(lǐng)域,日益擴(kuò)張的原始數(shù)據(jù)、更加復(fù)雜和不斷增加的算法都對接口的傳輸速度提出了更高的要求,高速、穩(wěn)定、安全的傳輸接口往往成為整個項(xiàng)目的技術(shù)關(guān)鍵。千兆以太網(wǎng)從以太網(wǎng)基礎(chǔ)上發(fā)展而來,具有高效、高速、高性能等特點(diǎn),同時還可以實(shí)現(xiàn)完全的電氣隔離,是能夠適用于諸多領(lǐng)域的優(yōu)秀數(shù)據(jù)傳輸方式。本文基于xilinx的高性能Zynq-7000全可編程片上系統(tǒng),利用其ARM+FPGA架構(gòu),實(shí)現(xiàn)了千兆以太網(wǎng)的高速傳輸,一方面將嵌入式系統(tǒng)簡單化、小型化,另一方面鑒于FPGA的特性,為整個模塊提供了可觀的擴(kuò)展空間,方便功能的擴(kuò)展和算法模塊的搭建。
1平臺設(shè)計(jì)
1.1Zynq-7000系列
本文使用的硬件平臺核心為xilinx公司出品的Zynq-7000系列FPGA,其集成了處理系統(tǒng)(ProceSSingSyStem,PS)和可編程邏輯(ProgramableLogic,PL)兩大部分。PS部分包括最高可運(yùn)行1GHz的雙核ARMCortex-A9多核處理器:PL部分即xilinxFPGA,包括可配置邏輯塊(ConfigurableLogicBlock,CLB)、36kB容量的BRAM、數(shù)字信號處理DSP48E1、時鐘管理單元、可配置I/o、模數(shù)轉(zhuǎn)換器(xADC)等資源。Zynq-7000系列中的PS部分與PL部分之間包含3000個內(nèi)部互聯(lián),處理器系統(tǒng)和可編程邏輯緊密結(jié)合,內(nèi)部接口可以達(dá)到100Gbit/S以上的吞吐量,其性能完全不遜于FPGA+ARM的傳統(tǒng)組合,再加上FPGA的可反復(fù)編程特性,使得Zynq-7000系列芯片成為很多高標(biāo)準(zhǔn)平臺的選擇,使傳輸方案具備更好的擴(kuò)展性和靈活性。
l.2PS-PL接口設(shè)計(jì)
本文使用32bit位寬的AxI-HP高性能端口,利用AxIDMA模式進(jìn)行數(shù)據(jù)交互。在Zynq-7000的PL中,利用AxIDMA方式和AxI數(shù)據(jù)BRAM,通過AxI-Lite總線處理器進(jìn)行數(shù)據(jù)建立和連續(xù)傳輸。
根據(jù)設(shè)計(jì)的平臺方案,在Vivado上搭建系統(tǒng),PS與PL間為一個深度充裕的BRAM,約定一個地址作為總線狀態(tài)地址。命令字由PS至PL下發(fā)時,PS端將命令字存到BRAM固定地址,并將總線狀態(tài)寫為命令狀態(tài),PL端檢測到命令狀態(tài)時開始對BRAM進(jìn)行讀操作,讀取約定長度的命令字?jǐn)?shù)據(jù)。當(dāng)數(shù)據(jù)從PL至PS上傳時,PL端首先對總線狀態(tài)地址進(jìn)行監(jiān)測,檢測到總線狀態(tài)為忙狀態(tài)時,則不進(jìn)行數(shù)據(jù)上傳:檢測到總線狀態(tài)為非忙狀態(tài)時,PL端開始對BRAM進(jìn)行寫操作,將固定長度的數(shù)據(jù)寫入BRAM中,同時向PS端發(fā)送一個F2P的中斷,PS端檢測到中斷后開始對BRAM進(jìn)行讀操作,將固定長度的數(shù)據(jù)讀出并做下一步處理,處理完成后將總線狀態(tài)寫為閑狀態(tài),PL端檢測到總線狀態(tài)重新變?yōu)殚e時開始下一次數(shù)據(jù)寫入。利用上述的握手機(jī)制,可以保證上下行數(shù)據(jù)高速連續(xù)地傳輸,避免出現(xiàn)因PS端處理速度造成的丟包現(xiàn)象。
1.3模塊整體架構(gòu)
模塊整體架構(gòu)設(shè)計(jì)如圖1所示。
上行數(shù)據(jù)通過在RAM進(jìn)行緩存后,通過PS-PL接口傳送至ARM進(jìn)行打包處理,利用UDP協(xié)議通過AR8035芯片和網(wǎng)口發(fā)送到通用計(jì)算機(jī):下行命令字通過千兆網(wǎng)口傳送到ARM進(jìn)行打包,然后通過PS-PL接口傳送至PL側(cè)FPGA中的RAM進(jìn)行緩存,向下發(fā)送。
1.4程序設(shè)計(jì)
1.4.1FPGA程序設(shè)計(jì)
FPGA程序使用VHDL語言編寫,數(shù)據(jù)幀的形式如圖2所示。
為了提高數(shù)據(jù)上傳效率,每次AxIDMA傳輸上傳10幀數(shù)據(jù)。FPGA接到底層傳輸上來的數(shù)據(jù)后,將數(shù)據(jù)存入一個上行緩存RAM,當(dāng)檢測到總線狀態(tài)為閑狀態(tài)并且緩存RAM中數(shù)據(jù)滿10幀時,啟動上傳使能,將10幀數(shù)據(jù)通過120MHz時鐘以32位寬的形式存入總線BRAM中的約定地址并發(fā)送中斷信號。然后不斷監(jiān)控狀態(tài)地址,當(dāng)總線狀態(tài)完成一次由閑變忙再變閑后,開始下一次BRAM的寫操作。
當(dāng)命令數(shù)據(jù)下行,FPGA檢測到總線狀態(tài)為命令狀態(tài)時,開始對總線BRAM進(jìn)行讀操作,讀取約定地址上的1024字節(jié)的命令數(shù)據(jù)存入下行的緩存RAM,通過RAM轉(zhuǎn)換成適合下層使用的位寬后向下發(fā)送。
1.4.2ARM程序設(shè)計(jì)
ARM程序使用C語言編寫,當(dāng)檢測到F2P中斷時開始數(shù)據(jù)上傳流程,將狀態(tài)置為忙,從BRAM中讀取數(shù)據(jù),將數(shù)據(jù)拆分為10幀,分別判斷幀頭,將正確的幀頭通過UDP協(xié)議上傳,并設(shè)置狀態(tài)為閑:當(dāng)接收到上位機(jī)命令時,將幀頭正確的命令數(shù)據(jù)寫入BRAM,并設(shè)置狀態(tài)為命令狀態(tài),提醒FPGA接收。數(shù)據(jù)上行程序流程如圖3所示。
2模塊測試
完成軟硬件設(shè)計(jì)后,對模塊進(jìn)行功能和穩(wěn)定性測試。測試命令下行時,使用網(wǎng)口調(diào)試助手下發(fā)正確格式的命令包,通過VivadoHardware觀察接收的命令是否正確:測試數(shù)據(jù)上行時,使用wireShark抓取數(shù)據(jù)包,觀察數(shù)據(jù)幀頭流水號是否連續(xù),若連續(xù)則說明傳輸正常不丟包,若不連續(xù)則證明傳輸不正確。
經(jīng)過測試,數(shù)據(jù)上行和命令下行功能正常,傳輸不丟包,且速度高達(dá)640MbpS,滿足高速、穩(wěn)定的要求。
3結(jié)語
本文基于Zynq-7000全可編程片上系統(tǒng)的硬、軟件相結(jié)合的設(shè)計(jì),成功搭建了千兆以太網(wǎng)傳輸模塊,與通用計(jì)算機(jī)互聯(lián)傳輸高速、穩(wěn)定,使用UDP協(xié)議傳輸速度達(dá)到640MbpS。模塊使用高性能Zynq-7000系列芯片,將嵌入式系統(tǒng)和可編程邏輯器件緊密結(jié)合,架構(gòu)靈活且方便擴(kuò)展,為多種領(lǐng)域的數(shù)據(jù)傳輸提供了一個高速、穩(wěn)定、低成本的解決方案。