FIFO
FIFO存储器 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。 在系统设计中,以增加数据传输率、处理大量数据流、匹配具有不同传输率的系统为目的而广泛使用FIFO存储器,从而提高了系统性能.
FIFO参数:
FIFO的宽度,the width,指FIFO一次读写操作的数据位;
FIFO深度,THE DEEPTH,指FIFO可以存储多少个N位的数据;
满标志,FIFO已满或将要满时送出的一个信号,以阻止FIFO的血操作继续向FIFO中写数据而造成溢出(overflow);
空标志,阻止FIFIO的读操作;
1.quartus中直接调用FIFO IP核
2.verilog
异步FIFO代码:
module fifo_module
(
input CLK,
input RSTn, input Write_Req,
input [:]FIFO_Write_Data, input Read_Req,
output [:]FIFO_Read_Data, output Full_Sig,
output Empty_Sig, /**********************/ output [:]SQ_rS1,
output [:]SQ_rS2,
output [:]SQ_rS3,
output [:]SQ_rS4,
output [:]SQ_Count /**********************/
); /************************************/ parameter DEEP = 'd4; /************************************/ reg [:]rShift [DEEP:];
reg [:]Count;
reg [:]Data; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin rShift[] <= 'd0; rShift[1] <= 8'd0; rShift[] <= 'd0;
rShift[] <= 'd0; rShift[4] <= 8'd0;
Count <= 'd0;
Data <= 'd0; end
else if( Read_Req && Write_Req && Count < DEEP && Count > )
begin
rShift[] <= FIFO_Write_Data;
rShift[] <= rShift[];
rShift[] <= rShift[];
rShift[] <= rShift[];
Data <= rShift[ Count ]; //若深度较大,则需多行代码,且存储器间存在频繁的数据转移
end
else if( Write_Req && Count < DEEP )
begin rShift[] <= FIFO_Write_Data;
rShift[] <= rShift[];
rShift[] <= rShift[];
rShift[] <= rShift[]; Count <= Count + 'b1;
end
else if( Read_Req && Count > )
begin
Data <= rShift[Count];
Count <= Count - 'b1;
end /************************************/ assign FIFO_Read_Data = Data;
assign Full_Sig = ( Count == DEEP ) ? 'b1 : 1'b0;
assign Empty_Sig = ( Count == ) ? 'b1 : 1'b0; /************************************/ assign SQ_rS1 = rShift[];
assign SQ_rS2 = rShift[];
assign SQ_rS3 = rShift[];
assign SQ_rS4 = rShift[];
assign SQ_Count = Count; /************************************/ endmodule
第一,FIFO 的调用绝对需要控制信号
第二,Full_Sig 和 Empty_Sig 是不适合同步 FIFO 的写操作
改进同步FIFO,放弃了 Empty_Sig 和 Full_Sig,取而代之的是 Left_Sig 。作用如
名字般,该信号用来反馈出 FIFO 目前的“空格数目”
module fifo_module_2
(
input CLK,
input RSTn, input Write_Req,
input [:]FIFO_Write_Data, input Read_Req,
output [:]FIFO_Read_Data, output [:]Left_Sig
); /************************************/ parameter DEEP = 'd4; /************************************/ reg [:]rShift [DEEP:];
reg [:]Count;
reg [:]Data; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin rShift[] <= 'd0; rShift[1] <= 8'd0; rShift[] <= 'd0;
rShift[] <= 'd0; rShift[4] <= 8'd0;
Count <= 'd0;
Data <= 'd0; end
else if( Read_Req && Write_Req && Count < DEEP && Count > )
begin
rShift[] <= FIFO_Write_Data;
rShift[] <= rShift[];
rShift[] <= rShift[];
rShift[] <= rShift[];
Data <= rShift[ Count ];
end
else if( Write_Req && Count < DEEP )
begin rShift[] <= FIFO_Write_Data;
rShift[] <= rShift[];
rShift[] <= rShift[];
rShift[] <= rShift[]; Count <= Count + 'b1;
end
else if( Read_Req && Count > )
begin
Data <= rShift[Count];
Count <= Count - 'b1;
end /************************************/ assign FIFO_Read_Data = Data;
assign Left_Sig = DEEP - Count; /************************************/ endmodule
仿真激励文本
`timescale ps/ ps
module fifo_module_2_simulation(); reg CLK;
reg RSTn; reg Write_Req;
reg [:]FIFO_Write_Data; reg Read_Req; wire [:]FIFO_Read_Data; wire [:]Left_Sig; /*******************/ fifo_module_2 U1
(
.CLK(CLK),
.RSTn( RSTn ),
.Write_Req(Write_Req),
.FIFO_Write_Data(FIFO_Write_Data),
.Read_Req(Read_Req),
.FIFO_Read_Data(FIFO_Read_Data),
.Left_Sig(Left_Sig)
); /*******************/ initial
begin
RSTn = ; #; RSTn = ;
CLK = ; forever # CLK = ~CLK;
end /*******************/ reg [:]i; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin i <= 'd0;
Write_Req <= 'b0;
Read_Req <= 'b0;
FIFO_Write_Data <= 'd0; end
else
case( i ) /**********/ :
begin Write_Req <= 'b1; Read_Req <= 1'b0; FIFO_Write_Data <= 'd1; i <= i + 1'b1; end :
begin Write_Req <= 'b1; Read_Req <= 1'b0; FIFO_Write_Data <= 'd2; i <= i + 1'b1; end :
begin Write_Req <= 'b1; Read_Req <= 1'b0; FIFO_Write_Data <= 'd3; i <= i + 1'b1; end :
begin Write_Req <= 'b1; Read_Req <= 1'b0; FIFO_Write_Data <= 'd4; i <= i + 1'b1; end /**********/ :
begin Write_Req <= 'b0; Read_Req <= 1'b1; i <= i + 'b1; end :
begin Write_Req <= 'b0; Read_Req <= 1'b1; i <= i + 'b1; end :
begin Write_Req <= 'b0; Read_Req <= 1'b1; i <= i + 'b1; end :
begin Write_Req <= 'b0; Read_Req <= 1'b1; i <= i + 'b1; end /**********/ : // 0 + 1 < 1
if( Left_Sig <= ) begin Write_Req <= 'b0; i <= i + 1'b1; end
else begin Write_Req <= 'b1; Read_Req <= 1'b0; FIFO_Write_Data <= FIFO_Write_Data + 'b1; end : // > DEEP - 1
if( Left_Sig >= )begin Read_Req <= 'b0; i <= i + 1'b1; end
else begin Write_Req <= 'b0; Read_Req <= 1'b1; end /**********/ :
if( Left_Sig >= ) begin Write_Req <= 'b1; FIFO_Write_Data <= 8'd5; i <= i + 'b1; end
else begin Write_Req <= 'b0; i <= i + 1'b1; end :
if( Left_Sig >= ) begin Write_Req <= 'b1; FIFO_Write_Data <= 8'd6; i <= i + 'b1; end
else begin Write_Req <= 'b0; i <= i + 1'b1; end :
begin if( Left_Sig >= ) begin Write_Req <= 'b1; FIFO_Write_Data <= 8'd7; end
else Write_Req <= 'b0; if( Left_Sig <= ) begin Read_Req <= 'b1; end
else Read_Req <= 'b0; i <= i + 'b1; end :
begin if( Left_Sig >= ) begin Write_Req <= 'b1; FIFO_Write_Data <= 8'd8; end
else Write_Req <= 'b0; if( Left_Sig <= ) begin Read_Req <= 'b1; end
else Read_Req <= 'b0; i <= i + 'b1; end :
if( Left_Sig <= ) begin Write_Req <= 'b0; Read_Req <= 1'b1; i <= i + 'b1; end
else begin Read_Req <= 'b0; i <= i + 1'b1; end :
if( Left_Sig <= ) begin Read_Req <= 'b1; i <= i + 1'b1; end
else begin Read_Req <= 'b0; i <= i + 1'b1; end :
begin Read_Req <= 'b0; i <= 5'd16; end endcase endmodule
FIFO的更多相关文章
- (翻译)FIFO In Hardware
翻译一些自己觉得有价值的材料,工作中碰到英语大多数是读,基本没有写或者翻的,翻得不好不到位的敬请指摘. 同时也附原文以供参考. http://electronics.stackexchange.com ...
- OS存储管理——FIFO,LRU,OPT命中率
课程设计课题 存储管理程序设计 摘 要 虚拟存储器作为现代操作系统中存储管理的一项重要技术,实现了内存扩充功能.而分页请求分页系统正好可以完美的支持虚拟存储器功能,它具有请求调页功能和页面置换功能.在 ...
- 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)
在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...
- 页置换算法FIFO、LRU、OPT
页置换算法FIFO.LRU.OPT 为什么需要页置换 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断.当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调 ...
- LRU LFU FIFO 转载
-------------------------------------->href--------------------------> http://blog.chinaunix.n ...
- Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项
在使用FIFO_DC的时候,我们知道这个FIFO的一个功能是可以输入输出的数据宽度不一样,比如: 输入数据为128bit,输出数据为16bit,FIFO内部可以实现这样的转换,但是输出的时候是先送出一 ...
- S3C2440UART之FIFO
一.基础知识 S3C2440有3个独立的串口,每一个都可以利用DMA和中断方式操作.每个包含2个64字节FIFO,一个收,一个发.非FIFO模式相当于FIFO模式的一个寄存器缓冲模式.每一个UART有 ...
- 串口实现FIFO接受数据
基本原理:静态队列 /* * 串口的FIFO简单读取实现 * 功能,实现串口的FIFO实现 * 使用方法: * 版本:v1.0.0 * */ #include "sys.h" #i ...
- cache4j轻量级java内存缓存框架,实现FIFO、LRU、TwoQueues缓存模型
简介 cache4j是一款轻量级java内存缓存框架,实现FIFO.LRU.TwoQueues缓存模型,使用非常方便. cache4j为java开发者提供一种更加轻便的内存缓存方案,杀鸡焉用EhCac ...
- 操作系统页面置换算法(opt,lru,fifo,clock)实现
选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...
随机推荐
- java守护线程的理解
package daemonThread; /*setDaemon(true)方法将线程设置为守护线程,线程的Daemon默认值为false * 只要当前JVM实例中存在任何一个非守护线程没有结束,守 ...
- EUI List列表实现人物列表
一 Scroll+List ,拖动组件到exml. List不能写定高度,不然无法自动扩展. 二 新建List条目皮肤, ListItemSkin皮肤 名字Label的文本{data.name} ...
- 解除破解正版Kindle电子书籍的版权限制
解除破解正版Kindle电子书籍的版权限制(DRM). 方法并不复杂: 安装好Calibre电子书籍阅读管理软件: 在Calibre软件中安装好破解DRM插件:DRM: 把购买到的Kindle电子书籍 ...
- Python: 字典的基本操作
字典是Python里唯一的映射类型.字典是可变的.无序的.大小可变的键值映射,有时候也称为散列表或关联数组. 例子在下面: dic = {"apple":2, "oran ...
- Scala中的None,Nothing,Null,Nil
在scala中这四个类型名称很类似,作用确实完全不同的. None是一个object,是Option的子类型,定义如下 case object None extends Option[Nothing] ...
- python的路径
原来可以这么用和那么用 os.mkdir('d:\\su\\help1') os.mkdir('d:/su/help') 为啥提供俩种呢 真乱
- DataSnap控件TDSServerClass属性LifeCycle生命周期管理(From李维)
DelphiXE2中的DataSnap中提供了三种不同的生命周期,开发人员可以在TDSServerClass控件的LifeCycle特性中设定,下面分别说明每一种生命周期的意义 1. Server:在 ...
- python爬虫——黑板客老师课程学习
程序: 目标url 内容提取 表现形式 为什么: 大数据——数据膨胀,信息太多了,不知道哪些信息适合你,例如谷歌搜索引擎. 垂直行业搜索——某一个行业的搜索,与搜索引擎最大的区别:搜索引擎是告诉你哪些 ...
- Breakpoint is not hit
新拿到一个Silverlight项目,能够正常运行,但是一旦运行起来,断点处由实心点变成了空心的,并警告:The breakpoint will not currently be hit. No sy ...
- CSS预处理器Sass、LESS 和 Stylus
CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 首先我们 ...