Vivado IP核提供了強(qiáng)大的FIFO生成器,可以通過(guò)圖形化配置快速生成FIFO IP核。
本文將詳細(xì)介紹如何在Vivado中配置一個(gè)FIFO IP核,以及如何調(diào)用這個(gè)FIFO IP核。
一、FIFO IP核的配置
1、新建FIFO IP
在Vivado的IP Catalog中找到FIFO Generator IP核,雙擊打開參數(shù)配置界面。
2、配置FIFO基本參數(shù)
編輯切換為居中
添加圖片注釋,不超過(guò) 140 字(可選)
(1)接口類型
Native interface FIFOs:
這是最基本的FIFO接口,包括數(shù)據(jù)輸入、輸出端口、寫使能、讀使能等信號(hào)。
AXI Memory Mapped interface FIFOs:
這種接口將 FIFO 封裝為一個(gè)AXI內(nèi)存映射的IP核,可以通過(guò)AXI總線進(jìn)行訪問。
AXI4-Stream interface FIFOs:
這種接口兼容AXI4-Stream協(xié)議,適合在流式數(shù)據(jù)傳輸場(chǎng)景中使用。
(2)時(shí)鐘類型和資源類型
時(shí)鐘:
同步時(shí)鐘(common clock) 和 異步時(shí)鐘(Independent clock)
資源:
block RAM、Distributed RAM、Shift Register、Built-in FIFO
3、配置fifo接口參數(shù)
(1)讀模式設(shè)置
Standard FIFO:標(biāo)誰(shuí)讀模式,接收到讀使能后下一個(gè)周期輸出數(shù)據(jù)
First Word Fall Through:先入先出模式,只有FIFO中有數(shù)據(jù),則自動(dòng)輸出第一個(gè)數(shù)據(jù),并保持這個(gè)數(shù)據(jù)輸出
(2)數(shù)據(jù)接口參數(shù)設(shè)置
FIFO讀數(shù)據(jù)接口的位寬和深度,F(xiàn)IFO寫數(shù)據(jù)接口的位寬和深度
(3)ECC和輸出寄存器設(shè)置
(4)初始化設(shè)置
4、狀態(tài)信號(hào)接口設(shè)置
根據(jù)實(shí)際需求,選擇對(duì)應(yīng)的狀態(tài)信號(hào)即可。
注意(Programmable Flags):自定義FIFO緩存深度是否達(dá)到設(shè)定值的信號(hào),可以用于設(shè)定半滿或半空信號(hào)。
5、計(jì)數(shù)端口設(shè)置
fifo已緩存的數(shù)據(jù)深度計(jì)數(shù),可選。
6、FIFO設(shè)置參數(shù)總覽
這是FIFO IP的設(shè)置參數(shù)總覽,可看到資源消耗、寬度、深度、讀延遲等信息。
7、點(diǎn)擊OK生成FIFO IP核。
二、FIFO IP核的接口
生成的FIFO IP核提供以下接口:
wr_clk 寫時(shí)鐘
rd_clk 讀時(shí)鐘
din 數(shù)據(jù)輸入端口,寬度為配置的Data Width;
wr_en 寫使能信號(hào);
rd_en 讀使能信號(hào);
dout 數(shù)據(jù)輸出端口;
full 滿標(biāo)志,高電平表示FIFO滿;
empty 空標(biāo)志,高電平表示FIFO空;
almost_full 幾乎滿標(biāo)志;
almost_empty 幾乎空標(biāo)志;
valid 有效數(shù)據(jù)標(biāo)志
rd_data_count 讀計(jì)數(shù)
wr_data_count 寫計(jì)數(shù)
overflow 寫溢出標(biāo)記
underflow 讀溢出標(biāo)記
三、FIFO IP核的調(diào)用
FIFO IP核的調(diào)用很簡(jiǎn)單,只需要對(duì)接口進(jìn)行適當(dāng)?shù)倪B接,并根據(jù)Full和Empty標(biāo)志控制讀寫使能信號(hào)。下面給出一個(gè)簡(jiǎn)單的調(diào)用例子:
module fifo_test(
input clk,
input [17:0] din,
input wr_en, rd_en,
output valid,
output [17:0] dout,
output full, empty, overflow, underflow
);
fifo_generator_0 fifo_inst(
.clk(clk),
.din(din),
.wr_en(wr_en),
.rd_en(rd_en),
.dout(dout),
.full(full),
.empty(empty),
.overflow(overflow),
.valid(valid),
.underflow(underflow)
);
endmodule
在這個(gè)例子中,din和wr_en分別連接到FIFO的輸入端口,dout和empty連接到輸出端口。在寫入數(shù)據(jù)時(shí)需要檢查full信號(hào),在讀出數(shù)據(jù)時(shí)需要檢查empty信號(hào),以避免overflow和underflow的情況發(fā)生。
下面是FIFO IP核的一個(gè)簡(jiǎn)單的testbench:
`timescale 1ns / 1ps
module fifo_testbench();
reg clk;
reg [17:0] din;
reg wr_en;
reg rd_en;
wire valid;
wire [17:0] dout;
wire full, empty, overflow, underflow;
fifo_test dut(
.clk(clk),
.din(din),
.wr_en(wr_en),
.rd_en(rd_en),
.dout(dout),
.full(full),
.empty(empty),
.overflow(overflow),
.valid(valid),
.underflow(underflow)
);
always #5 clk = ~clk;
initial begin
clk = 0;
wr_en = 0; rd_en = 0;
#10;
wr_en = 1; din = 18'd1;
#10;
wr_en = 1; din = 18'd2;
#10;
wr_en = 1; din = 18'd3;
#10;
wr_en = 0; rd_en = 1;
#10;
wr_en = 0; rd_en = 1;
#10;
wr_en = 1; din = 18'd4;
wr_en = 1; din = 18'd5;
#10;
wr_en = 0; rd_en = 1;
#10
wr_en = 0; rd_en = 1;
#10;
$finish;
end
endmodule
這個(gè)testbench通過(guò) Applying 不同的讀寫使能信號(hào)來(lái)測(cè)試FIFO的寫入和讀取功能。
仿真測(cè)試圖:
(1)FIFO讀模式設(shè)置為“Standard FIFO”
valid信號(hào)完全由rd_en控制。
(2)FIFO讀模式設(shè)置為“First Word Fall Through”
緩存一定長(zhǎng)度數(shù)據(jù)后,自動(dòng)讀取第一個(gè)數(shù)據(jù),并保持,直到下一個(gè)rd_en 信號(hào)到來(lái)。
四、總結(jié)
通過(guò)上面的描述,我們?cè)敿?xì)介紹了如何在Vivado中配置FIFO IP核,F(xiàn)IFO的接口信號(hào),以及如何調(diào)用FIFO IP核的一個(gè)簡(jiǎn)單例子。FIFO是一種非常常用的IP核,通過(guò)Vivado的FIFO Generator可以大大簡(jiǎn)化配置和使用FIFO的過(guò)程。
-
接口
+關(guān)注
關(guān)注
33文章
8691瀏覽量
151919 -
fifo
+關(guān)注
關(guān)注
3文章
389瀏覽量
43858 -
IP核
+關(guān)注
關(guān)注
4文章
331瀏覽量
49639 -
生成器
+關(guān)注
關(guān)注
7文章
319瀏覽量
21128 -
Vivado
+關(guān)注
關(guān)注
19文章
815瀏覽量
66889
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論