您现在的位置是:男性 >>正文

FIFO IP核的运用教程

男性7863人已围观

简介导言。在数字规划中,运用FIFO进行数据处理是十分遍及的运用,例如,完结。时钟。域穿插、低延时存储器缓存、总线位宽调整等。下图给出了FIFO生成器支撑的一种或许装备。规划中有两个独立的时钟域而且读数据 ...

导言。

在数字规划中,运用FIFO进行数据处理是十分遍及的运用,例如,完结。时钟。域穿插、低延时存储器缓存、总线位宽调整等。下图给出了FIFO生成器支撑的一种或许装备。

规划中有两个独立的时钟域而且读数据总线的位宽是写数据总线位宽的2倍。运用FIFO生成器能够快速完结这种装备,然后在Xilinx。 FPGA。芯片。上完结特定的规划要求。

实践运用事例:本事例布景是将。信号。处理系统中。ADC。收集到的数据写入FPGA芯片外挂的。DDR。3,完结采样数据的存储。AD。C采样率设定为96Mhz,两个采样点(两个16bit数据拼接成一个32bit)为单位,DDR读写时钟速率为150Mhz,总线数据位宽64bit,二者时钟域、位宽均不同,故需在中心参加一级FIFO,然后完结时钟域的穿插以及总线位宽的调整。

下面将从FIFO IP核的创立,模块程序编写,功用。仿真。验证等三个方面完结本事例的介绍:

1)FIFO IP核的创立:翻开Vivado软件(本例程根据Vivado 2018.3版别)IP catalog一栏,输入FIFO,双击进入如下界面,第一个B。asic。选项卡主要是设置FIFO。接口。类型,可设置为正常的Na。ti。ve形式或AXI总线接口,一般咱们挑选Native即可。然后挑选FIFO完结的类型:读写运用独立时钟仍是同一时钟,完结时运用分布式。RAM。、Block RAM仍是专用的FIFO等等,这儿咱们挑选Independent Clocks Block RAM,即独立时钟块RAM的FIFO。

切换至第二个Native Ports选项卡,这个界面主要是设置读写数据位宽、深度以及一些。端口。的使能、端口复位值等的设置。结合本事例的运用,设置写位宽为32bit,深度设置为1024,读位宽设置为64bit。使能复位管脚,设置满信号(Full Flags)的复位值为0,读数据(Dout)复位值为0。

然后切换至第三个Status Flags选项卡,本选项卡是设置其他一些可选的标志信号,本事例需运用本界面下的Programmable Flags,即可。编程。的标志信号,设置满标志门限置位值(Full Threshold Assert Value),可使FIFO写入的数据总数大于等于该值后将prog_full(可编程满标志信号)拉高,比较full信号运用起来更灵敏。DDR读写选用Bu。rs。t方法(突发传输),一次接连写入256个数,这儿设置Full Threshold Assert Value为512(256*2,2是FIFO读写位宽的比值),当FIFO写入512个数后,prog_full拉高,进行FIFO读操作,一次接连读256个64bit的数(对应写的512个32bit数)存入DDR。

切换至第四个Data Counts选项卡,本选项卡主要是挑选是否运用读写数据计数,本事例不运用计数,此页面坚持默认设置。

最终Summary选项卡是FIFO设置后的各项。信息。,可核对FIFO设置是否正确及规划是否满足要求。

2)模块程序的编写。

顶层模块:FIFO_。te。st.v。

module FIFO_test(。

input rst,

input wr_clk,

input rd_clk,

input [31:0] din,

input wr_en,

input rd_en,

output [63:0] dout,

output full,

output empty,

output prog_full,

output wr_rst_busy,

output rd_rst_busy。

);

fifo_generator_0 U_fifo (。

.rst(rst), // input wire rst。

.wr_clk(wr_clk), // input wire wr_clk。

.rd_clk(rd_clk), // input wire rd_clk。

.din(din), // input wire [31 : 0] din。

.wr_en(wr_en), // input wire wr_en。

.rd_en(rd_en), // input wire rd_en。

.dout(dout), // output wire [63 : 0] dout。

.full(full), // output wire full。

.empty(empty), // output wire empty。

.prog_full(prog_full), // output wire prog_full。

.wr_rst_busy(wr_rst_busy), // output wire wr_rst_busy。

.rd_rst_busy(rd_rst_busy) // output wire rd_rst_busy。

);

endmodule。

TestBench模块:FIFO_。sim。

module FIFO_sim;

reg rst;

reg wr_clk;

reg rd_clk;

reg [31:0] din;

reg wr_en;

reg rd_en;

wire [63:0] dout;

wire full;

wire empty;

wire prog_full;

wire wr_rst_busy;

wire rd_rst_busy;

initial begin。

rst = 1;

wr_clk = 0;

wr_en = 0;

rd_clk = 0;

rd_en = 0;

din = 0;

#1000。

rst = 0;

end。

always #10.4167 wr_clk = ~wr_clk;

always #3.3333 rd_clk = ~rd_clk;

always (posedge wr_clk) begin。

if(!wr_rst_busy && !rst) begin。

wr_en。 <= 1'b1;

din。 <= din + 1'b1;

end。

end。

reg [1:0] RD_state = 2'b01;

reg [15:0] rd_count = 'd0;

always (posedge rd_clk) begin。

case(RD_state)。

2'b01: begin。

if(!rd_rst_busy && prog_full) RD_state。 <= 2'b10;

end。

2'b10: begin。

if(rd_count >= 'd256) begin。

RD_state。 <= 2'b01;

rd_count。 <= 'd0;

rd_en。 <= 1'b0;

end。

else begin。

rd_count。 <= rd_count + 1'b1;

rd_en。 <= 1'b1;  

end。

end。

default: begin。

RD_state。 <= 2'b01;

end。

en。dc。ase。

end。

FIFO_test U_FIFO_test(。

.rst(rst),

.wr_clk(wr_clk),

.rd_clk(rd_clk),

.din(din),

.wr_en(wr_en),

.rd_en(rd_en),

.dout(dout),

.full(full),

.empty(empty),

.prog_full(prog_full),

.wr_rst_busy(wr_rst_busy),

.rd_rst_busy(rd_rst_busy)。

);

endmodule。

编写TestBench时,写时钟为48Mhz,读时钟为150MHz。写是接连的,使能一向翻开,表明AD是一向接连作业的,写入够512个数后,prog_full拉高,进行一次FIFO读操作,接连读出256个数,然后等候下一次prog_full为高的到来,如此循环往复。

3)波形功用仿真。

点击Run simulation,发动功用仿真,能够看到FIFO一开始复位完毕后,进行写操作,每写够512个数后,prog_full拉高,进行一次读操作,接连读出256个数后,中止读操作,等候下一次prog_full拉高时间的到来。将读出的数据和写入的数据比照,完全一致,不存在丢数的状况,因而验证了功用的正确性。

总结:经过本事例代码程序的编写以及波形功用仿真,能够了解并把握FIFO的基本功用和常用用法:数据跨时钟域及总线位宽调整。本例程是我自己在一个项目中用到的,结合自己的需求进行编写的,并不具有普适性,写此博客的初衷也是让一些不了解FIFO用法的读者能快速入门,或许并不能直接协助到一切的读者。期望我们能够在此基础上,结合自己的工程运用实例,完结自己相应的规划。

原文链接:https://blog.csdn.net/qq_43622265/article/det。ai。ls/113497121。

内容来源:https://tongdaidmxanh.com/app-1/cách đăng ký m99 asia,http://chatbotjud-teste.saude.mg.gov.br/app-1/paris-bet-777

Tags:

系统发生错误

系统发生错误

您可以选择 [ 重试 ] [ 返回 ] 或者 [ 回到首页 ]

[ 错误信息 ]

页面发生异常错误,系统设置开启调试模式后,刷新本页查看具体错误!