這篇文章是用來熟悉Xilinx的Vivado HLS (2012.2 version) 工具的使用的。
由于Zedboard是ARM+FGPA的架構,所以在使用的時候經常會涉及到關于FPGA設計方面的知識,對于像我這樣對FPGA一竅不通的人來說,這是一個不可逾越的障礙(至少目前是)。有心想去了解學習一下,然后這一塊的知識體系也是異常龐大的,不是短時間可以理的清楚的。要是有一個工具,能夠將軟件代碼直接轉換成硬件(HDL語言),而無需學習傳統的硬件設計技術,那該多好了!這里,Vivado HLS 就是這樣一個工具。
這里將一段C代碼轉換成Xilinx EDK 工具能夠直接使用的IPcore,實現一個簡單的8 bit adder.
#include "basic.h"
#include "ap_interfaces.h" //define some macros for axi bus
void basic(char a, char b, char *c) {
AP_INTERFACE_REG_AXI4_LITE(a, BUS_A, ap_none);
AP_INTERFACE_REG_AXI4_LITE(b, BUS_A, ap_none);
AP_INTERFACE_REG_AXI4_LITE(c, BUS_A, ap_none);
AP_CONTROL_BUS_AXI(BUS_A); // AP control signal to be accessed through AXI-Lite if
*c = a + b;
}
(1) IO Port
函數中有3個變量:a, b, c。 前面兩個變量a,b是輸入變量,所以它們作為IPcore的輸入端口;c變量是輸出變量,所以作為IPcore的輸出端口。它們會被映射到核中的3個寄存器中。
(2) Handshake signal
在這個例子中,至少需要3個控制信號:AP_START, AP_IDEL, AP_DONE。這些信號都也會被映射到核的寄存器中,用來控制核的基本操作及狀態。AP_START信號用來控制Pcore的開始,AP_DONE信號用來表示操作完成,而AP_DONE用來表示設備空閑狀態。
(3) 中斷控制
與中斷相關的寄存器。 IER(intr enable reg)、ISR(intr status reg)
(4) IPIF and IPIC
這里,通過調用ap_interface.h中的宏來實現 AXI-LITE接口。
// ap_interface.h - - this file contains macro declarations for AutoESL interface directives
// enum of available interfaces type in AUTOESL
enum AP_AUTO_INTERFACES {
AP_NONE, AP_ACK, AP_VLD, AP_OVLD, AP_HS, AP_CTRL_NONE, AP_CTRL_HS, AP_MEM,AP_FIFO, AP_BUS
};
// GCC pre-processor directive to insert pragmas from macro code
#define STR(x) #x
#define PRAGMA_L1(x) _Pragma(#x)
#define PRAGMA(x) PRAGMA_L1(x)
#define AP_INTERFACE (var_name, interface_type) { \
PRAGMA (AP interface interface_type port=var_name); \
}
#defien AP_INTERFACE_REG (var_name, interface_type) { \
PRAGMA (AP interface interface_type port=var_name register ) ; \
}
// Create an AXI4 Lite interface at the system level layer
#define AP_BUS_AXI4_LITE (var_name, bus_name) { \
PRAGMA (AP resource core=AXI_SLAVE variable=var_name metadata=STR(-bus_bundle bus_name)); \
}
// Create standard Xilinx bus interfaces
#define AP_INTERFACE_REG_AXI4_LITE (var_name, bus_name, interface_type) { \
AP_INTERFACE_REG (var_name, interface_type); \ //IPIC
AP_BUS_AXI4_LITE (var_name, bus_name); \ // IPIF
}
// Declaration of a function control bus
#define AP_CONTROL_BUS_AXI (bus_name) { \
PRAGMA (AP resource core=AXI_SLAVE variable=return metadata=STR(-bus_bundle bus_name)
port_map={{ap_start START} {ap_done DONE} {ap_idle IDLE} {ap_return RETURN}} ); \
}
工具操作流程:
(1) Create a new project
Crate new project -> Project Name and Location (no space allowed)-> Add source file -> Add test bench file
-> Solution Configuration ->Finish.
(2) C validation
compile -> run
(3) High level Synthesize
(4) Design Optimization
(5) Implementaion (RTL Export)
第一次進行這個步驟是可能出錯的,也不知道是不是版本的問題。
導出是時候要進行 Format Selection, 主要有:
Pcore for EDK
System Generator for DSP
IP-XACT
a) 格式一,主要是將生成RTL以IPCore的形式導出,然后在EDK中使用。這個實驗中,我們選擇的就是這種方式。對于這種格式,在導出的過程中 Vivado HLS 會
調用ISE工具對RTL logic 進行綜合,所以ISE的執行路徑必須加到系統環境變量中。否則會出現"@E [IMPL-28] Failed to generate IP" 這樣的錯誤。
b) 格式二,暫時沒用過。
c) 格式三,主要用于EDA和ESL工具的使用。對于這種導出格式,Vivado HSL 會調用 Vivado對RTL logic進行綜合,所以Vivado的執行路徑必須加到系統環境變量中
去。否則會出現 "@E [IMPL-4] 'xtclsh' cannot be found. Please check your PATH variable." 這樣的錯誤。
這兩個問題,參見官方
至此,利用Vivado HLS 將 C code 轉換成 FPGA code, 同時通過接口宏指定接口,導出后的IPCore就可以在EDK與處理器集成到一起啦。
生成的IPCore 位于 ...\solutionx\impl\目錄下。
同時,在pcores\ipname_version\錄下的include目錄包括硬件設備的 簡單的low-level driver and high-level driver。當在Standalone OS 模式下,軟件代碼就可以直接使用該目錄下的API 函數。
評論
查看更多