Altera的单时钟同步FIFO,带almost_empty和almost_full端口
相关文章:
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. 总结
- 单时钟同步FIFO在读写时都有一个时钟周期延时,即wrreq置位后不能立马写入数据,一个T后,数据才会成功写进FIFO;当rdreq置位后不能立马读出数据,一个T后,数据才会成功从FIFO中读出,可以发现和RAM的机制类似。
- usedw和写入、读出数据是同步更新的,即每成功读出或写入一个数据,usedw也同步更新,usedw实时显示了FIFO的数据量。观察两个仿真图可以知道usedw在48-201之间变化,理论上是49-200之间变换,主要是程序设计wrreq和rdreq的延时变化造成的。
- almost_empty和almost_full是根据usedw的值来确定的。
- 在向FIFO写数据时,他的输出端q会保持最后一次输出的值。
Altera的单时钟同步FIFO,带almost_empty和almost_full端口相关推荐
- 同步(单时钟)、异步(双时钟)FIFO的Verilog HDL实现(含Testbench仿真代码)
目录 一.FIFO的定义和应用场景 二.FIFO的结构 三.FIFO的应用场景 3.1 单时钟(同步)FIFO 3.2 双时钟(异步)FIFO 四.FIFO的结构 五.FIFO常见参数 六.实现 FI ...
- 7 centos 时钟跟物理机同步_同步FIFO和异步FIFO
1.定义 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出 ...
- 基于 FPGA 的高级数字电路设计(7)单口 RAM、同步 FIFO、异步 FIFO 设计
一.单口 RAM 设计 module BRAM_PORTA( input clka, input ena, input wea, input [3:0] addra, input [15:0] din ...
- 跨时钟域方法(同步器、异步FIFO、边沿检测器、脉冲同步器、同步FIFO)
目录 1.跨时钟域方法的原因 2.跨时钟处理的两种思路 3.跨时钟域分类--单比特信号跨时钟 3.1.1慢时钟---快时钟.(满足三边沿准则,有效事件可以被安全采样) 3.1.2慢时钟---快时钟.( ...
- 数字IC设计系列----单端口RAM、双端口RAM、同步FIFO、异步FIFO
目录 一.单端口RAM原理及实现 1.1.原理 1.2.Verilog实现 1.3.优缺点分析 2.双端口RAM原理及实现 2.1.原理 2.2.Verilog实现 2.3.优缺点分析 ...
- 跨时钟域信号处理(二)——异步fifo的Verilog实现(附同步fifo的实现)
需要回答几个问题: 1.什么是异步FIFO,异步FIFO有什么功能? 跨时钟域的数据交换,防止亚稳态. 2.在产生写满与读空信号时需要进行跨时钟域如何做的,且如何能正确指示空满状态? 寄存器打两拍+格 ...
- 同步fifo与异步fifo
参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...
- 同步FIFO和异步FIFO的Verilog实现
FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据, 其 ...
- 同步FIFO和异步FIFO
1.定义 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出 ...
- IC常用知识6-信号跨时钟同步
文章目录 1. 单bit信号跨时钟域传输 1.1 电平同步器 1.2 边沿检测器 1.3 脉冲同步器 1.4 电平延展-快到慢 2. 多bit信号跨时钟域传输 2.1. 握手 2.2. 异步FIFO ...
最新文章
- NNVM AI框架编译器
- 11Builder(构建器)模式
- 一次非常有意思的sql优化经历
- Spring MVC过滤器-委派过滤器代理(DelegatingFilterProxy)
- python计算速度_python中如何提高计算速度?
- iOS核心动画详解swift版----基础动画
- 中国VR/AR技术的日渐成熟,带动行业领域巨大发展!
- Python环境与PyCharm编辑器的安装教程
- STM32Cube程序使用 DFU 烧写后Leave DFUMode无法运行程序
- Hadoop性能调优总结
- linux 压缩固定大小,Linux 将文件打包、压缩并分割成指定大小
- 电源输出电压纹波及电流纹波测试步骤
- python 怎么打印数组_?怎么将python中的数组全部打印出来array
- 投影变换--透视投影和正交投影
- Java实现校园商城后台管理系统
- Mac下转换APFS格式的移动硬盘分区为“Mac OS扩展(日志式)”或其它
- 黄子韬被封“剧组开心果”:《艳势番》是人生精彩回忆
- self.canv.bookmarkPage(key, left=inch*0.5) ,为什么在reportlab中设置的缩进不生效?
- 【RPC】慕课网RPC教程
- fabric sdk java_Hyperledger Fabric Java SDK最新教程
热门文章
- 淘宝开放平台技术历程
- 布隆过滤器学习笔记——《Learned Bloom Filters in Adversarial Environments:A Malicious URL Detection Use-Case》
- 安卓升级AndroidX手把手教程
- 红旗Linux系统安装教程
- 如何将word转换成pdf?超实用的使用教程免费分享
- noob_Noob的Three.js指南
- TP5加支付宝手机网站支付配置
- c语言:四位数为AABB些型,并且是另一个书的平方,求这昂的四位数
- office2019选框虚线_手把手教你分析PS2019里怎么画虚线
- Invalid bound statement (not found) 五种解决方法