• 沒有找到結果。

ARM 處理器與 FPGA 之間的資料傳輸速度瓶頸解析

第五章 嵌入式平台軟硬體整合設計

5.3 ARM 處理器與 FPGA 之間的資料傳輸速度瓶頸解析

軟體與硬體間資料的傳輸速度瓶頸是軟硬體協同運作設計中不可忽視的一環,

不論在任何應用中,運作中花費的傳輸時間往往遠大於硬體運算時間,例如文獻 [59]。在 MaCube 開發板上,Tegra-2 CPU 與 FPGA 間使用通用記憶體介面(General Memory Interface,GMI)介面連接,將 FPGA 視為外部記憶裝置進行存取,在 Linux driver 中使用直接記憶體存取(Direct Memory Access,DMA)的方式,存取 FPGA 資料,為加速資料存取速度,我們的嵌入式軟體在 User space program 中使用 Memory mapping 的方式對應到 DMA 資料的來源(Source) 端與目標(Target)端,開 發板的 DMA 一次最大的傳輸量為 4096 筆資料,1 筆資料寬度為 16 bits,也就是 一次的最大傳輸量為 8KB(K Bytes)。User program 將資料寫入到 Write Buffer 的位 址後,呼叫 Driver 啟動 DMA,將資料寫入 FPGA,待成功傳輸後再回到 User program。

要讀取 FPFA 資料時,先呼叫 Driver 啟動 DMA,將 FPGA 讀取的資料寫入 Read Buffer。相關位址資料如下圖 5-7 所示。

87 Write

Buffer 16 bit 0x4003_0000

0x4003_0FFF

Read Buffer

16 bit 0x4003_2000

0x4003_2FFF

FPGA RAM 16 bit 0xD000_0000

0xD000_0FFF DMA

CPU write to FPGA

CPU read from FPGA

圖 5-7 Memory mapping 與 Buffer 位址關係圖

我們的運作是以一個 HOG 為基本單位,也就是一次傳輸到 FPGA 一個 Block;

一次從 FPGA 讀取一個 36 維向量,以大小為 16x16 的 Block 來計算,則一次要傳 輸到 FPGA 的資料量為 16x16=256 (Bytes),而 Buffer 的寬度為 2 Bytes,也就是一 個 16x16 的 Block 要傳輸的資料量為 128 筆;而 36 維向量我們資料寬度設為 4 Bytes,

也就是傳輸一次的資料量為 72 筆。

因為我們的開發板手冊並無明確指出該介面的傳輸速度,需進行測試得到明 確數據,這邊要測試的時間為單純的傳輸時間,也就是硬體端不能做任何運算,

僅僅只測試軟體端寫入資料與讀取資料到圖 5-4 中的 Dual Port Memory(mem0)中。

測試步驟是將 FPGA 內部電路僅保留 ARM_Mem_Interface 與 mem0 兩個模組,

mem0 內部的預設資料均設為 0xFFFF,其餘模組暫時去除,且將 ARM_W_Ready、

ARM_R_Ready 兩支中斷訊號均設定為 1’b1,使得軟體端任何時候都可以讀寫 FPGA 上的 mem0。

下表 5-2 為針對我們的開發平台所進行的傳輸時間測試,其中:

SMIMS_T2_Write_To_FPGA_Wait_Ready(int addr, int count, int iTimeOut)、

88

SMIMS_T2_Read_From_FPGA_Wait_Ready(int addr, int count, int iTimeOut),

兩支函式是開發板廠商所提供的讀寫 API,其參數 addr 為讀寫位址;count 為讀寫 資料長度;iTimeOut 為等待時間,若超過時間中斷訊號仍未為 1’b1 則返回 false,

單位為 ms。

表 5-2 前兩項為針對滿載時間進行測試,即讀寫資料長度都是 4096;後兩項 為 16x16 的 Block 所需要的傳輸時間進行測試,即寫入資料長度是 128,讀取資料 長度是 72。在寫入資料的內容上測試了三種,即均為 0x0000、均為 0xFFFF、均 為隨機亂數,若先執行寫入函式再執行讀取函式,則讀取到的資料會是與寫入資 料完全相符;若是先執行讀取函式,則讀取到的資料會是編譯產生 FPGA 燒錄檔 (bitstream)時的預設值,也就是先前提到的 0xFFFF。經過測試後發現使用 0x0000、

0xFFFF 與隨機亂數三種資料內容進行測試,其花費的時間一致,也就是傳輸的資 料內容不會影響到傳輸所需要花費的時間。

表5-2 MaCube平台ARM與FPGA間的傳輸時間

I/O Function Time mb/sec

(ms)

SMIMS_T2_Write_To_FPGA_Wait_Ready(0, 4096, 5) 0.23053 33.889

SMIMS_T2_Read_From_FPGA_Wait_Ready(0, 4096, 5) 0.23046 33.899

SMIMS_T2_Write_To_FPGA_Wait_Ready(0, 128, 5) 0.00902 27.066

SMIMS_T2_Read_From_FPGA_Wait_Ready(0, 72, 5) 0.00702 19.562

經過測試後發現其速度最大約為 33mb/sec,是符合 Ultra DMA 33 的規格。單 一 HOG 所需要的傳輸時間為 0.00902 + 0.00702 = 0.01604 (ms) 。這是 Write Buffer、

Read Buffer 與 FPGA 間的傳輸時間,於應用上尚需加上軟體端資料移入 Write Buffer 與從 Read Buffer 資料移出的時間。

89

首先針對 ARM/FPGA 軟硬體協同運作計算 One-HOG 所需花費的時間進行分 析,如圖 5-8 所示。完成一次的 HOG 計算共需要 7 段時間,T1、T7 是軟體內部 的資料搬移,佔 28.08%。T2、T6 是軟硬體間使用 DMA 進行資料傳輸的時間,佔 59.13%。T3、T5 是硬體內部的資料搬移,佔 6.38%。T4 是 One-HOG Vector Generator 運作時間,佔 6.37%。硬體端所花費的時間為 T3~T5,僅佔 12.75%,其餘所花費 的時間均為資料搬移與傳輸時間。

Start

Write Data To Write Buffer

Write Data To FPGA (Block Pixel)

Read Data From FPGA (36D-Vector) Input Data Move

Output Data Move

One-HOG Vector Generator

Read Data From Read Buffer

End

90

偵測視窗 (Detecting Window)

64

128 16

16 128

第一個區塊 (16x16 Block)

圖 5-9 大小為 16x16 之測試 Block

FPGA 內部計算一次 16x16 之 HOG 所花費的時間為 0.003458 ms ,是由計算 一次需要 665 個 Clock Cycle 乘上 5.2 ns 計算得到,5.2ns 是因為時脈為 192mhz,

一個 Clock Cycle 的時間為 5.2ns。

一個 DW 的 105 個 HOG 計算時間分析:

(1) 實際運算計時時間(實測時間) :3.591600 (ms) (2) FPGA 內部花費時間:0.003458*105 = 0.36309 (ms) (3) Write to FPGA 花費時間:0.00902*105 = 0.9471 (ms) (4) Read_From_FPGA 花費時間:0.00702*105 = 0.7371 (ms)

(5) 將實測時間扣掉(2~4)時間:3.5916-0.36309-0.9471-0.7371 = 1.54431 (ms)

這段時間即為資料移入 Write Buffer 與從 Read Buffer 資料移出的時間,也就 是傳輸的前置時間,FPGA 計算時間僅僅只佔總時間的 10.1%,資料搬移與傳輸時 間佔了近 90%。

這是因為 ARM 處理器與 FPGA 是分屬不同的 IC 晶片所致,IC 間的訊號傳輸 會受到板子布線等因素的影響,若能夠將之整合為一個 SoC (System on Chip)晶片,

於資料搬移與傳輸時間上應可大幅的降低,事實上,FPGA 大廠 Xilinx 也已經於近

91

期推出 Zynq-7000 系列產品,晶片內部包含 ARM 核心與 FPGA 電路,以方便開發 者進行 ARM 與 FPGA 的整合開發。