摘要: 現代信號處理系統(tǒng)通常需要在不同處理器之間實現高速數據通信,SRIO協(xié)議由于高效率、低延時的特性被廣泛使用。本文研究了在FPGA和DSP兩種處理器之間實現SRIO協(xié)議的方法,并通過電路設計和利用處理器的開發(fā)工具編程實現了兩種處理器間的高速通信。經測試,該系統(tǒng)具有較高的傳輸效率。
引言
隨著高性能信號處理系統(tǒng)對運算速度、通信速率等要求的不斷提高,單獨的處理器(如FPGA或DSP)無法滿足高速實時信號處理的需求。TI公司的多核DSP處理性能強大,但是并行性不強,難以適應計算異常密集的應用,另外集成性的DSP接口也影響了數據傳輸的靈活性;FPGA具有極強的并行性,適合密集計算應用,而且可配置I/O和IP核支持多種數據傳輸接口,但FPGA的內部邏輯資源和存儲資源有限,并且開發(fā)難度大,實現復雜算法也比較困難。因此,結合多核DSP和FPGA的優(yōu)勢,構建基于異構處理器的信號處理系統(tǒng)成為當前一種發(fā)展趨勢。異構處理器間的高速通信成為高速信號處理系統(tǒng)[1]的關鍵問題之一,本文基于SRIO協(xié)議設計和實現了DSP與FPGA之間的高速數據通信。
1異構處理器電路
1.1DSP處理器
在處理器領域,多核DSP在處理性能、功耗和面積上都有很大優(yōu)勢,得到了廣泛應用。TI公司的8核處理器TMS320C6678[2],基于KeyStone多核結構,具有高性能的浮點、定點計算能力,單核具有1 GHz的主頻,運算速度可達320 GMACS/160 GFLOPS。該DSP采用同構多核架構,每個核可以獨立地執(zhí)行不同的計算任務,具有512 KB的私有內存。芯片具有4 MB共享內存供8個核心訪問,而且具有SRIO、PCIe等多種接口,能夠滿足各種數據傳輸的需求。
1.2FPGA處理器
FPGA因其功能強大、接口靈活,成為當前的主流處理器之一,FPGA與DSP芯片有機結合不僅能夠高效地實現復雜算法,而且還可以提高系統(tǒng)數據傳輸的效率和結構的靈活性。Xilinx公司Virtex6 LXT系列FPGA芯片XC6VLX550T,是一款具有高級串行數據傳輸功能的高性能邏輯器件,基于硬件GTX串行收發(fā)器,可以實現多種高速數據傳輸接口。采用SRIO IP核可以實現FPGA和DSP之間的SRIO協(xié)議通信。
1.3異構處理器電路互連
RapidIO[3]協(xié)議是一個開放的點對點分組交換標準,是面向嵌入式系統(tǒng)開發(fā)提出的高可靠、高性能、基于包交換的互連技術。串行RapidIO[4](SRIO)是采用串行差分模擬信號傳輸的RapidIO協(xié)議,基于SerDes(Serialize Deserialize)技術,采用差分交流耦合信號(具有抗干擾能力強、速率高、傳輸距離較遠等優(yōu)點),所以SRIO是一個針對嵌入式系統(tǒng)應用的高性能、低引腳數的高速互連接口。
SRIO協(xié)議分為3層:邏輯層、傳輸層和物理層。邏輯層定義了操作協(xié)議;傳輸層定義了包交換、路由和尋址機制;物理層定義了電氣特性、鏈路控制和糾錯重傳等。SRIO是基于包交換的高速互連技術,其數據包是由包頭、有效的數據載荷和16位CRC校驗組成。包頭的長度根據包類型不同,可能為十幾到二十幾個字節(jié),最大的有效載荷長度為256字節(jié)。由于包長度短,所以傳輸延時較小,硬件上也易于實現,適合數字信號處理場合對傳輸延時要求較高的應用。
TMS320C6678集成了支持SRIOv2.1通信協(xié)議的4通道SRIO接口,可以實現每條通路1.25 Gbps、2.5 Gbps、3.125 Gbps、5 Gbps的通信速率。XC6VLX550T的GTX模塊嵌入Serial RapidIO IP核,可支持線速率為1.25 Gbps,2.5 Gbps~3.125 Gbps,因此可實現異構處理器DSP與FPGA之間的SRIO高速串行通信。
為了最大程度地體現RapidIO串行接口的性能,本設計中采用3.125 Gbps的線速率,處理器之間采用4xSRIO連接方式, 1個1x接口即是一個差分對的一對讀/寫信號,一個4x接口即4個此類差分對的結合,因此采用4x SRIO連接可實現最高12.5 Gbps的數據傳輸速率。電路連接方式如圖1所示,只需要將DSP的TX、RX端口與FPGA的RX、TX端口對應相接,由于SRIO采用差分線對實現數據傳輸,所以需要在異構處理器的RX端口的差分線上串聯(lián)一個0.1 μF的電容,做交流耦合使用。
?
圖1 異構處理器連接方式
2 SRIO設計
DSP和FPGA作為SRIO連接的端點器件,兩者可互為從屬[5]。主設備需要管理通信的發(fā)起、配置、結束等一系列過程,從設備只需要被動地響應通信?;贒SP的編程比FPGA簡便,為了降低開發(fā)難度和工作量,采用DSP作為主設備,是通信的發(fā)起端;FPGA作為從設備,是通信的目的端。
2.1 DSP端的SRIO配置
DSP端SRIO的軟件設計基于SYS/BIOS操作系統(tǒng),使用TI公司提供的多核軟件開發(fā)套件(MCSDK),主要組件是開發(fā)平臺中的芯片支持庫(CSL)工具。CSL是TI公司為其DSP產品提供的API函數,提供了一個用于配置和控制片上外設的C語言接口,在程序設計過程中利用CSL庫函數可以方便地訪問DSP的寄存器和硬件資源,提高DSP軟件的開發(fā)效率和速度。
2.1.1 SRIO初始化
實現SRIO重要的一步是SRIO的初始化,一般分為以下幾步:
① 打開SRIO的電源和時鐘:為了降低功耗,默認狀態(tài)下SRIO模塊的電源和時鐘是處于關閉狀態(tài)的,因此 SRIO 初始化首先要調用CSL_SRIO_OPEN函數將SRIO模塊的電源和時鐘打開。
② 配置SRIO的串并轉換器:將125 MHz的參考時鐘通過串并轉換器內部的鎖相環(huán)倍頻至1.25 GHz,串并轉換器采用半速率時鐘模式,利用這個時鐘信號的上升沿和下降沿對4路8位數據分時移位輸出,即每個時鐘串并轉換器的串行輸出端將輸出2位的數據,采用該模式降低了對時鐘信號的要求,降低了電路設計難度。
③ 設置4x工作模式:C6678有4個SRIO端口,將4路串并轉換器使能。定義SRIO通信鏈路端點器件的ID,C6678提供了8個LSU模塊用于SRIO數據操作的處理,每組LSU都有7個32位寄存器,通過配置LSUx_reg4將源器件DSP的ID設為0x00,目的器件FPGA的ID設計為0xFF。
④ 等待SRIO初始化完成:通過配置SP_ERR_STAT寄存器,檢測SRIO的端口狀態(tài)是否OK,如果OK,則表示可以進行SRIO通信,否則提示初始化不成功或者其他情況導致不能通信。在SRIO初始化前需要FPGA端完成SRIO邏輯的配置,否則DSP在初始化SRIO期間無法和FPGA進行握手,會導致初始化失敗。
2.1.2 SRIO的讀寫操作
SRIO初始化完成后,通過DSP對SRIO端口的讀寫操作實現和FPGA之間的數據傳輸。DSP讀寫支持的操作通過數據包格式中的Ftype和Ttype兩個字段描述,I/O邏輯操作是簡單實用的傳輸方式,使用該模式的前提是主設備要知道被訪問端的存儲器映射,可以直接讀寫從設備的存儲器。I/O邏輯操作在被訪問端的功能往往完全由硬件實現,所以被訪問的器件不會有任何軟件負擔。表1所列為I/O操作的幾種事務類型。本文使用的讀操作事務是NREAD。在3種寫操作事務中:NWRITE_R是帶響應的寫操作,效率較低;SWRITE要求數據載荷長度在8~256字節(jié)之間,且為8字節(jié)的整數倍。因此本文采用NWRITE寫操作,配置簡單且易于實現。
?
圖2 FPGA端的SRIO實現結構
?
?
I/O邏輯操作使用了SRIO的功能模塊LSU(Load Store Unit)和MAU(Memory Access Unit)。LSU實現I/O邏輯操作數據包的讀寫;MAU提取數據包中的源地址、目的地址、數據長度等信息,從而將數據包的有效數據載荷寫入指定位置。DSP端SRIO的I/O邏輯操作可以分為4個部分:
① 鎖定LSU寄存器:CSL_SRIO_IsLSUFull函數讀取LSUx_reg6寄存器中的FULL位,為1,則LSU所有的影子寄存器已經寫入配置文件等待數據發(fā)送,暫時沒有可用的影子寄存器。
② 配置寄存器:配置LSU寄存器0~4,獲取傳輸信息,包括源地址dspAddress、目的地址rapidIOLSB、數據長度bytecount等,程序使用的函數是CSL_SRIO_SetLSUTransfer。
?
圖3 RapidIO接口模塊實現方案
③ 釋放寄存器:完成鎖定和配置LSU寄存器后,最后配置LSU寄存器5,確定數據包的事務類型,配置完成后通過CSL_SRIO_IsLSUBusy函數檢測LSUx_reg6寄存器中的BUSY位。若BUSY為0,釋放LSU控制權,該影子寄存器進入等待狀態(tài),最終將數據發(fā)送出去;若BUSY為1,則將數據存放在影子寄存器中,等待LSU完成當前傳輸至空閑再發(fā)送數據。
④ 等待傳輸完成:通過CSL_SRIO_GetLSUCompletionCode函數讀取寄存器SRIO_LSU_STAT_REG的狀態(tài),判斷是否所有數據均傳輸完畢。
2.1.3 通信流程
C6678使用中斷控制器(INTC)管理和分配多個外部中斷源,其中有來自FPGA的中斷源。本文中SRIO工作于主模式狀態(tài),FPGA通過GPIO向DSP發(fā)送中斷,當DSP接收到來自FPGA的中斷后,對FPGA相應的內存區(qū)域進行讀寫操作。本設計中,中斷使用了GPIO8和GPIO9兩個中斷觸發(fā)事件,分別將其映射到DSP的CPU中斷4和中斷5。在此狀態(tài)下程序主要執(zhí)行兩種操作:在 DSP 收到中斷4以后進入中斷4服務函數, 完成從FPGA端讀取數據的操作;在收到中斷5以后進入中斷5 服務函數,完成將數據寫入FPGA端的操作。
2.2 FPGA端的SRIO配置
FPGA端的SRIO基于Xilinx公司的Serial RapidIO IP核[6]來實現,IP核底層硬件基于FPGA的GTX收發(fā)器。圖2所示為FPGA端的SRIO實現結構,SRIO IP核左側通過接口模塊與用戶邏輯相連,右側通過輸出引腳與DSP相連。IP核可劃分為5個部分:RapidIO邏輯和傳輸層(LOGIC)模塊、 RapidIO物理層(PHY)模塊、RapidIO緩沖區(qū)(Buffer)模塊、寄存器管理(Register Manager)模塊、參考時鐘和復位模塊。根據不同的需求,用戶可以選擇使用物理層包封裝(phy_wrapper)或者RapidIO包封裝(rio_wrapper),本文選擇使用RapidIO包封裝。
本文以IP核為基礎,采用已有的整體框架,圍繞目標用戶接口設計接口模塊。中斷作為FPGA和DSP之間的握手信號,FIFO作為用戶邏輯和IP核之間的數據緩沖接口。圖3所示為Rapid IO接口模塊實現方案。
由于FPGA在通信中作為從設備,因此接口模塊中不再需要IP核接口中發(fā)起用戶的功能,只保留目標用戶的功能,其中目標請求/響應狀態(tài)機控制各模塊的時序變化。接口模塊左側與用戶邏輯接口相連,右側與IP核目標用戶接口相連。
中斷機制部分,向DSP發(fā)送數據時采用發(fā)送FIFO的半滿標志作為讀中斷,從DSP接收數據時采用接收FIFO的半空標志作為寫中斷。發(fā)送FIFO中數據超過一定量時觸發(fā)DSP讀數據,接收FIFO中數據低于一定量時觸發(fā)DSP寫數據。用戶及時有效地控制FIFO的狀態(tài),可以保證FIFO不會被寫滿或者被讀空。用戶也可以產生中斷邏輯,控制DSP對FPGA內部存儲空間進行讀寫。本文引入了中斷機制和數據緩沖FIFO,利于接口對接和功能拓展,實現數據在不同芯片之間的高效傳輸。
3 傳輸性能測試
本文對DSP與FPGA之間的SRIO通信進行性能測試。DSP的工作頻率為1 GHz,SRIO 接口工作速率設置為3.125 Gbps,經過物理層8B/10B編碼,數據包的實際傳輸速率為2.5 Gbps,傳輸方式設置為4x 模式,則理論數據傳輸速率應為10 Gbps。由于數據包的打包和解包等操作,實際速率會小于理論值。
表2是使用NWRITE和NWREAD對不同數據包進行通信速度測試的結果。在傳輸數據為32 字節(jié)時,考慮到數據包操作時的開銷,與理論值比率僅為1.1%,很大一部分時間被花費在數據包的打包和解包的處理中,隨著傳輸數據量的增加,SRIO的實際傳輸效率不斷增大,最終維持在7 800 Mbps。經過多次反復實驗,該統(tǒng)計結果穩(wěn)定可靠,并且沒有出現丟包誤碼的情況。
?
結語
本文針對當今高速信號處理系統(tǒng)對芯片間數據傳輸的需求,研究異構處理器DSP和FPGA間的數據傳輸技術。DSP端基于CSL庫實現了SRIO的主設備通信,FPGA端基于RocketIO IP實現了從設備通信,并采用中斷實現異構處理器之間的握手信號,經測試達到較高的傳輸速率。本文研究內容也適用于同系列的其他處理器之間的數據通信,具有較高的應用價值。
?
評論
查看更多