陶子然, 曹文君, 王沁喆, 葉文靜
(中國電子科技集團第三十八研究所, 安徽 合肥 230000)
隨著現代信息技術的高速發展, 數字信號處理在軍用及民用領域都取得了極大發展和廣泛應用, 同時日益增長的信號處理需求也對整機、 分機平臺提出了越來越高的要求。 特別是在航天航空、圖像處理、AI 等高科技前沿領域,信號處理實時性高,數據量大,數據交互頻繁及信號處理算法繁雜度高, 傳統的解決方法無法滿足該類需求的情況下,基于DSP 和FPGA 的協同處理架構主流。這一系統較傳統方法顯著提升了系統的運算速度和數據處理能力。 處理器之間主要采用的高速通信接口包括SRIO、PCIe 等。 RapidIO 技術是一種高帶寬、低延遲的基于包交換的開放式互聯技術標準,2001 年由Freescale 公司發表正式規范,主要應用于嵌入式系統的高速互聯,支持芯片到芯片以及板卡到板卡間的高速通信。 高速串行輸入輸出SRIO (Serial RapidIO) 作為新一代高速通信協議,具有非常優異的高帶寬、低延遲、低功耗等特性。 本文提出了一種基于高性能DSP SRIO 模塊的測試速率的方法,DSP 在信號板板內與DSP 通信以及通過交換芯片與板間的FPGA 通信的實例研究了相關研究方法。 通過該方法,可以較為準確的測算SRIO 模塊的通信速率,所測結果也為架構模型提供了數據支持。
RapidIO 技術作為一種高帶寬、低延遲的基于包交換的開放式互聯技術,可以滿足高性能嵌入式系統的需求,支持芯片到芯片以及板卡到板卡間的高速通信。 多用于多處理器、存儲器及通用信號處理平臺間的高速交互。 其主要特點包括靈活的系統結構,允許點對點傳輸;帶錯誤檢測的魯棒傳輸;可拓展的頻率和接口寬度;非軟件密集型操作;低開銷的高帶寬互聯;低引腳數、低功耗、低延遲。
基于SRIO 的驅動程序包括SRIO 模塊初始化功能,DMA 數據傳輸功能,DOORBELL 中斷功能,MESSAGE 數據傳輸功能和維護包傳輸功能。 本實驗的硬件平臺為基于高性能DSP 的某兩型板卡,信號處理板與接口板。平臺架構如圖1,2 所示。

圖1 接口板結構圖

圖2 信號板結構圖
為了實現通信測速功能, 實驗中涉及到DSP 端的SRIO 模塊驅動編程設計主要包含以下幾個方面:
(1)SRIO 模塊工作模式設置。 在開發環境ECS 中,手動創建bsp 包后進入PLL 配置界面,在圖形化界面中配置內核頻率,在勾選相應的SRIO 控制器后,可以配置通道數和通道速率。 本文采用4x,5G 模式設置,DSP 工作于中斷模式下與FPGA 進行互連通信。 在涉及到DDR 作為數據傳輸對象時,需設置地址映射表,不同地址映射表對應不同的索引方式, 索引方式可以選擇38 位AXI 地址是如何組成的, 可以選擇SourceID 或者SourceAddr,“索引號來源” 則選擇38 位AXI 地址的組成方式, 如選擇默認方式RIO_Addr[33:30]/SourceID[3:0],則是將SourceID 放在低4位,將RIO_Addr 放在了高34 位,實際的地址一般為32位,34 位RIO_Addr 就是將32 位的地址左移兩位。AXI 地址高18 位根據需要填寫。 例如若是映射到DDR0,DDR0 的基地址為0x80000000 (32 位), 將其左移2 位即得到34位RIO_Addr,這就是AXI 地址的高34 位,再加上低4 位的SourceID,就組成了完整的AXI 地址。 0x80000000(32 位)左 移 兩 位 是 0x200000000 (34 位), 即 2 進 制0b1000000000000000000000000000000000,取其高18 位,即0b100000000000000000,即0x20000,將0x20000 填寫在窗口中即可,也可以將0x200000000(34 位)直接右移16 位,即可得AXI 地址高18 位。
(2)SRIO 模塊初始化。
初始化函數如下:
status=srio_driver_initialize(SRIOCTL,NULL);
status=srio_driver_open(SRIOCTL,NULL);
如果兩個函數的返回值status 均為0,則表明DSP 與目標元件link 成功, 通常使用status|= srio_driver_initialize(SRIOCTL,NULL);來多次確認返回值的狀態,保證其沒有出錯。
(3)交換芯片的配置。 對于直連的通信架構來說,無需對交換進行配置。在目前主流系統架構中,交換是必不可少的。對于存在交換的系統,需要根據交換的類型對其進行相應的路由配置。 本文的實驗平臺所使用的交換為1800,1800 配置函數為:
cps1800(slave_addr);
程序中對1800 的路由的配置在下圖所示, 程序將0x11 路由到port8, 將0x12 路由到port4, 將0x21 路由到port1,將0x22 路由到port9,將0x31 路由到port7,將0x32路由到port0,將0x41 路由到port3,將0x42 路由到port11。可以根據實際使用情況進行修改。

圖3 1800 路由配置
(4)讀寫驅動函數配置。 本文使DSP 采用DMA 模式與FPGA 進行通信,DMA 模式適合在數據量較大的傳輸中使用, 主設備可以主動對從設備進行讀寫。 SRIO 在DMA 模式中可以實現DDR 寫讀DDR,DDR 寫讀內存,內存寫讀DDR,內存寫讀內存。 DMA 模式中發送方需要配置的參數主要有:dma_param.dest_id(DestID)、dma_param.axi_37(AXI 地址37 位)、dma_param.axi_36_34(AXI 地址36~34 位)、dma_param.dma_seq (DMA 通道, 賦值0 即可)、dma_param.src_addr(源地址)、dma_param.dst_addr(目的地址)、rw_args.count (傳輸數目, 內核傳輸數目最大256K,DDR 傳輸數目可達1M,一個DMA 的數據包的最大數據量為256K 字)。
讀寫驅動函數設置如下:
srio_driver_write(deviceID,*ARG);
srio_driver_read(deviceID,*ARG);
(5)方案優化函數。 本文DSP 端通過門鈴中斷計數,在此過程中DSP 端需讀取門鈴FIFO,否則將造成DSP 無法進入MISC 中斷程序的情況。 在讀取周期計數時,數據量過大時會造成計數寄存器CC0 溢出的情況,需引入周期計數寄存器CC1 進行補位計算,計算公式為:
Time=(val_high_CC1*4294967296)+ val_low_CC0。
優化函數如下:
FIFO_read(deviceID,*ARG);
Cycle_get(void);
本文通過信號板對板間DSP 芯片和FPGA 通過SRIO 通信進行測試,記錄每次數據傳輸首尾兩個門鈴中斷之間的周期,多次測量取平均值。具體軟件流程圖如圖4 所示。

圖4 算法軟件流程圖
將信號板和接口板依次插入機箱對應槽位。 分別將接口板和信號板通過JTAG 下載器連接到測試計算機,查看信號板上位機IP 地址, 設置為10.100.39.39。 信號板、接口板上電,接口板上FPGA 和信號板上DSP 分別加載測試例程。加載完成后,DSP 程序運行,完成1800 交換芯片配置。DSP程序進入while 循環等待接收門鈴中斷和數據。 同時設置FPGA 程序VIO 的參數為vio_cnt_1000 為10000000,loop_cnt 為100,delay_time 為2。 測試例程包長、包數可控,典型包長為256B,每次發送100 包,循環10000000 次,傳輸指定格式的數據為從0 開始的遞增數列。 FPGA 端測試程序發送數據的流程為:先發送一個DOORBELL 包表示開始發送, 發送25KB 的遞增數據后延時4 個時鐘周期再發送一個DOORBELL 包表示一次發送結束,再發送下一個25KB 遞增數,依次發送10000000 次25KB 共約238.41GB 遞增數據。 在接收端,DSP 每隔100 包數據,記錄下兩個門鈴間的周期,在ECS變量窗口顯示每個門鈴所對應的當前周期數, 同時顯示通信速率。
實驗每次連續測試10 次,每次測試包數不小于一億包,取接收端輸出速率平均值作為板間SRIO 速率。 實驗結果如表1 所示。 FPGA 實驗波形如圖5、6 所示。

表1 板間FPGA 與DSP 通信速率

圖5 FPGA 數據波形圖-1

圖6 FPGA 數據波形圖-2
本文基于高性能DSP 平臺的SRIO 接口模塊建立DSP 與FPGA 之間的通信系統測算速率, 并提出相應的準確計數方法。在4x,5G 模式下,SRIO 模塊4lane 通道整個鏈路的傳輸瓶頸不大于4×5=20Gbps 的速率(即鏈路速率最大理論值),在計算SRIO 包的開銷以及8b/10b 的轉換開銷之后, 根據有效數據負載速率的通用計算公式:V有效負載最大速率=鏈路速率最大理論值×0.8(8b/10b 轉換且包括兩級開銷)等于4Gbps。實驗統計結果為單次100包周期為16418, 速率計算公式為100×256×8/(16418×2),經計算在該硬件平臺SRIO 模塊平均寫速率為6.23Gbps,單通道平均速率為3.11Gbps。 由DSP 讀數的平均讀速率為3.29Gbps。 讀寫速率相當, 且達到理論最大有效速率的80%,表明該系統能夠高速傳輸大批量數據,當數據量較大時,讀寫速率同步提升,通信開銷占比總傳輸時間比例減小,整體速率超過12Gbps,傳輸效率較為理想。