网站木马 代码,外部门户网站首页,什么是网站的推广,wordpress 注册密码VIVADO FIFO (同步和异步) IP 核详细使用配置步骤 目录
前言
一、同步FIFO的使用
1、配置
2、仿真
二、异步FIFO的使用
1、配置
2、仿真 前言 在系统设计中#xff0c;利用FIFO#xff08;first in first out#xff09;进行数据处理是再普遍不过的应用了#xff0c… VIVADO FIFO (同步和异步) IP 核详细使用配置步骤 目录
前言
一、同步FIFO的使用
1、配置
2、仿真
二、异步FIFO的使用
1、配置
2、仿真 前言 在系统设计中利用FIFOfirst in first out进行数据处理是再普遍不过的应用了使用FIFO实现不同域时钟的数据同步总线位宽调整数据缓存等。本文以xilinx vivado中的FIFO IP 核为例详细介绍其配置步骤并给出详细的仿真本文包含同步和异步不同时钟FIFO的详细使用步骤。 提示以下是本篇文章正文内容转载请附上原文链接
一、同步FIFO的使用
1、配置 在IP Catalog 界面搜索FIFO并双击FIFO Generator开始配置IP 核。对IP核命名不妨取test_synchronous_fifo同步FIFO的测试。
首先配置Basic界面
Interface Type 保持默认即可一般不选AXI接口。
FIFO Implementation 选用什么资源生成FIFO这里选择 Common Clock Block RAM即用块RAM资源生成一个同步FIFO。
该界面下面显示的是在选定方式生成的FIFO具有的特点。 然后配置Native Ports界面
Read Mode 默认选Standard FIFOFirst FIFO Fall Through 会在没有读的时候就在读端口放置第一个数据如手册中的下图所示只要写入一个数据 D1 后在rd_en为低电平的时候dout就会变成D1且valid一直拉高。大家可以根据自己的需求选择对应的读模式。 Data Port Parameters 用来配置读写的深度和数据位宽这里示例配置4bit宽度16的深度。
要留意一下配置的深度和实际的深度手册中提及了选择不同实现方式Basic 界面实际深度与配置的深度是有差异的实际深度才是可以使用的深度。
ECC,Output... 是IP核纠错输出端加寄存器的功能在配置时其实不用管不用勾选任何东西。
Initialization 勾选复位类型选择同步复位Full Flags Reset Value 是复位时满标志的默认电平Dout Reset Value 是复位时默认的读端口输出。 再然后配置Status Flags界面
Optional Flags中的Almost Full Flag是快要写满标志即再写一个数据就满了的提示 Almost Empty Flag是快要读空标志即再读一个数据就空了的提示。
Write Acknowledge 是写数据的标志如果勾选高电平有效则其拉高表示数据被写入。
Overflow 是溢出标志如果满了继续写数据是写不了的溢出了。
valid Flag 读数据时输出数据有效的标志。
Underflow Flag 下溢标志如果选择高电平有效也就是读空了继续读该标志就会拉高。
Programmable Flags 是自定义一个数据写多少个就算满的标志信号和数据还剩多少个就算空的标志信号可以在IP核界面配置固定的值也可以引入两个输入端口由程序编程设置。需要用到该功能的可自行配置。
此处按下图配置届时仿真可观察这些信号。 最后配置Data Counts界面
可以勾选Data Count指示FIFO中还有多少个数据。由于此时是同步FIFO所以只有一个Data Count。 至此同步 FIFO 配置完成下面进行仿真。
2、仿真 创建一个名为 tb_synchronous_fifo 的 testbench 文件测试以上配置的FIFO。
timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2025/01/15 11:36:36
// Design Name:
// Module Name: tb_synchronous_fifo
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module tb_synchronous_fifo();parameter PERIOD 2;reg clk1;
reg rst_n0;
reg [3 : 0] din0;
reg wr_en0;
reg rd_en0;wire [3 : 0] dout;
wire full;
wire almost_full;
wire wr_ack;
wire overflow;
wire empty;
wire almost_empty;
wire valid;
wire underflow;
wire [3 : 0] data_count;initial
beginforever #(PERIOD/2) clk~clk;
endinitial
begin#(PERIOD*5) rst_n 1;
endreg [4:0] cnt;
always (posedge clk or negedge rst_n)
beginif(!rst_n)beginwr_en0;cnt0;endelse if(cnt16)begincntcnt1;wr_en1;dindin1;endelsebeginwr_en0;end
endalways (posedge clk or negedge rst_n)
beginif(!rst_n)beginrd_en0;endelse if(cnt16)beginrd_en1;end
endtest_synchronous_fifo u_test_synchronous_fifo (.clk(clk), // input wire clk .srst(!rst_n), // input wire srst ip核本身是高电平复位.din(din), // input wire [3 : 0] din.wr_en(wr_en), // input wire wr_en.rd_en(rd_en), // input wire rd_en.dout(dout), // output wire [3 : 0] dout.full(full), // output wire full.almost_full(almost_full), // output wire almost_full.wr_ack(wr_ack), // output wire wr_ack.overflow(overflow), // output wire overflow.empty(empty), // output wire empty.almost_empty(almost_empty), // output wire almost_empty.valid(valid), // output wire valid.underflow(underflow), // output wire underflow.data_count(data_count) // output wire [3 : 0] data_count
);endmodule从以上结果可以看出写入16个数据读出16个数据谁先写入就先被读出。大家可自行观察其他信号的变化是否和自己理解的一致。 上面配置FIFO的深度只有16如果写入数据个数大于16数据能写进去吗答案是写不进去并不是我们理解的满了再进就会将最开始进的挤出去。VIVADO FIFO IP就是这样这样设置的没有办法改变那么如果某些场景下需要这种满了再进就会将最开始进的挤出去的这种功能光调用IP还无法实现。 例如将上面代码中的 else if(cnt16) 和 else if(cnt16) 两句代码中的16改成20再仿真结果如下分析结果可以得出满了继续写不会将最开始写的挤出去而是直接忽视掉再写的数据。 二、异步FIFO的使用
1、配置 在IP Catalog 界面搜索FIFO并双击FIFO Generator开始配置IP 核。对IP核命名不妨取test_asynchronous_fifo异步FIFO的测试。
首先配置Basic界面
Interface Type 保持默认即可一般不选AXI接口。
FIFO Implementation 选用什么资源生成FIFO这里选择 Independent Clocks Block RAM即用块RAM资源生成一个异步FIFO。
相比于同步FIFO多了synchronization Stages的配置这个相当于写时钟域里面的数据经过多少个时钟周期同步到读时钟区域可以理解成延时打拍同步。
该界面下面显示的是在选定方式生成的FIFO具有的特点。 然后配置Native Ports界面
Read Mode 同步FIFO配置有介绍此处默认选Standard FIFO。
Data Port Parameters 用来配置读写的深度和数据位宽这里示例配置4bit宽度16的深度。
要留意一下配置的深度和实际的深度手册中提及了选择不同实现方式Basic 界面实际深度与配置的深度是有差异的实际深度才是可以使用的深度。异步FIFO此时实际可使用的深度就比我们配置的少了一个。
ECC,Output... 是IP核自己纠错输出端加寄存器的功能在配置时其实不用管不用勾选任何东西。
Initialization 勾选复位Reset Type 固定了只能异步复位是相对于整个IP而言。Full Flags Reset Value 是复位后满标志的默认电平Dout Reset Value 是复位后默认的读端口输出。
相比于同步FIFO多了Enable Reset Synchronization该选项是读写时钟域分开来看时在各自的时钟域里面使用同步复位。Enable Safety Circuit 手册说是一个保护电路默认勾选即可不用过多纠结。
Full Flags Reset Value 是复位时满标志默认电平Dout Reset Value 是复位时默认读端口输出。 再然后配置Status Flags界面
同步FIFO配置界面已一 一说明。此处按下图配置届时仿真可观察这些信号。 最后配置Data Counts界面
Data Count指示FIFO中还有多少个数据。由于此时是异步FIFO所以读写各有一个Data Count。 至此异步 FIFO 配置完成下面进行仿真。
2、仿真 创建一个名为 tb_asynchronous_fifo 的 testbench 文件测试以上配置的异步FIFO。
timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2025/01/15 12:20:08
// Design Name:
// Module Name: tb_asynchronous_fifo
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module tb_asynchronous_fifo();parameter PERIOD 2;reg rst_n0;
reg wr_clk1;
reg rd_clk1;
reg [3 : 0] din0;
reg wr_en0;
reg rd_en0;wire [3 : 0] dout;
wire full;
wire almost_full;
wire wr_ack;
wire overflow;
wire empty;
wire almost_empty;
wire valid;
wire underflow;
wire [3 : 0] rd_data_count;
wire [3 : 0] wr_data_count;
wire wr_rst_busy;
wire rd_rst_busy;initial
beginforever #(PERIOD/2) wr_clk~wr_clk;
endinitial
beginforever #(PERIOD) rd_clk~rd_clk;
endinitial
begin#(PERIOD*5) rst_n 1;
endreg flag0;initial
begin#(PERIOD*28) flag 1;#(PERIOD) flag 0;
endreg [4:0] cnt;
always (posedge wr_clk or negedge rst_n)
beginif(!rst_n)beginwr_en0;cnt0;endelse if(flag)begincntcnt1;wr_en1;dindin1;endelse if(1cntcnt16)begincntcnt1;wr_en1;dindin1;endelsebeginwr_en0;end
endalways (posedge rd_clk or negedge rst_n)
beginif(!rst_n)beginrd_en0;endelse if(cnt16)beginrd_en1;end
endtest_asynchronous_fifo u_test_asynchronous_fifo (.rst(!rst_n), // input wire rst.wr_clk(wr_clk), // input wire wr_clk.rd_clk(rd_clk), // input wire rd_clk.din(din), // input wire [3 : 0] din.wr_en(wr_en), // input wire wr_en.rd_en(rd_en), // input wire rd_en.dout(dout), // output wire [3 : 0] dout.full(full), // output wire full.almost_full(almost_full), // output wire almost_full.wr_ack(wr_ack), // output wire wr_ack.overflow(overflow), // output wire overflow.empty(empty), // output wire empty.almost_empty(almost_empty), // output wire almost_empty.valid(valid), // output wire valid.underflow(underflow), // output wire underflow.rd_data_count(rd_data_count), // output wire [3 : 0] rd_data_count.wr_data_count(wr_data_count), // output wire [3 : 0] wr_data_count.wr_rst_busy(wr_rst_busy), // output wire wr_rst_busy.rd_rst_busy(rd_rst_busy) // output wire rd_rst_busy
);endmodule观察上面的仿真结果第一复位时满信号为1与我们IP配置界面相吻合第二因为本身实际容量只有15个数据我们写16个数据溢出了一个图中overflow拉高了一个电平与同步FIFO一样写满了就写不进去了第三图中两条黄色线之间相差4个读时钟周期就是我们前面配置提到的延迟打拍保证时钟区域同步那明明前面配置的是2为什么这里为4呢这是因为下图中的数字2造成的224。 接下来将IP配置界面的同步拍数改为3那么仿真图中两条黄色线之间则会有5个读时钟周期以保证数据同步到读时钟域如下面仿真图所示。 至此本文结束。说明一下如果自己想设置写到一定数量就有满标志提示还剩多少个就有空标志提示就需要去配置Status Flags界面的Programmable Flags。