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的更多相关文章

  1. 同步fifo与异步fifo

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

  2. IP核之初——FIFO添加以太网MAC头部

    本文设计思路源自明德扬至简设计法.在之前的几篇博文中,由于设计比较简单,所有的功能都是用verilogHDL代码编写实现的.我们要学会站在巨人的肩膀上,这时候就该IP核登场了! 说白了,IP核就是别人 ...

  3. FIFO IP核

    转载: 说白了,IP核就是别人做好了的硬件模块,提供完整的用户接口和说明文档,更复杂的还有示例工程,你只要能用好这个IP核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...

  4. IP核——FIFO

    一.Quartus 1.打开Quartus ii,点击Tools---MegaWizard Plug-In Manager 2.弹出创建页面,选择Creat a new custom megafunc ...

  5. 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)

    在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...

  6. LATTICE 存储之FIFO的使用

    坑,,以后填 对于Lattice 的  FIFO 存储器分为两种,见下图: 这两个的主要区别是一个后面加DC一个不加,那这个DC是什么意思呢??DC这里是Dual  Clock的意思,也就是双时钟的意 ...

  7. FIFO

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

  8. Verilog学习笔记简单功能实现(八)...............异步FIFO

    基本原理:       1.读写指针的工作原理 写指针:总是指向下一个将要被写入的单元,复位时,指向第1个单元(编号为0). 读指针:总是指向当前要被读出的数据,复位时,指向第1个单元(编号为0). ...

  9. FIFO学习心得

    1,名字.FIFO=First in first out. 2,特点.顺序读入,顺序读出,先入先出. 3,用途.数据缓冲.使两个数据传输速率不一样的设备相匹配. 4,参数. ①,THE WIDTH和T ...

随机推荐

  1. 手机端@media screen布局自适应

    @media only screen and (min-width: 310px) and (max-width: 360px) { }@media only screen and (min-widt ...

  2. java常用框架总结

    一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...

  3. Api容器在应用架构演化中的用途

    单层架构 在最开始编程的时候相信大家都写过下面这种架构,界面代码,业务代码,数据库连接全部在工程面完成.当然这种架构在处理很小的程序的时候依然有生命力 两层架构 后来我们发现数据访问的代码大量重复,应 ...

  4. Android(java)学习笔记76:Handler用法总结 和 秒表案例

    一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中 ...

  5. 2017.12.25 Java中面向对象思想的深刻理解

    今日内容介绍 1.面向对象思想 2.类与对象的关系 3.局部变量和成员变量的关系 4.封装思想 5.private,this关键字 6.随机点名器 01面向对象和面向过程的思想 * A: 面向过程与面 ...

  6. 完结篇OO总结

    目录 前言 一.第四单元两次架构设计 二.架构设计及OO方法理解的演进 三.测试理解与实践的演进 四.课程收获 五.改进建议 前言 持续了17周的OO终于走向了尾声,想想寒假的时候连类都不知道是什么, ...

  7. CUDA开发:了解设备属性

    原文链接 今天介绍一下CUDA设备的相关属性,只有熟悉了硬件是相关属性,是怎么工作的,就能写出更适合硬件工作的代码.cudaDeviceProp这个结构体记录了设备的相关属性. struct cuda ...

  8. java基础面试题:说说&和&&的区别

    &与&&都是逻辑与 不同的是&左右两边的判断都要进行,而&&是短路与,当&&左边条件为假则不用再判断右边条件,所以效率更高 例如,对于i ...

  9. C# 界面跳转-登陆之后跳转至主窗口

    在登陆按钮验证成功之后可以将会话结果改为OK //验证通过之后将对话结果设置为OK(之后会载入主界面) this.DialogResult = DialogResult.OK; this.Dispos ...

  10. java实现单链表归并算法

    public class LinkMergeSort {static int number=0;public static void main(String[] args) {int[] a = {1 ...