Normal synchronous FIFO mode 和 Show-ahead synchronous FIFO mode
FIFO是先进先出,可以用fifo来处理跨时钟域的数据传输问题,用到的地方特别多,一定要搞会。
在学习调用fifo的IP核中发现有normal synchronous FIFO mode 和 Show-ahead synchronous FIFO mode这两种模式,就研究一下。
研究 IP 核最方便的方式就是用 modesim 仿真一下,这样关系就会很明了。
下面的两幅图是我用 Time_Gen 软件自己总结画的,并不是 modesim 的仿真图。
假定存入fifo的第一个数是01,第二个数是02,第三个数是03,以此类推。。。
clk是读时钟,rd是读使能,q是fifo的数据输出端
normal mode,只有在读使能信号有效的时候,才会在读时钟上升沿来的时候输出第一个数01。
Show-ahead 模式的输出要比 normal 模式的输出早一拍,意思是只要FIFO中有数据,他就会把第一个数据输出,
当第一个读使能信号来的时候,则会在读时钟上升沿的时候输出第二个数据02。

Normal mode Show-ahead mode
既然二者的区别是数据输出相差一拍,因此在设计 fifo 的时候就要根据不同的模式进行设计
下面举个例子,该代码实现了100Mhz 与 80Mhz 不同时钟域的数据传输问题
因为不同时钟域的频率不同,在进行数据传输的时候如果不进行处理必然会有数据丢失
FIFO 可以缓存数据,因此我们可以先把数据放在 fifo 里,再进行传输
当fifo中的数据 resudw>=某个数的时候,就不允许往 fifo 中写入数据,当 FIFO 空的时候也不允许再读数据。
module fifo(
rst_n ,
clk_in , //100Mhz ,fifo写时钟
data_in , //输入的数据
data_in_vld,//输入数据有效指示信号 clk_out , //80Mhz ,fifo读时钟
data_out , //输出的数据
data_out_vld,//输出数据有效指示信号
b_rdy //当为高,表示可以接收从fifo中读的数据,反之则不行 ); input rst_n ,clk_in,clk_out,b_rdy;
input [:] data_in ;
input data_in_vld ;
output[:] data_out ;
output[:] data_out_vld;
reg wr_ff0;
wire wr_ff1;
wire[:] q;
reg[:] data_out;
reg data_out_vld;
reg rd_ff0;
wire rdempty ;
wire wrfull ;
wire[:] wrusedw;
//调用IP核生成位宽为16 位,深度为64的FIFO, Show-ahead模式
my_fifo u1_fifo(
.data (data_in),
.rdclk(clk_out),
.rdreq(rd_ff0),
.wrclk(clk_in),
.wrreq(wr_ff1),
.q (q),
.rdempty(rdempty),
.wrfull (wrfull ),
.wrusedw(wrusedw)
);
//----------------------------------------------------------------------
//写满保护
always @(*)begin
if(wrusedw>=) begin
wr_ff0<=;
end
else
wr_ff0<=;
end
assign wr_ff1 = (data_in_vld && wr_ff0)?'b1:1'b0; //rd_ff0
always @(*)begin
if(b_rdy==&&rdempty== )begin
rd_ff0<=;
end
else
rd_ff0<=;
end
//-------------------------------------------------------------
//如果是Show-ahead 模式入,此时data_out与data_out_vld是对齐的
//如果是normal 模式,则需要将rd_ff0在多打一拍,然后将rd_ff1值给data_out_vld才能对齐
always @(posedge clk_out or negedge rst_n)begin
if(rst_n=='b0)begin
data_out<=;
end
else begin
data_out<=q;
end
end always @(posedge clk_out or negedge rst_n)begin
if(rst_n=='b0)begin
data_out_vld<=;
end
else begin
data_out_vld<=rd_ff0;
end
end
endmodule
文章出处:http://www.cnblogs.com/aslmer/p/5872412.html
Normal synchronous FIFO mode 和 Show-ahead synchronous FIFO mode的更多相关文章
- 同步fifo与异步fifo
参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...
- IP核之初——FIFO添加以太网MAC头部
本文设计思路源自明德扬至简设计法.在之前的几篇博文中,由于设计比较简单,所有的功能都是用verilogHDL代码编写实现的.我们要学会站在巨人的肩膀上,这时候就该IP核登场了! 说白了,IP核就是别人 ...
- FIFO IP核
转载: 说白了,IP核就是别人做好了的硬件模块,提供完整的用户接口和说明文档,更复杂的还有示例工程,你只要能用好这个IP核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...
- IP核——FIFO
一.Quartus 1.打开Quartus ii,点击Tools---MegaWizard Plug-In Manager 2.弹出创建页面,选择Creat a new custom megafunc ...
- 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)
在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...
- LATTICE 存储之FIFO的使用
坑,,以后填 对于Lattice 的 FIFO 存储器分为两种,见下图: 这两个的主要区别是一个后面加DC一个不加,那这个DC是什么意思呢??DC这里是Dual Clock的意思,也就是双时钟的意 ...
- FIFO
FIFO存储器 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序 ...
- Verilog学习笔记简单功能实现(八)...............异步FIFO
基本原理: 1.读写指针的工作原理 写指针:总是指向下一个将要被写入的单元,复位时,指向第1个单元(编号为0). 读指针:总是指向当前要被读出的数据,复位时,指向第1个单元(编号为0). ...
- FIFO学习心得
1,名字.FIFO=First in first out. 2,特点.顺序读入,顺序读出,先入先出. 3,用途.数据缓冲.使两个数据传输速率不一样的设备相匹配. 4,参数. ①,THE WIDTH和T ...
随机推荐
- sqlserver锁表、解锁、查看销表
锁定数据库的一个表 代码如下 复制代码 SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 代码如下 复制代码 SELECT * FROM tab ...
- Codeforces 802I Fake News (hard)
Codeforces 802I 题意:统计所有不同子串出现次数的平方的和. 想法:建一个SAM,$Ans=\sum (step[i]-step[fa[i]])*right[i]^2$ #include ...
- 从.net到java,从基础架构到解决方案。
这一年,职业生涯中的最大变化,是从.net到java的直接跨越,是从平台架构到解决方案的不断完善. 砥砺前行 初出茅庐,天下无敌.再学三年,寸步难行.很多时候不是别人太强,真的是自己太弱,却不自知. ...
- C语言中的异常处理机制
#define try if(!setjmp(Jump_Buffer)) 返回try现场后重新执行判断,所以有两次执行. http://blog.csdn.net/tian_dao_chou_qin/ ...
- 【CF799B】T-shirt buying(一道很水的小根堆)
点此看题面 大致题意: 有\(n\)件T恤衫,告诉你每件T恤衫的价格以及它正面和反面的颜色(\(1≤\)颜色的编号\(≤3\)),现在有m个顾客,已知每个人想要的衣服的颜色(一件T恤衫只要有一面的颜色 ...
- 动态规划专题(二)——树形DP
前言 \(DP\)这东西真的是博大精深啊...... 简介 树形\(DP\),顾名思义,就是在树上操作的\(DP\),一般可以用\(f_i\)表示以编号为\(i\)的节点为根的子树中的最优解. 转移的 ...
- 【转】 Solr的SolrCloud与Master-slave主从模式对比
第一印象 SolrCloud是Solr4.0引入的,主要应对与商业场景.它很像master-slave,却能自动化的完成以前需要手动完成的操作.利用ZooKeeper这个工具去监控整个Solr集群,以 ...
- 驾考试题的json代码
{ "statusCode": "000000", "desc": "请求成功", "result" ...
- 自定义配置Webpack和Babel配置
在使用ant-design-vue的包时样式是可以生效的但是如果我需要用到less文件时会报一个异常 当然这个异常其实很清晰的说明了什么问题看错误信息里面有issues地址,看来问题不止我们遇见了可以 ...
- LOL游戏基本代码
class Hero: def __init__(self, new_nickname, new_aggressivity, new_life_value, new_money, new_armor ...