構(gòu)建自定義 AXI4-Stream FIR 濾波器
副標(biāo)題:優(yōu)秀的IC/FPGA開源項(xiàng)目(五)-在Vivado中構(gòu)建自定義 AXI4-Stream FIR 濾波器 IP
《優(yōu)秀的IC/FPGA開源項(xiàng)目》是新開的系列,旨在介紹單一項(xiàng)目,會(huì)比《優(yōu)秀的 Verilog/FPGA開源項(xiàng)目》內(nèi)容介紹更加詳細(xì),包括但不限于綜合、上板測(cè)試等。兩者相輔相成,互補(bǔ)互充~
AMD-Xilinx 的 Vivado 開發(fā)工具具有很多方便FPGA開發(fā)功能,我最喜歡的功能之一是block design的設(shè)計(jì)流程。Vivado 中的block design是使用RTL IP形式的圖形表示進(jìn)行設(shè)計(jì),在block design中使用 RTL 模塊的方便之處在于,它將自動(dòng)檢測(cè)某些類型的信號(hào),例如時(shí)鐘、復(fù)位和總線接口,然后,檢測(cè)這些信號(hào)進(jìn)行IP間的自動(dòng)化連接。Vivado 中包含大量預(yù)構(gòu)建 IP 模塊(官方IP)。
為了方便用戶進(jìn)行相關(guān)設(shè)計(jì),Vivado 提供了一個(gè)內(nèi)置的 IP 封裝編輯器工具,它可以為 AXI IP 生成框架,只需將自己的 RTL 代碼插入其中。同時(shí)也提供了相關(guān)的驅(qū)動(dòng)文件,可以在Vitis中方便調(diào)試。
為了演示究竟上面流程“好”在哪里,接下來(lái)我們創(chuàng)建一個(gè)AXI FIR IP 模塊,然后將IP添加到我們?cè)O(shè)計(jì)中最后驗(yàn)證功能。
創(chuàng)建 Vivado 項(xiàng)目
首先,啟動(dòng) Vivado 并針對(duì)自己的FPGA創(chuàng)建一個(gè)新項(xiàng)目。
添加 MicroBlaze,對(duì)于這個(gè)項(xiàng)目來(lái)說,使用 BRAM 就足夠了。
選擇 Add IP 選項(xiàng)并搜索 MicroBlaze,將其添加到模塊設(shè)計(jì)中并運(yùn)行 Block Automation,該模塊會(huì)在窗口頂部的綠色橫幅中彈出。接下來(lái)添加中斷控制器。
驗(yàn)證并保存塊設(shè)計(jì),接下來(lái)我們將開始我們的IP設(shè)計(jì)。
創(chuàng)建新的 AXI4 外設(shè)
要使用自己的 RTL 創(chuàng)建新的 AXI 外設(shè)并將其封裝為 IP ,請(qǐng)選擇工具>創(chuàng)建和打包新 IP...
在彈出的窗口中,按照提示逐步瀏覽屏幕,選擇Create AXI4 Peripheral選項(xiàng),指定 IP 塊的所需名稱、位置目錄以及 IP 將具有的 AXI 接口數(shù)量以及 AXI類型。
Vivado 中使用了三種主要類型的 AXI:
- AXI4 (full)
- AXI4-Lite
- AXI4-Stream
每種類型都適合不同的用例,在這個(gè)項(xiàng)目中,我們正在創(chuàng)建自己的 AXI FIR 濾波器 IP 。由于 FIR 濾波器輸入并輸出具有已知數(shù)據(jù)包邊界和流量控制要求的恒定數(shù)據(jù)流,因此 AXI4-Stream 是最適合的類型。它將需要一個(gè)從接口來(lái)輸入數(shù)據(jù)樣本,并需要一個(gè)主接口來(lái)輸出處理后的樣本。
作為參考,F(xiàn)IR 是一個(gè)運(yùn)行速度為 100 MS/s 的 LPF,具有 15 個(gè)抽頭,接收帶符號(hào)的 16 位數(shù)據(jù)并輸出帶符號(hào)的 32 位數(shù)據(jù)。它有一個(gè)從 1MHz 到 10MHz 的通帶和一個(gè)從 20MHz 開始的阻帶。
接下來(lái),選擇編輯 IP并單擊完成。IP 包編輯 Vivado 項(xiàng)目將重新打開一個(gè)gui。
將自定義 RTL 添加到 AXI4-Stream IP
從Flow Navigator中選擇Add Sources添加我們要設(shè)計(jì)的 FIR Verilog 文件。
在使用 Add Files 選項(xiàng)指向 FIR Verilog 文件后,取消選中Scan and add RTL include files into project復(fù)選框。由于這不是一個(gè)普通的 Vivado 項(xiàng)目,并且 Verilog 代碼被打包到一個(gè) IP 塊中,因此選中該選項(xiàng)后將引發(fā)錯(cuò)誤。
添加后,源層次結(jié)構(gòu)更新并且 FIR Verilog 文件獨(dú)立于 AXI Verilog 源文件。
根據(jù)生成 IP 編輯器 Vivado 項(xiàng)目時(shí)所做的選擇,會(huì)為此 AXI4-Stream 外設(shè)生成三個(gè) RTL 源文件:
- 從接口功能 RTL。
- 主接口功能 RTL。
- 具有物理接口聲明和主從接口實(shí)例化的頂層文件。
在設(shè)計(jì)之前,需要將幾個(gè)默認(rèn)未啟用的可選 AXI4-Stream 接口信號(hào)添加到主 AXI 端口和從 AXI 端口。大多數(shù) DSP IP 模塊,例如 DDS 利用了 AXI4-Stream 額外的keep 和 tlast信號(hào)。
添加這些可選信號(hào)很簡(jiǎn)單,但最初并不清楚。導(dǎo)航到Package IP窗口中的Customization Parameters選項(xiàng)卡。
主接口和從接口都需要添加它們,因此右鍵單擊每個(gè)接口并選擇Edit Interface 。
在“Parameters”選項(xiàng)卡中啟用HAS_TKEEP ,方法是單擊每個(gè)選項(xiàng),然后單擊單個(gè)箭頭將其從左列移動(dòng)到右列。
然后切換到Port Mapping選項(xiàng)卡,將 tkeep 和 tlast 映射到 AXI IP 塊的物理接口。在Interface's Logical Ports列和IP's Physical Ports列中分別匹配 tkeep 和 tlast 信號(hào)。然后在下面的Mapped Ports Summary列中驗(yàn)證它們的映射。
由于默認(rèn)情況下不啟用 tkeep,因此還必須手動(dòng)將其端口聲明添加到所有三個(gè) AXI 接口 RTL 源文件的用戶定義端口聲明部分。它還需要添加到頂級(jí) AXI 包裝器中的 AXI 主接口和從接口實(shí)例中。
在注釋Add user logic here標(biāo)記的部分中實(shí)例化 FIR Verilog 模塊。
現(xiàn)在,雖然 AXI 接口的基本功能分別在每個(gè) RTL 源文件中自動(dòng)生成,但如何從輸入數(shù)據(jù)流中提取數(shù)據(jù)并傳遞到自己的自定義邏輯中由自己來(lái)定義。以及如何將自定義邏輯的數(shù)據(jù)輸出饋送到主 AXI 接口進(jìn)行輸出。因此,會(huì)在三個(gè)自動(dòng)生成的 RTL 源文件中注意到相同的 Add user 邏輯。
另一點(diǎn)需要注意的是,AXI4-Stream 接口的功能需要進(jìn)行一些修改,以便將 tkeep 和 tlast 信號(hào)功能添加到主 AXI 接口和從 AXI 接口。
這個(gè)項(xiàng)目的最后一個(gè)獨(dú)特的要求是,因?yàn)檫@個(gè)邏輯的核心是一個(gè) FIR 濾波器,所以主從 AXI 接口和 FIR 都需要由相同的時(shí)鐘作為 FIR 采樣時(shí)鐘。所以只是將從 AXI 接口時(shí)鐘傳遞給 FIR 和主 AXI 接口。
封裝 AXI IP 塊
返回到 Package IP 窗口,讓我們?yōu)g覽每個(gè)選項(xiàng)卡并驗(yàn)證,然后最終將其打包。
第一個(gè)選項(xiàng)卡中是輸出 AXI 外設(shè) IP 包的基本顯示信息。
第二個(gè)標(biāo)簽很重要。默認(rèn)情況下,AXI 外設(shè) IP 僅支持啟動(dòng) IP 包編輯器的主 Vivado 所針對(duì)的 FPGA 芯片系列。大多數(shù)時(shí)候,可能希望能夠?qū)?AXI 外設(shè) IP 塊與其他 Xilinx FPGA 芯片系列一起使用,就需要添加我們需要的目標(biāo)FPGA芯片。
對(duì)于其余選項(xiàng)卡,默認(rèn)需求即可。
在最后一個(gè)選項(xiàng)卡中,單擊窗口底部的Package IP按鈕。將出現(xiàn)一個(gè)提示,詢問是否要關(guān)閉 IP 編輯器 Vivado 項(xiàng)目。
此時(shí),F(xiàn)IR AXI IP 塊被打包并放置在 Package IP 窗口的第一個(gè)選項(xiàng)卡指定的目錄中的存儲(chǔ)庫(kù)中。
將自定義 AXI4-Stream FIR 添加到項(xiàng)目
現(xiàn)在自定義 FIR AXI IP 模塊已經(jīng)完成并封裝,我們可以返回原始 Vivado 項(xiàng)目,將其添加到模塊設(shè)計(jì)中。
我們的驗(yàn)證項(xiàng)目如下:
其中DDS IP設(shè)置如下:
創(chuàng)建仿真平臺(tái)
首先創(chuàng)建仿真文件,并在sim文件夾下的 Sources 選項(xiàng)卡中,右鍵單擊它并選擇Set as Top 。
在這種情況下,只需在塊設(shè)計(jì)中實(shí)例化塊設(shè)計(jì),并為其提供差分系統(tǒng)時(shí)鐘和主 FPGA 復(fù)位。一旦接收到時(shí)鐘和復(fù)位信號(hào),相位增量狀態(tài)機(jī)就會(huì)自行運(yùn)行。
`timescale1ns/1ps
modulesp701_bd_tb;
regclk_p,clk_n,reset;
alwaysbegin
clk_p=1;clk_n=0;#5;
clk_p=0;clk_n=1;#5;
end
alwaysbegin
reset=1;#40;
reset=0;#1000000000;
end
sp701_bdsp701_bd_i(
.reset(reset),
.sys_diff_clock_clk_n(clk_p),
.sys_diff_clock_clk_p(clk_n)
);
endmodule
這里注意一下主 AXI 接口輸出信號(hào)和 tlast、tvalid 和 tdata 需要進(jìn)行初始化。否則仿真將會(huì)報(bào)錯(cuò)。
單擊Flow Navigator窗口中的Run Simulation并選擇Run Behavioral Simulation 。
注意仿真結(jié)果顯示格式。
參考
https://www.hackster.io/
總結(jié)
上面的一些創(chuàng)建細(xì)節(jié)沒有全部展現(xiàn),因?yàn)楸旧韺?duì)于IP的創(chuàng)建不是我們的核心,我們只想說明使用目前這種BD設(shè)計(jì)可以達(dá)達(dá)簡(jiǎn)化設(shè)計(jì),尤其是目前Verilog的一些缺點(diǎn)。
最后說一下調(diào)試中的注意點(diǎn),就是使用ILA查看AXI-Stream輸出時(shí)候,會(huì)造成FIR的時(shí)序與采樣混淆導(dǎo)致 FIR 不再工作,可能會(huì)查看不到任何波形,使用AXIS的專用調(diào)試IP即可,后續(xù)我們?cè)谡f明這方面的知識(shí)。
示例工程
https://github.com/suisuisi/AXI4-Stream-FIR-filter
審核編輯 :李倩
-
濾波器
+關(guān)注
關(guān)注
161文章
7859瀏覽量
178763 -
自動(dòng)化
+關(guān)注
關(guān)注
29文章
5620瀏覽量
79555 -
開源
+關(guān)注
關(guān)注
3文章
3398瀏覽量
42665
原文標(biāo)題:?構(gòu)建自定義 AXI4-Stream FIR 濾波器
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論