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)实现
选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...
随机推荐
- php工作笔记8-并发和数据类型
1.mysql在进行数据的修改时,并发情况下: $RoundsRows=$modelRounds->where("id=$roundsID and (sendMoney + $amou ...
- springMVC:通配符的匹配很全面, 但无法找到元素 'mvc:annotation-driven' 的声明
转自:http://blog.csdn.net/tolcf/article/details/50845483 报错信息:通配符的匹配很全面, 但无法找到元素 'mvc:annotation-drive ...
- jquery实现静态html文件的include嵌入效果
//引入jQuery的js 建立footer.html,内容为要嵌入的内容. 在需要嵌入的页面中加入: $.get("footer.html",function(data){ $( ...
- Android开发--仿微信语音对讲录音
原文地址:http://www.2cto.com/kf/201502/378704.html 自微信出现以来取得了很好的成绩,语音对讲的实现更加方便了人与人之间的交流.今天来实践一下微信的语音对讲的录 ...
- VB.net 调用dll
Public Declare Function APlayer_OpenA Lib "APlayerCaller.dll" (ByVal aplayer As Integer, B ...
- object to 字符串json
package com.beijxing.TestMain; import com.beijxing.entity.Student; import com.google.gson.Gson; impo ...
- R作图
R一般的散点图:plot() 折线图:plot() lines() 柱状图 barplot() 箱子图 boxplot() 直方图:hist() 热力图:heatmap 画地图的:拓展包 m ...
- java.sql.SQLException: ORA-00911: invalid character 解决方法
java.sql.SQLException: ORA-00911: invalid character 控制台抛出这个异常:java.sql.SQLException: ORA-00911: inva ...
- Serializable接口和transient关键字
1. 什么是Serializable接口? 当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法),表示该类可以被序列化. 序列化的目的是将一个实现了Serializable ...
- hdu 1872(看病要排队)(优先队列)
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...