唐文武 袁子喬
(西安電子工程研究所 西安 710100)
隨著信息化時(shí)代的深入發(fā)展,信號(hào)處理系統(tǒng)往往需要具備極高的數(shù)據(jù)處理能力和傳輸能力,以滿足信息的有效性與實(shí)時(shí)性。針對(duì)信號(hào)處理系統(tǒng)的傳輸性能要求,本文將著重介紹一種高速IO口——串行高速IO口(Serial Rapid I/O,SRIO)。RapidIO主要是一種基于數(shù)據(jù)包交換的互聯(lián)體系結(jié)構(gòu)[1],在處理器互連、存儲(chǔ)子系統(tǒng)、通用計(jì)算平臺(tái)等場(chǎng)合得到廣泛應(yīng)用。自2001年3月發(fā)布RapidIO1.1規(guī)范以來,RapidIO規(guī)范在不斷迭代更新,傳輸速率也在不斷提高,如今的RapidIO2.x規(guī)范已支持最高達(dá)6.25GHz的傳輸速率。RapidIO能夠滿足高性能嵌入式系統(tǒng)中板內(nèi)多DSP與FPGA高速數(shù)據(jù)傳輸?shù)募夹g(shù)要求,并克服傳統(tǒng)互連模式存在的局限性,其在高性能嵌入式系統(tǒng)中的表現(xiàn)已得到業(yè)界的廣泛認(rèn)可。
本文旨在介紹SRIO接口及其協(xié)議,并重點(diǎn)介紹封裝SRIO工程的必要性及自定義SRIO工程IP核使用問題,為此本文將按照如下章節(jié)安排進(jìn)行論述:
1)第一節(jié):對(duì)SRIO技術(shù)及其應(yīng)用作簡(jiǎn)要概述,指出NREAD與SWRITE包包頭格式。
2)第二節(jié):介紹了本文對(duì)SRIO工程改進(jìn)之處并進(jìn)行仿真驗(yàn)證,最后介紹封裝后的用戶IP及其調(diào)用方法。
3)第三節(jié):總結(jié)本次改進(jìn)工作,提出待改善的問題。
串行高速IO口(Serial Rapid I/O,SRIO)是RapidIO標(biāo)準(zhǔn)的一種,其物理層數(shù)據(jù)傳輸過程是串行的。本文著重介紹串行RapidIO標(biāo)準(zhǔn),即串行高速IO口(Serial Rapid I/O,SRIO)。串行RapidIO在數(shù)據(jù)傳輸中使用了串行差分信號(hào)傳輸?shù)姆绞?。這樣的傳輸方式能有效地抑制干擾,提高傳輸距離,如圖1所示,每個(gè)tx或rx代表一對(duì)差分信號(hào)線,數(shù)據(jù)包通過兩根串行差分信號(hào)線進(jìn)行傳輸。
圖1 SRIO傳輸示意圖
除了物理層之外,RapidIO還包含邏輯層和傳輸層,此三層協(xié)議共同構(gòu)成RapidIO協(xié)議,對(duì)RapidIO協(xié)議有所了解有助于用戶理解和使用,下面對(duì)SRIO協(xié)議做簡(jiǎn)要介紹。
RapidIO協(xié)議由邏輯層、傳輸層和物理層構(gòu)成,為此互連技術(shù)提供相關(guān)的規(guī)范標(biāo)準(zhǔn)。RapidIO協(xié)議中邏輯層位于最高層,規(guī)定了包格式和所有的協(xié)議,為端點(diǎn)器件發(fā)起、完成事務(wù)提供了必要的信息。RapidIO支持直接IO/DMA和消息傳遞兩類事務(wù),其中直接IO/DMA事務(wù)又可分為NREAD(帶響應(yīng)的讀事務(wù))和SWRITE(流寫事務(wù))等。RapidIO協(xié)議規(guī)定在傳輸有效數(shù)據(jù)之前,需先傳包頭,包頭包含了數(shù)據(jù)傳輸需要的相關(guān)信息,如定義格式類型的FTYPE字段,定義傳輸類型的TTYPE字段,一個(gè)完整的請(qǐng)求包和響應(yīng)包包頭格式分別如圖2(a)和圖2(b)所示。
圖2 HELLO包包頭格式
在工程應(yīng)用中,用戶只需了解邏輯層的各個(gè)字段含義即可。其中不同的FTYPE字段和TTYPE字段可唯一確定事務(wù)功能,下表1給出了工程中用到的NREAD模式和SWRITE模式HELLO包包頭格式。
表1 邏輯層HELLO格式包包頭
在高性能的嵌入式系統(tǒng)中,數(shù)據(jù)處理的快慢不僅取決于數(shù)字信號(hào)處理器(Digital Signal Processor,DSP)與FPGA處理能力[2-3],數(shù)據(jù)傳輸線路的傳輸性能也會(huì)影響到整個(gè)系統(tǒng)的效率。采用多通道并行傳輸?shù)姆绞?,可有效地提高?shù)據(jù)傳輸速率、降低延時(shí)[4]?;谏鲜鲂枨?,本文提出以多通道(4X模式)SRIO互連技術(shù)作為作為數(shù)據(jù)傳輸方式,并采用其NREAD模式及SWRITE模式實(shí)現(xiàn)數(shù)據(jù)的有序分發(fā),通過對(duì)FPGA中SRIO工程的模塊化改進(jìn),實(shí)現(xiàn)更為高效的編程使用。
在雷達(dá)信號(hào)處理中,通常每秒需要幾十至幾百次運(yùn)算[5],這無疑對(duì)數(shù)據(jù)吞吐量提出巨大挑戰(zhàn)。為了提高傳輸效率,在本次改進(jìn)工作中,我們規(guī)定SWRITE事務(wù)每次傳輸256字節(jié)數(shù)。其次,本文以簡(jiǎn)化雙口RAM存儲(chǔ)方式替代原先的FIFO存儲(chǔ),其優(yōu)勢(shì)在于與FIFO存儲(chǔ)方式相比,RAM對(duì)存儲(chǔ)單元是可尋址的,便于實(shí)現(xiàn)每寫32個(gè)8字節(jié)數(shù)自動(dòng)發(fā)送的功能,用戶只需按照一定時(shí)序?qū)?shù)據(jù)寫入RAM即可,不需要考慮何時(shí)發(fā)送及與發(fā)送相關(guān)的問題,極大地簡(jiǎn)化了使用過程。改進(jìn)后的SRIO工程傳輸原理如圖3所示。
圖3 基于RAM的SRIO工程數(shù)據(jù)傳輸原理
SWRITE模式具有打包效率高、傳輸穩(wěn)定的特點(diǎn)[6],對(duì)模塊化設(shè)計(jì)的SRIO工程進(jìn)行仿真時(shí)設(shè)立my_ireq_tlast信號(hào),在每次傳輸至最后一個(gè)數(shù)據(jù)時(shí)將其拉高,因此兩個(gè)相鄰my_ireq_tlast脈沖的時(shí)間間隔即為完成一次數(shù)據(jù)包傳輸所消耗的時(shí)間。經(jīng)過改進(jìn)的SWRITE事務(wù)的用戶數(shù)據(jù)寫入時(shí)序如仿真圖4所示。
仿真圖時(shí)序關(guān)系為,當(dāng)srio_init_done拉高時(shí),表明SRIO初始化完成;此時(shí)用于時(shí)序控制的寫使能控制計(jì)數(shù)器dv_cnt在RAM寫時(shí)鐘ram_wr_clk下開始累加。由圖4可知,發(fā)送復(fù)位信號(hào)rst_send隨著dv_cnt累加至一定值作周期性拉高數(shù)個(gè)ram_wr_clk;rst_send脈沖后延時(shí)2個(gè)寫時(shí)鐘,寫使能dv_data_send拉高,8字節(jié)數(shù)data_send按照ram_wr_clk節(jié)拍寫入RAM中;每寫入32個(gè)data_send時(shí),程序自動(dòng)觸發(fā)SRIO讀取RAM數(shù)據(jù)并發(fā)送操作。
圖4 SWRITE事務(wù)時(shí)序圖
仿真中將SRIO的發(fā)送總線與接收總線相連,因此在正確傳輸數(shù)據(jù)時(shí),數(shù)據(jù)接收總線data_send應(yīng)接收到與數(shù)據(jù)發(fā)送總線val_treq_tdata_out上的數(shù)據(jù)。本次仿真中,發(fā)送數(shù)據(jù)按字節(jié)累加寫入data_send,如圖5(a)所示,data_send為一按字節(jié)遞增數(shù)。在數(shù)據(jù)接收端val_treq_tdata_out上接收到與data_send相同的數(shù)據(jù),如圖5(b)所示,說明本此改進(jìn)后的SRIO工程能正確地傳輸數(shù)據(jù)。
圖5 仿真發(fā)送與接收的數(shù)據(jù)包
再觀察數(shù)據(jù)包包頭,按照協(xié)議,在每次傳輸256字節(jié)情況下SWRITE模式邏輯層包頭應(yīng)為0060_xffx_xxxx_xxxx,這里x代表未定數(shù),各字段含義參照表1所示。根據(jù)仿真結(jié)果,如圖6所示,發(fā)送數(shù)據(jù)第一包為包頭,其值為0060_2ff0_0c30_0000,可知FTYPE字段的值為6,表明這是一個(gè)SWRITE事務(wù)。
圖6 SWRITE請(qǐng)求事務(wù)包頭信息
為了對(duì)比不帶響應(yīng)的SWRITE事務(wù)與帶響應(yīng)的NREAD事務(wù),本節(jié)將分析NREAD事務(wù)數(shù)據(jù)交換流程,確定兩者差異,為工程應(yīng)用提供參考。NREAD請(qǐng)求事務(wù)僅包含HELLO格式包頭,包頭提供了必要的信息,仿真結(jié)果顯示其包頭數(shù)據(jù)為xx24_2ff0_00c3_0000,x代表未定數(shù),按照表1對(duì)應(yīng)關(guān)系可知FTYPE字段為2,TTYPE字段為4,說明這是一個(gè)NREAD事物包,仿真結(jié)果如圖7所示,val_ireq_tvalid與val_ireq_tready同時(shí)為高時(shí),val_ireq_tdata上的數(shù)據(jù)即為包頭數(shù)據(jù)。
圖7 NREAD請(qǐng)求事務(wù)包頭信息
NREAD事務(wù)的發(fā)起方提供數(shù)據(jù)交流所需的必要信息,目標(biāo)方則需要對(duì)此進(jìn)行響應(yīng),按發(fā)起方的要求將數(shù)據(jù)發(fā)送給發(fā)起方。響應(yīng)事務(wù)HELLO格式包頭類似于表1,響應(yīng)事務(wù)的FTYPE=13,TTYPE=8。
在FPGA向DSP進(jìn)行雷達(dá)數(shù)據(jù)分發(fā)時(shí),若采用SWRITE事務(wù)類型,F(xiàn)PGA主動(dòng)向DSP發(fā)送數(shù)據(jù),數(shù)據(jù)分發(fā)效率較高,需要DSP進(jìn)行及時(shí)處理;若采用NREAD事務(wù)類型,DSP主動(dòng)向FPGA請(qǐng)求數(shù)據(jù),在DSP處理性能較低或處理任務(wù)量巨大時(shí)可采用此事務(wù)類型。
原SRIO工程可全面測(cè)試SRIO各項(xiàng)功能,并生成一些報(bào)告信息,其源文件較多,且源代碼較混亂,不適用于實(shí)際工程。針對(duì)工程應(yīng)用,在確保仿真各項(xiàng)邏輯無誤且編譯通過的情況下,本文改進(jìn)工作簡(jiǎn)化了SRIO工程,去除冗余代碼及模塊,達(dá)到了提升工程模塊化設(shè)計(jì)和提高應(yīng)用效率的預(yù)期效果,工程包含了四個(gè)模塊,分別為:
1)top_srio_app.v模塊:工程的頂層模塊,負(fù)責(zé)本地設(shè)備與遠(yuǎn)端設(shè)備進(jìn)行信息交互,用戶可通過該模塊給SRIO核與RAM提供時(shí)鐘、系統(tǒng)復(fù)位、數(shù)據(jù)寫入與接收等操作;
2)srio_gen.v模塊:工程的中間模塊,作為頂層模塊top_srio_app.v與底層請(qǐng)求/響應(yīng)模塊的數(shù)據(jù)與控制交換中心,并例化了SRIO IP核;
3)srio_request_gen.v模塊:底層模塊,用于接收srio_gen.v模塊下傳的數(shù)據(jù)與控制信號(hào),并按照RapidIO協(xié)議產(chǎn)生與請(qǐng)求包相應(yīng)的數(shù)據(jù)與控制信號(hào);
4)srio_response_gen.v模塊:底層模塊,模塊功能與srio_request_gen.v模塊相似,只是其產(chǎn)生的是響應(yīng)包的數(shù)據(jù)與控制信號(hào)。如前文所述,本次改進(jìn)工作在SWRITE事務(wù)數(shù)據(jù)緩存上,采用了一個(gè)寬度64bit,深度512的RAM代替FIFO。
為進(jìn)一步提高該工程的便捷性、可移植性,遵循“三化”原則,本文將改進(jìn)后的SRIO工程在vivado環(huán)境下封裝成用戶IP核,封裝后的IP核仿真工程結(jié)構(gòu)如圖8所示,對(duì)比封裝前工程,封裝后工程得到大幅簡(jiǎn)化,并且封裝內(nèi)部變量與模塊,引出輸入輸出引腳供用戶使用,實(shí)現(xiàn)了工程模塊化設(shè)計(jì)。封裝后的SRIO工程即為用戶自定義IP核,其引腳圖如圖9所示,左側(cè)信號(hào)是輸入,右側(cè)信號(hào)是輸出。
圖8 封裝后的SRIO工程結(jié)構(gòu)
圖9 封裝后的用戶自定義IP核
本用戶IP核控制邏輯與時(shí)序見2.2節(jié),各引腳說明見表2所示。
表2 用戶IP核引腳說明
使用本用戶IP核時(shí),需先將IP核拷貝到個(gè)人計(jì)算機(jī),然后在vivado工程管理界面中添加該IP核至個(gè)人工程中,最后即可在IP目錄下找到該用戶IP核,雙擊調(diào)用即可。在使用中,為了避免丟包情況發(fā)生,在可接受范圍內(nèi)應(yīng)盡可能降低寫使能信號(hào)占空比。
本文按照“三化”要求,緊密結(jié)合工程應(yīng)用現(xiàn)狀,對(duì)FPGA中的SRIO工程進(jìn)行改進(jìn),改進(jìn)工作主要圍繞以RAM存儲(chǔ)方式取代FIFO以及SWRITE事務(wù)下每次寫入32×8字節(jié)數(shù)自動(dòng)觸發(fā)發(fā)送過程,最后對(duì)改進(jìn)的SRIO工程實(shí)行封裝用戶自定義IP核,致力于解決SRIO工程中信號(hào)定義及控制邏輯不統(tǒng)一,移植效率較低的問題。實(shí)際驗(yàn)證表明,本次改進(jìn)工作取得良好的預(yù)期效果,但仍存在待解決的問題,如發(fā)送帶寬從時(shí)序上及存儲(chǔ)上有待優(yōu)化,特別是在避免丟包漏包的問題上,可能存在更優(yōu)的處理方案,以實(shí)現(xiàn)寫使能信號(hào)占空比的最大化,進(jìn)一步提高帶寬。