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

  1. (翻译)FIFO In Hardware

    翻译一些自己觉得有价值的材料,工作中碰到英语大多数是读,基本没有写或者翻的,翻得不好不到位的敬请指摘. 同时也附原文以供参考. http://electronics.stackexchange.com ...

  2. OS存储管理——FIFO,LRU,OPT命中率

    课程设计课题 存储管理程序设计 摘 要 虚拟存储器作为现代操作系统中存储管理的一项重要技术,实现了内存扩充功能.而分页请求分页系统正好可以完美的支持虚拟存储器功能,它具有请求调页功能和页面置换功能.在 ...

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

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

  4. 页置换算法FIFO、LRU、OPT

    页置换算法FIFO.LRU.OPT 为什么需要页置换 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断.当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调 ...

  5. LRU LFU FIFO 转载

    -------------------------------------->href--------------------------> http://blog.chinaunix.n ...

  6. Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

    在使用FIFO_DC的时候,我们知道这个FIFO的一个功能是可以输入输出的数据宽度不一样,比如: 输入数据为128bit,输出数据为16bit,FIFO内部可以实现这样的转换,但是输出的时候是先送出一 ...

  7. S3C2440UART之FIFO

    一.基础知识 S3C2440有3个独立的串口,每一个都可以利用DMA和中断方式操作.每个包含2个64字节FIFO,一个收,一个发.非FIFO模式相当于FIFO模式的一个寄存器缓冲模式.每一个UART有 ...

  8. 串口实现FIFO接受数据

    基本原理:静态队列 /* * 串口的FIFO简单读取实现 * 功能,实现串口的FIFO实现 * 使用方法: * 版本:v1.0.0 * */ #include "sys.h" #i ...

  9. cache4j轻量级java内存缓存框架,实现FIFO、LRU、TwoQueues缓存模型

    简介 cache4j是一款轻量级java内存缓存框架,实现FIFO.LRU.TwoQueues缓存模型,使用非常方便. cache4j为java开发者提供一种更加轻便的内存缓存方案,杀鸡焉用EhCac ...

  10. 操作系统页面置换算法(opt,lru,fifo,clock)实现

    选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...

随机推荐

  1. 使用generator生成排序动画

    相信作为一个程序猿,大家应该都已经看过一些排序算法的过程教学动画,现在我来总结一下自己使用ES6的generator实现动画的过程,以作为自己对generator的使用实践的一个记录. 为什么用gen ...

  2. Socket原理与编程基础

    一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...

  3. AIX 环境下遇到Device Busy问题

    IBM AIX v5.3操作系统环境下在对网络或网卡进行操作过程中经常遇到"Device Busy"而终止操作例如:#rmdev -l ent1遇到如下返回信息Method err ...

  4. UNDO内存结构剖析

    UNDO内存结构剖析 一.场景 Oracle的 C事物从早上9:00开始读取A表全部10w行数据,这个而读取需要经历5分钟.在9:01的时候,B事物将A表删除100条记录,那么,当9:05的时候,事物 ...

  5. django权限控制

    django 权限机制的实现: http://blog.igevin.info/posts/django-permission/

  6. Elasticsearch升级1.5版本暴露jdk的bug

    把测试环境的Elasticsearch升级到1.5.1版本,启动的时候报错: [root@node2 elasticsearch-1.5.1]# bin/service/elasticsearch s ...

  7. Eclipse搭建GWT开发环境

    1.下载Eclipse Kepler(4.3) 2.下载Maven       Apache Maven     Maven 3.下载JDK 4.设置系统变量Maven.JAVA_HOME.PATH. ...

  8. TextView实现歌词同步

    利用TextView实现歌词同步显示,这是一个简单的利用TextView实现滚动实时显示歌词的. 里面的内容都已经写上了详细的注释.里面播放音乐的时候歌词同步展示. 做媒体这块的朋友可以学习一下,练练 ...

  9. Servlet学习一

    Servlet担当着客户请求(Web浏览器或其它HTTP客户程序)与服务器响应(HTTP服务器上数据库或应用程序)的中间层.Servlet是位于Web服务器内部的服务器端Java应用程序,与传统的从命 ...

  10. LoadRunner --HTML/URL录制方式的选择规则