Verilog-同步FIFO
参考博客:https://blog.csdn.net/hengzo/article/details/49683707
1、基本框图

1)双端口RAM加两个读写指针
2)写数据、写使能、写满;读数据、读使能、读满
2、代码思路

1)Full和Empty的产生:使用fifo_counter记录FIFO RAM中的数据个数,等于0时,给出empty信号,等于BUF_LENGTH时,给出full信号
2)fifo_counter的更新:发生有效写操作时+1,发生有效读操作时-1,同时发生读写操作时不变
3)读写指针的控制:读写指针宽度与地址宽度相当,地址增加而溢出后,自动变成0。循环指针。初始时刻都指到0,发生有效写时写指针+1,写指针指向将要写的地址;发生有效读时读指针-1,读指针指向将要读的地址。
3、代码
`timescale 1ns / 1ps module synchronous_fifo
#(parameter BUF_WIDTH=, //地址宽度为3,
parameter BUF_SIZE=) //数据个数,FIFO深度
(
input clk,
input rst_n,
input wr_en,
input rd_en,
input [:] buf_in,
output [:] buf_out,
output buf_full,
output buf_empty,
output [BUF_WIDTH:] fifo_cnt
); reg [:] buf_mem [:BUF_SIZE-]; // 双端口RAM
reg [BUF_WIDTH-:] rd_ptr,wr_ptr; // 读写指针
reg [:] buf_out_reg;
reg [BUF_WIDTH:] fifo_cnt_reg; // 存入数据的计数,0-8,位宽要比地址位宽大1 //========= 写入 ============
always @(posedge clk) begin
if(wr_en&&!buf_full) begin
buf_mem[wr_ptr] <= buf_in;
end
end //========= 读出 ============
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
buf_out_reg <= 'd0;
end
else begin
if(rd_en&&!buf_empty) begin
buf_out_reg <= buf_mem[rd_ptr];
end
else buf_out_reg <= buf_out_reg;
end
end assign buf_out = buf_out_reg; //========= 数据计数 ============
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
fifo_cnt_reg <= {(BUF_WIDTH+){'b0}};
end
else begin
if((wr_en&&!buf_full)&&((rd_en&&!buf_empty)))
fifo_cnt_reg <= fifo_cnt_reg;
else if(wr_en&&!buf_full)
fifo_cnt_reg <= fifo_cnt_reg+'b1;
else if(rd_en&&!buf_empty)
fifo_cnt_reg <= fifo_cnt_reg-'b1;
else fifo_cnt_reg <= fifo_cnt_reg;
end
end
assign fifo_cnt = fifo_cnt_reg; //========= 读写指针控制 ============
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
rd_ptr <= {BUF_WIDTH{'b0}};
end
else begin
if(rd_en&&!buf_empty) rd_ptr <= rd_ptr + 'b1;
else rd_ptr <= rd_ptr;
end
end always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
wr_ptr <= {BUF_WIDTH{'b0}};
end
else begin
if(wr_en&&!buf_full) wr_ptr <= wr_ptr + 'b1;
else wr_ptr <= wr_ptr;
end
end //========= 空满判断 ============
assign buf_full = (fifo_cnt_reg == BUF_SIZE)?'b1:1'b0;
assign buf_empty = (fifo_cnt_reg == {(BUF_WIDTH+){'b0}})?1'b1:'b0; endmodule

his is a Full version of ISim.
Time resolution is ps
Simulator is doing circuit initialization process.
Finished circuit initialization process.
Push
Push
------Poped:
Push
Push
Push
Push
Push
Push
Push
---Cannot push : Buffer Full---
---Cannot push : Buffer Full---
---Cannot push : Buffer Full---
---Cannot push : Buffer Full---
---Cannot push : Buffer Full---
---Cannot push : Buffer Full---
------Poped:
Push
------Poped:
------Poped:
------Poped:
------Poped:
Push
------Poped:
Push
------Poped:
------Poped:
------Poped:
------Poped:
------Poped:
---Cannot Pop: Buffer Empty---
---Cannot Pop: Buffer Empty---
---Cannot Pop: Buffer Empty---
---Cannot Pop: Buffer Empty---
---Cannot Pop: Buffer Empty---
---Cannot Pop: Buffer Empty---
Push
------Poped:
Verilog-同步FIFO的更多相关文章
- Verilog学习笔记简单功能实现(八)...............同步FIFO
Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...
- 怎么用Verilog语言描述同步FIFO和异步FIFO
感谢 知乎龚大佬 打杂大佬 网上几个nice的博客(忘了是哪个了....) 前言 虽然FIFO都有IP可以使用,但理解原理还是自己写一个来得透彻. 什么是FIFO? Fist in first out ...
- 同步fifo的Verilog实现
FIFO是一种先进先出的数据缓存器,他与普通存储器相比: 优点:没有外部读写地址线,这样使用起来非常简单: 缺点:只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成,不能像普通存 ...
- 同步FIFO学习
在网上找的一个经典同步FIFO例子. 一.前言 FIFO (First-In-First-Out) 是一种先进先出的数据交互方式,在数字ASIC设计中常常被使用.FIFO按工作时钟域的不同又可以分为: ...
- 同步FIFO design and IP level verification
一.前言 应聘IC前端相关岗位时,FIFO是最常考也是最基本的题目.FIFO经常用于数据缓存.位宽转换.异步时钟域处理.随着芯片规模的快速增长,灵活的system verilog成为设计/验证人员的基 ...
- 同步fifo与异步fifo
参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...
- 同步fifo的verilogHDL设计实例
原创 设计一个fifo,输入16bit,输出16bit的data,寻址宽度5bit,有空满标志. top 层如下所示: /* date : 2014/10/14 version : modelsim ...
- E203 同步fifo
1. 输入端, 输入信号, i_vld,表示输入请求写同步fifo,如果fifo不满,则fifo发送i_rdy 到输入端,开始写fifo.i_vld和i_rdy是写握手信号. 2.输出端 o_rdy表 ...
- CYPEESS USB3.0程序解读之---同步FIFO(slaveFifoSync)
上一篇文章解读了CYPRESS FX3的GPIO的操作过程,下面解读同步FIFO的一个例子(slaveFifoSync). *生产者,消费者. 1.首先看DMA的回调函数(cyu3dma.h): ty ...
- FPGA SD 卡 之 乒乓操作 、同步fifo
这里记录一个实际的需要使用乒乓操作的例子:读sd卡数据的时,在spi的模式下.发送单数据块的读取命令,在回应之后会有 512字节的数据.使用乒乓操作,可以用两个八位的寄存器,就可以完成连续的512字节 ...
随机推荐
- 消息中间件面试题31道RabbitMQ+ActiveMQ+Kafka
消息中间件面试题31道RabbitMQ+ActiveMQ+Kafka 前言 文章开始前,我们先了解一下什么是消息中间件? 什么是中间件? 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的, ...
- Mysql 安装出现error Nr.1045
我们在windows下安装mysql时会出现Access denied for user 'root'@localhost'(using password:No)的问题,这个问题是因为你的机器上之前安 ...
- HYSBZ_1854_并查集
http://www.lydsy.com/JudgeOnline/problem.php?id=1854 每次判断每组两个数的根,若不等,则小的遍历1,大的为根,若相等,则说明前面的小的都遍历过,根遍 ...
- Codeforces 1117C Magic Ship (二分)
题意: 船在一个坐标,目的地在一个坐标,每天会有一个风向将船刮一个单位,船也可以移动一个单位或不动,问最少几天可以到目的地 思路: 二分天数,对于第k天 可以分解成船先被吹了k天,到达坐标(x1+su ...
- 【题解】P1908 逆序对——归并算法
先吐槽 这题做了两天,昨天讲分治,老师用归并讲了一遍,今天又用树状数组讲了一遍 归并不难,啊啊啊我居然才调出来 思路 归并两个数组时,对于第二个数组的元素a[c2],它与第一个数组中目前还没归到总数组 ...
- error C2338: No Q_OBJECT in the class with the signal (NodeCreator.cpp)
在Qt中,当派生类需要用到信号与槽机制时,有两个要求. 1.该类派生自QObject类. 2.类中有Q_OBJECT宏. 本次报错的原因就是因为没有在类中添加Q_OBJECT宏. 而我的出错原因更傻逼 ...
- debian 安装xz 命令
# apt install -y xz-utils # xz -d Python-3.6.8.tar.xz # xz -d Python-3.6.8.tar.xz
- k8s系列---网络插件flannel
跨节点通讯,需要通过NAT,即需要做源地址转换. k8s网络通信: 1) 容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现: 2) pod之间的通信,pod ip <---> ...
- Matplotlib数据可视化从入门到精通(持续更新)
目录 前言 如何添加标题-title 如何添加文字-text 如何添加注释-annotate 如何设置坐标轴名称-xlabel/ylabel 如何添加图例-legend 如何调整颜色-color 如何 ...
- C语言RH850 F1KM serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 今天我要介绍的RH85 ...