Xilinx Vivado中提供了AXI FIFO和AXI virtual FIFO類(lèi)似IP,這篇文章主要通過(guò)實(shí)例來(lái)講解這兩個(gè)IP的使用方法。
FIFO 是我們?cè)O(shè)計(jì)中常用的工具,因?yàn)樗鼈兪刮覀兡軌蛟谶M(jìn)行信號(hào)和圖像處理時(shí)緩沖數(shù)據(jù)。我們還使用異步FIFO來(lái)處理數(shù)據(jù)總線(xiàn)的時(shí)鐘域交叉問(wèn)題。

FIFO 的挑戰(zhàn)之一是存儲(chǔ)大量數(shù)據(jù)需要 FPGA 內(nèi)的大量資源。當(dāng)然,這在較小的 FPGA 中可能是一個(gè)問(wèn)題,因?yàn)?BRAM 資源是有限的。但在許多情況下,較小的 FPGA 可能會(huì)連接外部存儲(chǔ)器,如 DDR3 或 DDR3L。開(kāi)發(fā)人員可以使用此存儲(chǔ)器通過(guò)直接存儲(chǔ)器訪問(wèn) (DMA) 在 DDR 存儲(chǔ)器存儲(chǔ)外部緩沖數(shù)據(jù)。
AMD-Xilinx 提供了一個(gè)稱(chēng)為 AXI Virtual FIFO Controller 的 IP 內(nèi)核,以簡(jiǎn)化開(kāi)發(fā)人員希望使用 DDR 存儲(chǔ)器將信號(hào)或數(shù)據(jù)樣本存儲(chǔ)在外部 DDR 中作為 FIFO 的情況。
AXI Virtual FIFO Controller為開(kāi)發(fā)人員提供可連接到信號(hào)處理路徑的主從 AXI 流端口。與 DDR 存儲(chǔ)器的接口由完整的 AXI 接口提供。

使用這些接口,AXI Virtual FIFO Controller能夠在 DDR 中創(chuàng)建一個(gè) FIFO,并且能夠存儲(chǔ)比使用內(nèi)部 BRAM 更大數(shù)量的數(shù)據(jù)。
AXI Virtual FIFO Controller能夠?qū)⒍鄠€(gè)通道數(shù)據(jù)存儲(chǔ)在外部 DDR 中。需要注意的一件事是內(nèi)存位置與其他內(nèi)存使用(例如,MicroBlaze 應(yīng)用程序)可能會(huì)發(fā)生沖突。在 IP 定制時(shí),我們能夠分配的空間需要注意。

接下來(lái)創(chuàng)建一個(gè)以 Xilinx FPGA(S7-50 )為目標(biāo)的小項(xiàng)目,項(xiàng)目主要演示AXI Virtual FIFO Controller的工作原理。在本設(shè)計(jì)中,XADC 是要寫(xiě)入 DDR 的 AXI Stream 數(shù)據(jù)的來(lái)源,DDR 可以通過(guò) AXI Stream 輸出其樣本。
AXI Virtual FIFO Controller 的輸出(讀取通道)連接到 AXI Stream FIFO ,最后處理器通過(guò) AXI4-Lite 接口讀取數(shù)據(jù)。
下面顯示了設(shè)計(jì)中的輸入路徑,其中包含由 XADC 生成的信號(hào)和一個(gè)subset convertor,用于將 TLast 信號(hào)添加到 AXI 流。AXI ILA 使 XADC 生成的數(shù)據(jù)能夠與我們稍后在 DDR 存儲(chǔ)器中看到的數(shù)據(jù)進(jìn)行對(duì)比。然后,信號(hào)通過(guò) AXI Virtual FIFO Controller進(jìn)入 DDR。

輸出路徑類(lèi)似。它從 DDR 通過(guò) SMC 進(jìn)入 AXI Virtual FIFO Controller,然后輸出到 AXI Stream FIFO,MicroBlaze 就可以訪問(wèn)它。

將此下載到 FPGA 后,我們可以運(yùn)行一個(gè)簡(jiǎn)單的 hello world 應(yīng)用程序,暫停程序,并觀察 AXI Virtual FIFO Controller緩沖數(shù)據(jù)的 DDR 內(nèi)存位置。

該數(shù)據(jù)可以通過(guò)觀察 Vivado ?ILA 來(lái)對(duì)比。

輸出路徑需要 AXI Stream FIFO 斷言 Tready 信號(hào)。為此,我們需要使用 MicroBlaze 上運(yùn)行的軟件配置 AXI Stream FIFO。
在本節(jié)中,我們將繼續(xù)檢查輸出路徑,了解如何使用AXI Stream FIFO 從 DDR 中的 AXI Virtual FIFO Controller讀取樣本。

AXI Stream FIFO 允許開(kāi)發(fā)人員能夠從 AXI 內(nèi)存映射外設(shè)訪問(wèn) AXI 流,而無(wú)需實(shí)施完整的 DMA 解決方案。為了實(shí)現(xiàn)這一點(diǎn),AXI Stream FIFO 提供了從 AXI MM 到 AXI 流的讀寫(xiě)能力。就像此示例一樣,這可用于與AXI Virtual FIFO Controller或 IP 進(jìn)行交互,例如快速傅里葉變換,它具有通過(guò) AXIS 的配置數(shù)據(jù)。
為了與我們的設(shè)計(jì)交互,AXI Stream FIFO 提供了以下接口:
RX Stream Data – 這是要由 AXI Stream FIFO 接收的數(shù)據(jù)
TX Stream Data — 這是由 AXI Stream FIFO ?傳輸?shù)臄?shù)據(jù)
TX Stream Control Data – 此接口支持 AXI 以太網(wǎng) IP 內(nèi)核的傳輸協(xié)議
AXI Lite – 用于訪問(wèn)配置寄存器和數(shù)據(jù) Tx 和 Rx 數(shù)據(jù)的內(nèi)存映射接口
AXI MM – 用于數(shù)據(jù) Tx/Rx 的可選 AXI MM 接口

AXI Stream FIFO 提供了一個(gè)簡(jiǎn)單的寄存器接口,使用戶(hù)能夠定義以下內(nèi)容:
Transmission Length——要傳輸?shù)臄?shù)據(jù)的長(zhǎng)度
Transmission Vacancy – FIFO 中當(dāng)前空的位置
Receive Length – 接收到的數(shù)據(jù)包的長(zhǎng)度
Receive Occupancy – FIFO 中占用的插槽數(shù)
Receive / Transmission Destination – 邊帶 AXIS 信號(hào) TIDest
Receive / Transmission ID – Side band AXIS 信號(hào) TId
Receive / Transmission User – Side band AXIS 信號(hào) TUser
系統(tǒng)/傳輸和接收中斷
系統(tǒng)/傳輸和接收復(fù)位
通過(guò)寫(xiě)入 FIFO 或從 FIFO 讀取的內(nèi)存地址從 AXI Stream FIFO 寫(xiě)入或讀取數(shù)據(jù)。
在此應(yīng)用程序中,我們僅使用接收路徑使用 MicroBlaze 從 AXI Virtual FIFO Controller讀取樣本。
在軟件中設(shè)置非常簡(jiǎn)單。我們需要在軟件中執(zhí)行以下操作:
配置 AXI Stream FIFO
讀取FIFO的占用情況
從 FIFO 中讀出指定的字?jǐn)?shù)
在應(yīng)用軟件中根據(jù)需要處理樣品
#include?
#include?"platform.h"
#include?"xil_printf.h"
#include?"xstreamer.h"
#include?"xllfifo.h"
#define?FIFO_DEV_ID?????XPAR_AXI_FIFO_0_DEVICE_ID
#define?WORD_SIZE?4
XLlFifo_Config?*Config;
XLlFifo?FifoInstance;
int?main()
{
?int?Status,i;
?u32?RxWord;
?static?u32?ReceiveLength;
????init_platform();
????Config?=?XLlFfio_LookupConfig(FIFO_DEV_ID);
????XLlFifo_CfgInitialize(&FifoInstance,?Config,?Config->BaseAddress);
????print("Hello?World\n\r");
????print("Successfully?ran?Hello?World?application");
?/*?Check?for?the?Reset?value?*/
?Status?=?XLlFifo_Status(&FifoInstance);
?XLlFifo_IntClear(&FifoInstance,0xffffffff);
?Status?=?XLlFifo_Status(&FifoInstance);
?if(Status?!=?0x0)?{
??xil_printf("\n?ERROR?:?Reset?value?of?ISR0?:?0x%x\t"
???????"Expected?:?0x0\n\r",
???????XLlFifo_Status(&FifoInstance));
??return?XST_FAILURE;
?}
while(1){
?while(XLlFifo_iRxOccupancy(&FifoInstance))?{
??/*?Read?Receive?Length?*/
??ReceiveLength?=?(XLlFifo_iRxGetLen(&FifoInstance))/WORD_SIZE;
??for?(i=0;?i?
???RxWord?=?XLlFifo_RxGetWord(&FifoInstance);
???printf("%x?\n\r",RxWord);
??}
?}
}
????cleanup_platform();
????return?0;
}
源程序如下:
https://github.com/ATaylorCEngFIET/MZ_439

查看 AXI Virtual FIFO Controlle和 AXI Stream FIFO 后,這些 IP 內(nèi)核在我們希望緩沖大量數(shù)據(jù)并與 AXI 流交互而無(wú)需 DMA 開(kāi)銷(xiāo)的應(yīng)用中都非常有用。
往期精選?
?
?
FPGA技術(shù)江湖廣發(fā)江湖帖
無(wú)廣告純凈模式,給技術(shù)交流一片凈土,從初學(xué)小白到行業(yè)精英業(yè)界大佬等,從軍工領(lǐng)域到民用企業(yè)等,從通信、圖像處理到人工智能等各個(gè)方向應(yīng)有盡有,QQ微信雙選,F(xiàn)PGA技術(shù)江湖打造最純凈最專(zhuān)業(yè)的技術(shù)交流學(xué)習(xí)平臺(tái)。
FPGA技術(shù)江湖微信交流群

加群主微信,備注職業(yè)+方向+名字進(jìn)群
FPGA技術(shù)江湖QQ交流群

備注地區(qū)+職業(yè)+方向+名字進(jìn)群
