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 ...
随机推荐
- 网络编程——基于UDP的网络化CPU性能检测
网络化计算机性能检测软件的开发,可对指定目标主机的CPU利用率进行远程检测,并自动对远程主机执行性能指标进行周期性检测,最终实现图形化显示检测结果. 网络通信模块:(客户端类似,因为udp是对等通信) ...
- ascii码与unicode码的区别
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统.它主要用于显示现代英语和其他西 ...
- 【BZOJ1101】[POI2007] Zap(莫比乌斯反演)
点此看题面 大致题意: 求\(\sum_{x=1}^N\sum_{y=1}^M[gcd(x,y)==d]\). 一道类似的题目 推荐先去做一下这道题:[洛谷2257]YY的GCD,来初步了解一下莫比乌 ...
- Problem G: 角谷步数
Problem G: 角谷步数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 78 Solved: 28[Submit][Status][Web Bo ...
- CUDA中记录执行时间-GPU端
事件eventcudaEvent_t start,stop;cudaEventCreate(&start);cudaEventCreate(&stop);cudaEventRecord ...
- 关于小程序 scroll-view中设置scroll-top无效 和小说图书阅读进度条小案例
在最近的项目有做到关于小说阅读的进度条功能,其中用到scroll-view和slider组件,发现scroll-view中的scroll-top在设置值后无效,出现这种情况大概是以下几种问题: 1.s ...
- SpingBoot之配置文件的值注入问题
我们在这里研究的是以yml配置文件值注入的问题: Person: lastName: 张三 age: 23 boss: false birth: 2018-10-11 maps: {k1: v1,k2 ...
- 分享一个漂亮按钮插件FancyButtons
一转眼,2018年的第10天就这样过去了.回看17年,曾经做了些啥都忘记了,就像每一天写日志时的样子(双手放在键盘上,怒着嘴,抬着头,望着天花板), 然后突然记得好像好久没有写随笔了(@_@).自从配 ...
- 安全 - 堡垒机 - Jumpserver
GitHub - jumpserver/Dockerfile: Jumpserver all in one Dockerfile https://github.com/jumpserver/Docke ...
- LigerUI 快速开发UI框架 链接
LigerUI 快速开发UI框架 http://www.ligerui.com/ jQuery ligerUI 中文官方网站 http://www.ligerui.com/demo.html