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. Android(java)学习笔记102:Dalivk虚拟机的初始化过程

    1. 初始化下面系统函数(调用dvmStartup函数初始化所有相关的函数) 开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作:    dvmAllo ...

  2. 【BZOJ3925】[ZJOI2015] 地震后的幻想乡(状压期望DP)

    点此看题面 大致题意: 有\(n\)个点和\(m\)条边,每条边的权值是一个\(0\sim1\)的随机实数,要你用\(n-1\)条边将图联通,问这\(n-1\)条边中边权最大值的期望最小值. 提示 这 ...

  3. 简析平衡树(一)——替罪羊树 Scapegoat Tree

    前言 平衡树在我的心目中,一直都是一个很高深莫测的数据结构.不过,由于最近做的题目的题解中经常出现"平衡树"这三个字,我决定从最简单的替罪羊树开始,好好学习平衡树. 简介 替罪羊树 ...

  4. HTML 5新元素和CSS

    Html5 新元素 多媒体元素 video/audio: 格式例子: 属性: canvas元素 Canvas标签定义图形,用于图形的绘制,使用    js来绘图 拖放drag和drop 拖放是一种常见 ...

  5. mantis基本配置及邮件服务器配置

    邮件服务器配置 在c:\php-5.0.3\php.ini文件中查找smtp,将localhost改为你的发件服务器,如SMTP = smtp.163.com   在php.ini文件中查找sendm ...

  6. cf492E. Vanya and Field(扩展欧几里得)

    题意 $n \times n$的网格,有$m$个苹果树,选择一个点出发,每次增加一个偏移量$(dx, dy)$,最大化经过的苹果树的数量 Sol 上面那个互素一开始没看见,然后就GG了 很显然,若$n ...

  7. react与微信小程序

    由组员完成 原文链接 都说react和微信小程序很像,但是像在什么部分呢,待我稍作对比. 生命周期 1.React React的生命周期在16版本以前与之后发生了重大变化,原因在于引入的React F ...

  8. Scrapy分布式爬虫打造搜索引擎- (二)伯乐在线爬取所有文章

    二.伯乐在线爬取所有文章 1. 初始化文件目录 基础环境 python 3.6.5 JetBrains PyCharm 2018.1 mysql+navicat 为了便于日后的部署:我们开发使用了虚拟 ...

  9. tcl之list操作-llength/lindex/lrange/linsert/lreplace

  10. DC84问

    1.1 什么是DC?DC(Design Compiler)是Synopsys公司的logical synthesis工具,它根据design description和design constraint ...