您是否想創(chuàng)建自己帶有 AXI4-Lite 接口的 IP 卻感覺無從著手?本文將為您講解有關(guān)如何在 Vitis HLS 中使用 C 語言代碼創(chuàng)建 AXI4-Lite 接口的基礎(chǔ)知識(shí)。
在本教程中,我們將來聊一聊有關(guān)如何在 Vitis HLS 中使用 AXI4-Lite 接口創(chuàng)建定制 IP 的基礎(chǔ)知識(shí)。如果您是 AXI 初學(xué)者,并且想要熟悉一下相關(guān)的基本術(shù)語和背景知識(shí),請(qǐng)參閱教程 AXI 基礎(chǔ)第 1 講。(后臺(tái)回復(fù)AXI 1,可查看本篇文章)
注:在 Vivado HLS 中使用 AXI 創(chuàng)建 IP 的過程與使用 Vitis HLS 的過程不同。如果您想要在 Vivado HLS 中創(chuàng)建 AXI IP,請(qǐng)參閱UG902。
https://china.xilinx.com/support/documentation/sw_manuals/xilinx2020_1/c_ug902-vivado-high-level-synthesis.pdf
AXI4-Lite 屬于基本 AXI 通信協(xié)議。它常用于簡(jiǎn)單的低吞吐量存儲(chǔ)器映射通信(例如,往來于控制寄存器和狀態(tài)寄存器的通信)。

如上圖所示,AXI4-Lite 接口可設(shè)置為只讀(僅包含 2 條讀取通道)或只寫(僅包含 3 條寫入通道)。
在本教程中,我們將創(chuàng)建以下 IP,并使用 s_axi_BUS_A 作為我們的 AXI4-Lite 接口:

本教程結(jié)束時(shí),您將能夠
-
了解在 Vitis HLS 中創(chuàng)建 AXI4-Lite 接口的相關(guān)基礎(chǔ)知識(shí)。
-
了解 Vitis HLS 中的編譯指示相關(guān)信息,此類編譯指示用于定義所使用的 AXI 接口。
打開 AXI4-Lite 設(shè)計(jì)示例
在 Vitis HLS 中提供了 AXI4-Lite 的設(shè)計(jì)示例。要打開 AXI4-Lite 的設(shè)計(jì)示例,請(qǐng)遵循以下步驟進(jìn)行操作:
1. 打開 Vitis HLS GUI。在首頁(yè)屏幕中,選擇“克隆示例 (Clone Examples)”選項(xiàng)以便從 GitHub 復(fù)制 Vitis HLS 設(shè)計(jì)示例:

2. 在彈出選項(xiàng)卡中,選擇示例的保存位置,然后單擊“確定 (OK)”:

3. 在下一個(gè)屏幕中,設(shè)計(jì)示例將顯示在左下角。選中“HLS 微教程 (HLS Tiny Tutorials)”和“工作樹結(jié)構(gòu) (Working Tree)”旁的箭頭即可查看所有可用示例。

4. 向下滾動(dòng),找到 interface_axi_lite 示例。右鍵單擊文件夾名稱,然后選中“運(yùn)行并打開 HLS 工程 (Run and Open HLS Project)”選項(xiàng)。

5. 完成此操作后,將在左側(cè)選項(xiàng)卡中打開此工程。雙擊 example.cpp 和 example_test.cpp 以查看源代碼和測(cè)試激勵(lì)文件。
源代碼詳解
此示例包含 2 個(gè)主要文件:
Example.cpp - 此代碼將綜合到 RTL 中以創(chuàng)建“簡(jiǎn)介”中所示的 IP。此 IP 將與 Vivado Design Suite 中的其它 IP 相結(jié)合,并最終被放置到您的硬件上。
Example_test.cpp - 此測(cè)試激勵(lì)文件將用于確保 example.cpp 按期望方式運(yùn)行。Example.cpp 算法將通過如下方式進(jìn)行檢查:將該算法的輸出與測(cè)試激勵(lì)文件中執(zhí)行的“期望數(shù)據(jù) (golden data)”計(jì)算結(jié)果進(jìn)行比較。只要黃金數(shù)據(jù)與 example.cpp 的返回結(jié)果相匹配,HLS 中的測(cè)試激勵(lì)文件就會(huì)返回 0。

選中左側(cè)列中“源代碼 (Source)”下的 example.cpp 即可打開源代碼。接下來我們來詳細(xì)看下代碼:
函數(shù)實(shí)參
void example(char *a, char *b, char *c)
進(jìn)入庫(kù)之后首先可看到的是 example(); 函數(shù)。只要您熟悉基于 C 語言的設(shè)計(jì),就不難發(fā)現(xiàn),通過形參(如上述示例中的 char *a、char *b 和 char*c)即可瞬間執(zhí)行所有輸入和輸出操作。
在 RTL 設(shè)計(jì)中,數(shù)據(jù)通過端口進(jìn)出 IP。這些端口可使用特定 I/O 協(xié)議(例如,AXI4-Lite、AXI4-Stream 等)來進(jìn)行操作,這樣即可保證 IP 塊之間能夠進(jìn)行標(biāo)準(zhǔn)化的通信。
對(duì)于進(jìn)出 IP 的每一條數(shù)據(jù),都應(yīng)將其指定為主源文件中的一個(gè)獨(dú)立函數(shù)實(shí)參。稍后,該函數(shù)實(shí)參將被綜合成硬件 (RTL) 中的一個(gè)“端口”。
注:端口實(shí)際上可通過 3 種不同方法來創(chuàng)建,但本教程將主要講解采用函數(shù)實(shí)參的方法。
端口衍生自:
-
指定的任意函數(shù)級(jí)協(xié)議。
-
函數(shù)實(shí)參。
-
全局變量(供頂層函數(shù)訪問,在其作用域范圍外定義)。
注:由于 AXI4-Lite 接口中的變量為函數(shù)實(shí)參,因此在 C 語言代碼中無法為其指定默認(rèn)值。因此,無法為 AXI4-Lite 接口中的任何寄存器指定默認(rèn)值。這些寄存器可通過 config_rtl 命令進(jìn)行復(fù)位來實(shí)現(xiàn),但不能為其指定任何其它默認(rèn)值。(請(qǐng)參閱控制復(fù)位行為以了解詳細(xì)信息)。
https://china.xilinx.com/html_docs/xilinx2020_1/vitis_doc/programmingvitishls.html
接口編譯指示
接下來,我們來看看編譯指示接口。
首先逐一了解下其中每個(gè)組件:
#pragma HLS INTERFACE s_axilite port=a bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=b bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=c register bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=return bundle=BUS_A
我們需要把 IP 的輸入/輸出定義為 s_axilite,這樣才能使用 AXI4-Lite 協(xié)議。如果我們的代碼中不包含此行,那么數(shù)據(jù)輸入/輸出將綜合到基本連線中,并且將不含關(guān)聯(lián)的握手信號(hào)。在此情況下,輸入將保持穩(wěn)定狀態(tài)直至執(zhí)行讀取輸入操作為止,一旦未謹(jǐn)慎執(zhí)行此操作,就可能導(dǎo)致錯(cuò)誤。
接口編譯指示格式如下:
#pragma HLS interface port= (register) bundle=
其中:
:用于指定函數(shù)實(shí)參的接口協(xié)議模式。在此例中,我們選擇的是 s_axilite。
port=:用于指定 INTERFACE 編譯指示所應(yīng)用到的函數(shù)實(shí)參名稱。
(register):這是可選關(guān)鍵字,用于寄存(即存儲(chǔ))信號(hào)和所有關(guān)聯(lián)的協(xié)議信號(hào)。它會(huì)導(dǎo)致信號(hào)保持直至至少完成函數(shù)執(zhí)行的最后一個(gè)周期為止。
bundle=:此關(guān)鍵字支持您將端口信號(hào)手動(dòng)組合到單一數(shù)據(jù)總線內(nèi)。如果函數(shù)返回指定為 AXI4-Lite 接口(即代碼示例中的第 25 行),那么所有數(shù)據(jù)端口都將被自動(dòng)捆綁到單一總線中。如果未在此處明確提供捆綁名稱,那么 Vitis HLS 將使用默認(rèn)捆綁名稱control。當(dāng)使用其它器件(例如,CPU)來配置和控制塊的啟動(dòng)和停止操作時(shí),這是常見的做法。
s_axilite port=return:用于設(shè)置類型為 s_axilite 的函數(shù)實(shí)參,端口名稱“return”將在 IP 塊中創(chuàng)建中斷信號(hào)。您可通過 AXI4-Lite 接口和 C 語言驅(qū)動(dòng)程序文件來完成中斷編程。如需了解更多信息,請(qǐng)參閱此處
https://china.xilinx.com/html_docs/xilinx2020_1/vitis_doc/programmingvitishls.html#auo1539734222936
注:如果任意頂層函數(shù)實(shí)參指定為 AXI4-Lite 接口,則函數(shù)返回也必須指定為 AXI4-Lite 接口。
注 2:默認(rèn)情況下,HLS 會(huì)為分組到同一個(gè) AXI4-Lite 接口的每個(gè)端口分配地址。Vitis HLS 在C 驅(qū)動(dòng)程序文件(如下鏈接)中提供了分配的地址。要顯式定義地址,可使用 offset 選項(xiàng)。在 AXI4-Lite 接口中,Vitis HLS 保留地址 0x0000 到 0x000C,用于塊級(jí) I/O 協(xié)議信號(hào)和中斷控制。
https://china.xilinx.com/html_docs/xilinx2020_1/vitis_doc/programmingvitishls.html#auo1539734222936
函數(shù)主體
*c += *a + *b;
在該函數(shù)中,可以精確定義希望此 IP 執(zhí)行的操作,此 IP 將導(dǎo)入 2 個(gè)值(a 和 b)并將結(jié)果 (c) 存儲(chǔ)在寄存器中。為測(cè)試功能,測(cè)試激勵(lì)文件將為 a 和 b 提供 example() 函數(shù),并將其與自己計(jì)算 a+b 所得的值進(jìn)行比較。如果結(jié)果相匹配,那么測(cè)試激勵(lì)文件應(yīng)始終返回 0,并且 c 仿真即可通過。
在下一篇 AXI 基礎(chǔ)系列文章中,我們將學(xué)習(xí)如何將 IP 導(dǎo)出到 Vivado Design Suite 中以便通過 AXI4-Lite 接口將其連接到其它 IP 或連接到 PS。
審核編輯:湯梓紅
-
接口
+關(guān)注
關(guān)注
33文章
9519瀏覽量
157019 -
C語言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145570 -
AXI4
+關(guān)注
關(guān)注
0文章
21瀏覽量
9183 -
Vitis
+關(guān)注
關(guān)注
0文章
157瀏覽量
8347
原文標(biāo)題:開發(fā)者分享 | AXI 基礎(chǔ)第 5 講-Vitis HLS 中的 AXI4-Lite 簡(jiǎn)介-上
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Zynq中AXI4-Lite和AXI-Stream功能介紹
創(chuàng)建AXI Sniffer IP以在Vivado IP Integrator中使用教程
可以在EDK中使用Axi4Stream接口/總線嗎?
AXI4-lite端口可以保持未連接狀態(tài)嗎?
【正點(diǎn)原子FPGA連載】第四章呼吸燈實(shí)驗(yàn)-領(lǐng)航者ZYNQ之HLS 開發(fā)指南
使用Vitis HLS創(chuàng)建屬于自己的IP相關(guān)資料分享
將DSP設(shè)計(jì)融入嵌入式系統(tǒng)的AXI4-Lite接口
如何創(chuàng)建基本AXI4-Lite Sniffer IP以對(duì)特定地址上正在發(fā)生的讀寫傳輸事務(wù)進(jìn)行計(jì)數(shù)
AXI4 、 AXI4-Lite 、AXI4-Stream接口
使用AXI4-Lite將Vitis HLS創(chuàng)建的IP連接到PS
自定義AXI-Lite接口的IP及源碼分析
如何在Vitis HLS GUI中使用庫(kù)函數(shù)?
如何在Vitis HLS中使用C語言代碼創(chuàng)建AXI4-Lite接口
評(píng)論