同步FIFO
时间:2022-07-24
本文章向大家介绍同步FIFO,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
同步 FIFO 简介
FIFO 即先进先出队列,FIFO 一般作为不同时钟域的缓冲器。
FIFO 根据读和写的时钟是否为同一时钟分为同步 FIFO 和异步 FIFO 。异步 FIFO 相比同步 FIFO 来说,设计更加复杂一点。
设计 FIFO 的时候一般需要考虑的有两点:
FIFO 的大小
FIFO 的大小就是指双端口 ram 的大小,这个可以根据需要来设置。
FIFO空满状态的判断
FIFO 空满状态的判断通常有两种方法
- FIFO 中的 ram 一般是双端口 ram ,所以有独立的读写地址。因此可以一种设置读,写指针,写指针指向下一个要写入数据的地址,读指针指向下一个要读的地址,最后通过比较读指针和写指针的大小来确定空满状态。
- 设置一个计数器,当写使能有效的时候计数器加一;当读使能有效的时候,计数器减一,将计数器与 ram 的 size 进行比较来判断 FIFO 的空满状态。这种方法设计比较简单,但是需要额外的计数器,就会产生额外的资源,而且当 FIFO 较大时,会降低 FIFO 最终可以达到的速度。
程序实现
module fifo
(
clk, rst, wr_en, rd_en, data_in, data_out, empty, full
);
input clk, rst;
input wr_en, rd_en;
input [7:0] data_in;
output [7:0] data_out;
output empty,full;
wire empty, full;
reg [7:0] data_out;
reg [7:0] ram[15:0]; //双端口ram
reg [3:0] wr_ptr, rd_ptr; //写和读指针
reg [3:0] counter; //用来判断空满
always @(posedge clk)
begin
if (!rst)
begin
counter=0;
data_out=0;
wr_ptr=0;
rd_ptr=0;
end
else
begin
case({wr_en, rd_en})
2’b00: counter=counter;
2’b01:
begin
data_out=ram[rd_ptr]; //先进先出,因此读的话依旧按照次序来
counter=counter-1;
rd_ptr=(rd_ptr==15) ?0: rd_ptr+1;
end
2’b10:
begin
ram[wr_ptr]=data_in; //写操作
counter=counter+1;
wr_ptr=(wr_ptr==15) ?0: wr_ptr+1;
end
2’b11
begin
ram[wr_ptr]=data_in; //读写同时进行,此时counter不增加
data_out=ram[rd_ptr];
wr_ptr=(wr_ptr==15) ?0:wr_ptr+1;
rd_ptr=(rd_ptr==15) ?0: rd_ptr+1;
end
endcase
end
end
assign empty=(counter==0)?1:0;
assign full=(counter==15) ?1:0;
endmodule
本文来源于:https://blog.csdn.net/IamSarah/article/details/76022015?ops_request_misc=&request_id=&biz_id=&utm_source=distribute.pc_search_result.none-task
- 百度某SDK设计缺陷导致手机敏感信息泄露(IMEI号和地理位置信息等)
- HDU 1004 Let the Balloon Rise【STL<map>】
- UVA 10881 - Piotr's Ants【模拟+思维】
- DFS中的奇偶剪枝学习笔记
- POJ 3154 Graveyard【多解,数论,贪心】
- HDU 1010 Tempter of the Bone【DFS经典题+奇偶剪枝详解】
- Ethereum - 以太坊项目
- COGS 144. [USACO Dec07] 魅力手镯【01背包复习】
- SQL Server 使用全文索引进行页面搜索
- HDU 1003 Max Sum【动态规划求最大子序列和详解 】
- HDU 1005 Number Sequence【多解,暴力打表,鸽巢原理】
- HDU 1019 Least Common Multiple【gcd+lcm+水+多个数的lcm】
- HDU 1017 A Mathematical Curiosity【水,坑】
- 比特币项目
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Manage Jenkins报错:"依赖错误: 部分插件由于缺少依赖无法加载...",解决办法
- 从头创建您自己的vuei .js——第3部分(构建VDOM)
- adb 模拟上下左右滑动,示例演示
- python 技术篇-pythoncom.PumpMessag()关闭、杀死它的进程,pythoncom.PumpMessag()运行卡住解决办法
- PyQt5 技术篇-QWidget、QDialog程序窗口关闭closeEvent()触发事件方法重写
- 恕我直言你可能真的不会java第6篇:Stream性能差?不要人云亦云
- python-技术篇-打印详细报错日志,获取报错信息位置行数
- React从入门到放弃,一个关于网页速度的故事
- python 技术篇-日志定期清理设置,自动清理上个月的日志实例演示
- python 技术篇-日志模块自定义时间格式
- 恕我直言你可能真的不会java第12篇-如何使用Stream API对Map元素排序
- JavaScript错误处理完全指南
- 从头创建您自己的vue.js——第4部分(构建反应性)
- Oracle 数据库-服务器端字符集查看方法
- Pywinauto 应用后端类型选择错误:AttributeError: 'NoneType' object has no attribute 'backend'. 原因及解决办法