FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真

这篇具有很好参考价值的文章主要介绍了FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、FIFO的介绍

1、 FIFO:(First In First Out),是有先进先出特性的缓存器,常被用于数据的缓存或者高速异步数据的交互。

2、 FIFO与普通存储器的区别在于:它没有外部读写地址线(其数据地址由内部读写指针自动加 1 完成),操作简单但不能指定某一地址。

3、主要包含两种:单时钟FIFO和双时钟FIFO
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真

详细的资料

二、FIFO常见参数

FIFO 的宽度:即 FIFO 一次读写操作的数据位;
FIFO 的深度:指的是 FIFO 可以存储多少个 N 位的数据(如果宽度为 N)。————深度的计算方式
同步与异步的设置。【同步读写位宽必须相同,异步的话可设置不同位宽】

FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真

读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。
写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。
对于同步FIFO来说,读写为同一时钟。

FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真

满标志full: FIFO 已满或将满时由 FIFO 的状态电路送出的一个信号,以阻止 FIFO的写操作继续向 FIFO 中写数据而造成溢出。
空标志empty: FIFO 已空或将空时由 FIFO 的状态电路送出的一个信号,以阻止 FIFO的读操作继续从 FIFO 中读出数据而造成无效数据的读出。

将满almost full:可设置将满的位置
将空almost empty:可设置将空的位置

FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真

Normal模式: rdreq相当于读请求信号。rdreq有效,则下一clk上升沿即可读q数据。

Show-ahead模式: rdreq 相当于读应答信号,即 rdreq 还没有有效时, q 端口上已经输出了一个有效的数据, rdreq 信号有效时则,相当于通知 FIFO 内部的控制逻辑 q 端口上的数据已经被读取,则 FIFO 内部的逻辑会从 RAM 中再取出一个新的数据,在下一个时钟周期输出到 q 端口上。总之, q 端口上的数据 与 rdreq 同时有效,没有读潜伏期。

FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真

ip参数的学习

三、FIFO的实现

一种:根据需求自己编写FIFO
二种:调用IP核

四、仿真

4.1 同步FIFO的仿真

读写采用同一时钟,调用ip后,将其例化到顶层中:
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真

FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
编写tb进行仿真:

`timescale 1ns/1ps

module fifo_tb();

   reg	  clk;
	reg	[7:0]  data;
	reg	  rdreq;
	reg	  sclr;
	reg	  wrreq;
	
	wire	  almost_empty;
	wire	  almost_full;
	wire	  empty;
	wire	  full;
	wire	[7:0]  q;
	wire	[6:0]  usedw;

FIFO FIFO (
	.clk(clk),
	.data(data),
	.rdreq(rdreq),
	.sclr(sclr),
	.wrreq(wrreq),
	.almost_empty(almost_empty),
	.almost_full(almost_full),
	.empty(empty),
	.full(full),
	.q(q),
	.usedw(usedw)
);

//产生时钟激励

initial begin
    clk =   0;
	 data =  1;
	 rdreq = 0;
	 sclr =  0;
	 wrreq = 0;
	 
	 #201;
    sclr = 1;
	 #101;
	 sclr = 0;
	 #200;
	 
	 	repeat(128)begin
			wrreq = 1;
			#20;
			data = data + 1;
		end
		wrreq = 0;

		repeat(128)begin
			rdreq = 1;
			#20;
			data = data + 1;
		end
		rdreq = 0;
		
		#500;
		$stop;	 
end

always #10 clk = ~clk;

endmodule

整体波形如下:
可看到wrreq写使能的时候,q无输出。
当rdreq有效的时候,q才能读数据。
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
wrreq高电平后,可以写数据,于是在clk上升沿处,usedw为1,说明已经使用了一个。usedw表示已使用深度
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
由于设置的FIFO深度是128,因此当写128个数据的时候,full满信号为高电平
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
当读使能rdreq为高电平的时候,开始读数据,先进先出,因此第一个数据从1开始,同时usedw已使用深度也逐渐减少。
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
当读到128的时候,说明数据全部读完,empty空信号标志为高电平,同时usedw已使用0.
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
由于设置的将空位置为2,因此是读到倒数第二个位置的时候almost_empty = 1
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
将满位置为125
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真


4.2 FIFO普通和慢速两种模式的仿真

对Normal 和 how-ahead模式 进行验证

分别调用Normal 和 how-ahead模式的ip核,将二者均例化到顶层模块中。

这里不再观察usedw等信号,主要各个模式下,数据与rdreq信号的关系。
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
tb测试文件:
同样的,wrreq高电平,写入1……128,共128个数据,rdreq高电平,将128先入先出读出来。

`timescale 1ns/1ps

module fifo_model_tb(); //对两种模式的fifo仿真

   reg	  clk;
	reg	[7:0]  data;
	
	reg	  rdreq;
	reg	  wrreq;
	
	wire	[7:0]  q_normal;
	wire	[7:0]  q_show_ahead;

FIFO FIFO (
	.clk(clk),
	.data(data),
	
	.rdreq(rdreq),
	.wrreq(wrreq),

	.q_normal(q_normal),
	.q_show_ahead(q_show_ahead)
);


//产生激励

initial begin
    clk =   0;
	 data =  1;
	 
	 rdreq = 0;
	 wrreq = 0;
	 
	 	repeat(128)begin
			wrreq = 1;
			#20;
			data = data + 1;
		end
		wrreq = 0;

		repeat(128)begin
			rdreq = 1;
			#20;
			data = data + 1;
		end
		rdreq = 0;
		
		#500;
		$stop;

	 
end
always #10 clk = ~clk;
endmodule

前面我们提到了
Normal模式: rdreq相当于读请求信号。rdreq有效,则下一clk上升沿即可读q数据。

Show-ahead模式: rdreq 相当于读应答信号,即 rdreq 还没有有效时, q 端口上已经输出了一个有效的数据, rdreq 信号有效时则,相当于通知 FIFO 内部的控制逻辑 q 端口上的数据已经被读取,则 FIFO 会再取出紧接着的新数据,在下一个时钟周期输出到 q 端口上。


波形如下,观察两种模式下,输出与rdreq的关系:

波形可看出,rdreq=1,normal模式下,在下一clk上升沿开始读数据1……128。
当Show-ahead模式下,rdreq=0无效时,q已经输出了一个有效数据1,rdreq=1有效时,相当于读应答,可告诉fifo,q输出上的1已经被读取,紧接着,在下一clk即可读下一个数据,也就是2……128。

因此波形验证与理论分析相同。

FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真


4.3 异步FIFO的仿真

调用异步FIFO的ip核:
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
将其例化到顶层中

FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真

编写tb文件:

`timescale 1ns/1ps

module fifo_tb(); //对同步fifo仿真

	reg	[7:0]  data;
   reg	  wrclk;
	reg     wrreq;
	
   reg	  rdclk;
	reg	  rdreq;
	
	wire rdempty;
   wire wrfull;
	wire	[7:0]  q;


DC_FIFO u1 (
	
	.data(data),
	.wrclk(wrclk),
	.wrreq(wrreq),
	
	.rdclk(rdclk),
	.rdreq(rdreq),
	
	.rdempty(rdempty),
	.wrfull(wrfull),
	
	.q(q)

);


//产生激励

initial begin
    wrclk = 0;
	 rdclk = 0;
	 
	 data =  1;
	 
	 rdreq = 0;
	 wrreq = 0;
	 #10;

	 
	 	repeat(32)begin
			wrreq = 1;
			#20;
			data = data + 1;
		end
		wrreq = 0;

		repeat(32)begin
		   #10;
			rdreq = 1;
			#20;
			data = data + 1;
		end
		rdreq = 0;
		
		#500;
		$stop;

	 
end
always #10 wrclk = ~wrclk;  //20ns
always #5 rdclk = ~rdclk;  //10ns

endmodule

波形:
波形可看出,读写采用了不同的时钟,同时wrreq=1开始写数据,写完32个数据后,wrreq = 0,wrfull = 1,同时写使能信号和写满标志信号的变化都发生在wrclk上升沿。——写有关的信号均与写时钟同步
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真
关于读:
当rdreq=1,开始读数据,从1……32。可看到rdreq=1时,在rdclk上升沿读到第一个数据1,当读完32个数据后,rdempty在rdclk上升沿处变为高电平。——读有关的信号均与读时钟同步
FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真

五、手写FIFO

我这里学习手写FIFO是为了更好地学习FIFO的本质。手写FIFO请看FIFO(二)。文章来源地址https://www.toymoban.com/news/detail-473891.html

到了这里,关于FIFO(一) —— Quartus中FIFO IP核的学习与modelsim仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Quartus联合 ModelSim仿真及测试

    插件系列文章目录: (1)modelsim安装使用及Vivado关联 (2)VSCode关联VIVADO编辑Verilog (3)Modelsim观察波形–基础操作述 (4)Quartus联合 ModelSim仿真及测试 Quartus联合 ModelSim仿真及测试 提示:以下是本篇文章正文内容,下面案例可供参考 [Quartus下载链接:https://pan.baidu.com/s/1t24

    2024年02月06日
    浏览(43)
  • Quartus调用ModelSim进行仿真的步骤

    1.建立工程,在建立工程的第四步中的Simulation下选择Tool Name为ModelSim-Altera,再在后面的Format(s)中选择Verilog HDL。继续构建完工程; 2.在工程中写好程序,保存并编译,确定没有错误后进行下一步; 3.选择Tools菜单中的Options,在General中选择EDA Tool Options,在右边的列表中有Model

    2024年02月11日
    浏览(40)
  • IP核的使用之FIFO(Vivado)

    在开始介绍 FIFO IP核 之前,我们先设想这么一个 实际场景 :FPGA内部有个16位计数器,以50MHz的频率计数,此时,我们希望随机截取计数器连续256个计数周期的值发到电脑上进行分析处理。用串口发送到电脑上。( 数据产生速率大于数据使用速率 ),此时需要使用存储器先将

    2024年01月18日
    浏览(38)
  • Quartus使用步骤及联合Modelsim仿真教程

    #使用记录# 对于Quartus的安装步骤这里不再进行讲解,modelsim的安装步骤后续文章会进行讲解,这里也就不过多说明。言归正传,现在来开始我们的使用教程: 1、首先点击打开Quartus软件,博主这里使用的是22版本的,其他版本的步骤也基本一样。 2、我们可以看到如下界面,点

    2024年02月05日
    浏览(47)
  • Quartus 13.1与Modelsim或Modelsim Altera进行波形联合仿真

    Quartus II 13.1软件自10.0版本以后,便不再自带波形仿真工具,需要借助Modelsim进行波形仿真。一般安装Quartus II的时候,会默认安装Modelsim Altera,如果需要用到Modelsim软件的话,需要额外再安装一下。本文将介绍一下Quartus II 13.1软件与Modelsim(需要提前安装好)或Modelsim Altera进行

    2024年02月11日
    浏览(44)
  • FPGA中FIFO的应用(三)——Vivado FIFO IP核的调用

    ⭐️作者简介: 小瑞同学 ,一个努力精进的 FPGA 和通信学习者。 🍎个人主页:小瑞同学的博客主页 🌻个人信条:越努力,越幸运! ⏰日期:2023.12.6 🔍来源:自学经历 📖文章内容概述:简单介绍了 FIFO IP核 常用参数的配置,通过仿真分析了异步IP的 读写数据 过程。 连载

    2024年01月18日
    浏览(38)
  • vivado工程转换到quartus下联合modelsim仿真

    版本信息:quartus II 13.1  、modelsim DE 10.6c vivado用习惯了,现在快速换到quartus下仿真测试。 写一个操作文档,以fpga实现pcm编码为例。 目录 一、建立工程 1、准备源码和仿真文件  2、新建工程 3、加载源文件 4、选择器件 5、仿真器配置 6、工程信息 二、配置工程 7、设置顶层文

    2024年02月03日
    浏览(38)
  • quartus工具篇——PLL IP核的使用

    PLL(Phase-Locked Loop,相位锁环)是FPGA中非常重要的时钟管理单元,其主要功能包括: 频率合成 - PLL可以生成比输入时钟频率高的时钟信号。 频率分频 - PLL也可以输出分频后的较低频率时钟。 减小时钟抖动 - PLL可以过滤输入时钟中的噪声和抖动。 锁相输出 - PLL可以使多个时钟保持一

    2024年02月07日
    浏览(34)
  • 在quartus ii中创建testbench,并使用Modelsim仿真

    1.创建testbench Processing→Start→Start Test BenchTemPlate Writer 得到如下提示,表示创建成功: 2.打开并编辑测试脚本 用“打开文件夹”打开工程所在的文件夹→simulation→modelsim→“文件类型”按图所示更改→选择.vt格式文件,打开 文件中,注释掉或删掉$display(“Running testbench”); 和

    2024年02月02日
    浏览(37)
  • 【FPGA】Quartus项目工程创建以及联合Modelsim进行仿真(FPGA项目创建与仿真)

    目录 软件下载 Quartus中设置Modelsim-Altera仿真器 创建新项目 编写项目代码 编写测试模块   这里使用的是Quartus Prime Light 18.1 以及ModelSim Intel FPGA 10.5b,两个软件在同一个地方下载,附网址https://www.intel.com/content/www/us/en/software-kit/665990/intel-quartus-prime-lite-edition-design-software-version-

    2024年03月15日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包