相关文章
1.Altera的单时钟同步FIFO,带almost_empty和almost_full端口https://blog.csdn.net/qq_39485231/article/details/105345164
2.Altera的单时钟同步FIFO,带empty和full端口https://blog.csdn.net/qq_39485231/article/details/105351146
3.Altera的异步FIFO,读写用同频不同相时钟https://blog.csdn.net/qq_39485231/article/details/105352597
4.Altera的异步FIFO学习心得https://blog.csdn.net/qq_39485231/article/details/105364241

Altera的单时钟同步FIFO,带almost_empty和almost_full端口

  • 程序
  • 单时钟同步FIFO,带almost_empty和almost_full端口
  • 1. almost_empty置位时
  • 2. almost_full置位时
  • 3. 总结

程序

module ip_fifo_a  //顶层模块(input   sys_clk,input   sys_rst_n);wire            wrreq;
wire    [7:0]   data;
wire            empty;
wire            full;
wire     [7:0]  usedw;
wire            almost_empty;
wire            almost_full;wire            rdreq;
wire    [7:0]   q;//例化FIFO模块
fifo u_fifo(.clock          (sys_clk),.data           (data),.rdreq          (rdreq),.wrreq          (wrreq),.almost_empty   (almost_empty),.almost_full    (almost_full),.empty          (empty),.full           (full),.q              (q),.usedw          (usedw));//例化写FIFO模块
fifo_wr u_fifo_wr(.clk     (sys_clk ),          // 写时钟.rst_n   (sys_rst_n),         // 复位信号.wrreq   (wrreq   ),          // 写请求.data    (data    ),          // 写入FIFO的数据.empty   (almost_empty ),          // 写空信号.full    (almost_full  )           // 写满信号
);//例化读FIFO模块
fifo_rd u_fifo_rd(.clk     (sys_clk ),          // 读时钟.rst_n   (sys_rst_n),         // 复位信号.rdreq   (rdreq   ),          // 读请求.data    (q       ),          // 从FIFO输出的数据.empty   (almost_empty ),          // 读空信号.full    (almost_full  )           // 读满信号);endmodule
module fifo_rd   //读模块(input           clk,input           rst_n,input   [7:0]   data,input           full,input           empty,output  reg     rdreq);reg [7:0]   data_fifo;
reg [1:0]   flow_cnt;always @ (posedge clk or negedge rst_n)beginif(!rst_n)beginrdreq <= 1'b0;data_fifo <= 8'b0;flow_cnt <= 2'd0;endelsebegincase(flow_cnt)2'd0:beginif(full)beginrdreq <= 1'b1;flow_cnt <= flow_cnt + 1'b1;endelseflow_cnt <= flow_cnt;end2'd1:beginif(empty)beginrdreq <= 1'b0;flow_cnt <= 2'b0;data_fifo <= 8'd0;endelsebegindata_fifo <= data;rdreq <= 1'b1;endenddefault: flow_cnt <= 2'd0;endcaseendend
endmodule
module fifo_wr     //写模块(input           clk,input           rst_n,input           full,input           empty,output  reg [7:0] data,output  reg     wrreq);reg [1:0]   flow_cnt;always @ (posedge clk or negedge rst_n)beginif(!rst_n)beginwrreq <= 1'b0;data <= 8'd0;flow_cnt <= 2'd0;endelsebegincase(flow_cnt)2'd0:beginif(empty)beginwrreq <= 1'b1;flow_cnt <= flow_cnt + 1'b1;endelseflow_cnt <= flow_cnt;end2'd1:beginif(full)beginwrreq <= 1'b0;flow_cnt <= 2'd0;data <= 8'd0;endelsebegindata <= data + 1'b1;wrreq <= 1'b1;endenddefault: flow_cnt <= 2'd0;endcaseendend
endmodule
`timescale  1ns/1ns                // tb程序module  tb;               // 测试模块//parameter  define
parameter  T = 20;                 // 时钟周期为20ns//reg define
reg  sys_clk;                      // 时钟信号
reg  sys_rst_n;                    // 复位信号//*****************************************************
//**                    main code
//*****************************************************//给输入信号初始值
initial beginsys_clk            = 1'b0;sys_rst_n          = 1'b0;     // 复位#(T+1)  sys_rst_n  = 1'b1;     // 在第21ns的时候复位信号信号拉高
end//50Mhz的时钟,周期则为1/50Mhz=20ns,所以每10ns,电平取反一次
always #(T/2) sys_clk = ~sys_clk;//例化led模块
ip_fifo_a  u0 (.sys_clk     (sys_clk  ),.sys_rst_n   (sys_rst_n)
);endmodule

单时钟同步FIFO,带almost_empty和almost_full端口

首先让Quartus根据我们的需要生成FIFO


现在来看一下almost_empty和almost_full的含义,almost_empty是usedw小于我们设定的50才会把almost_empty置位;almost_full是usedw大于等于我们设定的200才会把almost_full置位。区别是其中一个能取到等与。usedw指的是FIFO含有的数据量的多少。

1. almost_empty置位时

这里我们来看用ModelSim仿真的结果:

可以从图中发现当usedw小于50后,立马把almost_empty置位,与上面对almost_empty置位条件吻合。置位一个时钟周期后,wrreq被拉高,rdreq被拉低,这也与程序的定义吻合


所以可以看到在almost_empty拉高后,usedw仍然减小了,就是因为rdreq的延时变化造成的;在wrreq拉高后一个时钟周期usedw才增加1,所以数据写入FIFO其实会延后一个时钟周期

2. almost_full置位时


可以从图中发现当usedw等于200后,立马把almost_full置位,与上面对almost_full置位条件吻合。置位一个时钟周期后,wrreq被拉低,rdreq被拉高,这也与程序的定义吻合。


所以可以看到在almost_full拉高后,usedw仍然增加了,就是因为wrreq的延时变化造成的;在rdreq拉高后一个时钟周期usedw才减少1,所以数据读出FIFO其实会延后一个时钟周期

3. 总结

  1. 单时钟同步FIFO在读写时都有一个时钟周期延时,即wrreq置位后不能立马写入数据,一个T后,数据才会成功写进FIFO;当rdreq置位后不能立马读出数据,一个T后,数据才会成功从FIFO中读出,可以发现和RAM的机制类似
  2. usedw和写入、读出数据是同步更新的,即每成功读出或写入一个数据,usedw也同步更新,usedw实时显示了FIFO的数据量。观察两个仿真图可以知道usedw在48-201之间变化,理论上是49-200之间变换,主要是程序设计wrreq和rdreq的延时变化造成的。
  3. almost_empty和almost_full是根据usedw的值来确定的。
  4. 在向FIFO写数据时,他的输出端q会保持最后一次输出的值。

Altera的单时钟同步FIFO,带almost_empty和almost_full端口相关推荐

  1. 同步(单时钟)、异步(双时钟)FIFO的Verilog HDL实现(含Testbench仿真代码)

    目录 一.FIFO的定义和应用场景 二.FIFO的结构 三.FIFO的应用场景 3.1 单时钟(同步)FIFO 3.2 双时钟(异步)FIFO 四.FIFO的结构 五.FIFO常见参数 六.实现 FI ...

  2. 7 centos 时钟跟物理机同步_同步FIFO和异步FIFO

    1.定义 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出 ...

  3. 基于 FPGA 的高级数字电路设计(7)单口 RAM、同步 FIFO、异步 FIFO 设计

    一.单口 RAM 设计 module BRAM_PORTA( input clka, input ena, input wea, input [3:0] addra, input [15:0] din ...

  4. 跨时钟域方法(同步器、异步FIFO、边沿检测器、脉冲同步器、同步FIFO)

    目录 1.跨时钟域方法的原因 2.跨时钟处理的两种思路 3.跨时钟域分类--单比特信号跨时钟 3.1.1慢时钟---快时钟.(满足三边沿准则,有效事件可以被安全采样) 3.1.2慢时钟---快时钟.( ...

  5. 数字IC设计系列----单端口RAM、双端口RAM、同步FIFO、异步FIFO

    目录​​​​​​​ 一.单端口RAM原理及实现 1.1.原理 1.2.Verilog实现 1.3.优缺点分析 2.双端口RAM原理及实现 2.1.原理 2.2.Verilog实现 2.3.优缺点分析 ...

  6. 跨时钟域信号处理(二)——异步fifo的Verilog实现(附同步fifo的实现)

    需要回答几个问题: 1.什么是异步FIFO,异步FIFO有什么功能? 跨时钟域的数据交换,防止亚稳态. 2.在产生写满与读空信号时需要进行跨时钟域如何做的,且如何能正确指示空满状态? 寄存器打两拍+格 ...

  7. 同步fifo与异步fifo

    参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...

  8. 同步FIFO和异步FIFO的Verilog实现

    FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据, 其 ...

  9. 同步FIFO和异步FIFO

    1.定义 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出 ...

  10. IC常用知识6-信号跨时钟同步

    文章目录 1. 单bit信号跨时钟域传输 1.1 电平同步器 1.2 边沿检测器 1.3 脉冲同步器 1.4 电平延展-快到慢 2. 多bit信号跨时钟域传输 2.1. 握手 2.2. 异步FIFO ...

最新文章

  1. NNVM AI框架编译器
  2. 11Builder(构建器)模式
  3. 一次非常有意思的sql优化经历
  4. Spring MVC过滤器-委派过滤器代理(DelegatingFilterProxy)
  5. python计算速度_python中如何提高计算速度?
  6. iOS核心动画详解swift版----基础动画
  7. 中国VR/AR技术的日渐成熟,带动行业领域巨大发展!
  8. Python环境与PyCharm编辑器的安装教程
  9. STM32Cube程序使用 DFU 烧写后Leave DFUMode无法运行程序
  10. Hadoop性能调优总结
  11. linux 压缩固定大小,Linux 将文件打包、压缩并分割成指定大小
  12. 电源输出电压纹波及电流纹波测试步骤
  13. python 怎么打印数组_?怎么将python中的数组全部打印出来array
  14. 投影变换--透视投影和正交投影
  15. Java实现校园商城后台管理系统
  16. Mac下转换APFS格式的移动硬盘分区为“Mac OS扩展(日志式)”或其它
  17. 黄子韬被封“剧组开心果”:《艳势番》是人生精彩回忆
  18. self.canv.bookmarkPage(key, left=inch*0.5) ,为什么在reportlab中设置的缩进不生效?
  19. 【RPC】慕课网RPC教程
  20. fabric sdk java_Hyperledger Fabric Java SDK最新教程

热门文章

  1. 淘宝开放平台技术历程
  2. 布隆过滤器学习笔记——《Learned Bloom Filters in Adversarial Environments:A Malicious URL Detection Use-Case》
  3. 安卓升级AndroidX手把手教程
  4. 红旗Linux系统安装教程
  5. 如何将word转换成pdf?超实用的使用教程免费分享
  6. noob_Noob的Three.js指南
  7. TP5加支付宝手机网站支付配置
  8. c语言:四位数为AABB些型,并且是另一个书的平方,求这昂的四位数
  9. office2019选框虚线_手把手教你分析PS2019里怎么画虚线
  10. Invalid bound statement (not found) 五种解决方法