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. POI 设置

    FileOutputStream fos = new FileOutputStream("D:\\15.xls"); HSSFWorkbook wb = new HSSFWorkb ...

  2. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

  3. mysql数据引擎的概念介绍

    什么是数据库引擎?每种数据库的数据格式,内部实现机制都是不同的,要利用一种开发工具访问一种数据库,就必须通过一种中介程序,这种开发工具与数据库之间的中介程序就叫数据库引擎. 如果你是个赛车手并且按一下 ...

  4. python读取excel数据,并可视化展现

    #-*- coding: utf-8 -*- import pandas as pda import matplotlib.pyplot as pyl import matplotlib.font_m ...

  5. 实验楼课程管理程序-深入学习《C++ Primer第五版》实验报告&学习笔记1

    本片博客为实验楼的训练营课程深入学习<C++ Primer第五版>的实验报告和学习笔记. 原课程地址为:https://www.shiyanlou.com/courses/405# 原文出 ...

  6. Nginx系列一:信号与配置

    一.Nginx与信号 Nginx支持平滑重启,相比于Apache,修改了配置文件后可以不需要先停止程序,再重新启动. 1.启动 nginx –c nginx.conf 其中,-c nginx.conf ...

  7. ipython的安装

    ipython:是python的一个交互式shell环境,可以安装到windows和linux上面.作用:用来执行python代码和调试用.windows上面安装:分为2.x版本和3.x版本,分为py ...

  8. javaScript 正则表达式匹配日期

    // yyyyMMddhhmmss var pattern = /^(?:(?!0000)[0-9]{4}(?:(?:0[1-9]|1[0-2])(?:0[1-9]|1[0-9]|2[0-8])|(? ...

  9. centos7安装mariadb10遇到的问题解决

    4. 安装中的错误 4.1 /bin/ld: cannot find -lz /bin/ld: cannot find -lzcollect2: error: ld returned 1 exit s ...

  10. 转载:Solr的自动完成实现方式(第三部分:Suggester方式续)

    转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269126.html 在之前的两个部分(part1.part2)中,我们学会了如何配置和 ...