async_fifo实现与注意要点
目录
async_fifo结构说明
为什么使用格雷码
空满判断标志
假空假满
注意事项
async_fifo结构说明
和同步fifo一样,中间是双口的ram,左右两个模块分别是读写地址的产生和判断空满信号。比如在FIFO wptr &waddr模块中产生ram的地址信号waddr,然后将waddr这个二进制编码的地址信号转换为格雷码来进行跨时钟域处理(注意,二进制编码转换格雷码是组合逻辑,组合逻辑的输出不能直接的进行跨时钟域,因为毛刺会影响跨时钟域的结果,需要将组合逻辑的输出放到寄存器中,之后再进行跨时钟域的处理)。在读时钟域下的rq2_wptr信号与原来的写时钟域的下的rptr信号来进行空状态的判断,以上是从写时钟域到读时钟域下的操作,从读时钟域到写时钟域同理。
为什么使用格雷码
使用格雷码的根本原因就是就算跨时钟域的时候,出现了亚稳态,整个fifo的功能也不会出现错误。比如用二进制的waddr来进行跨时钟域,比如waddr从7到8的变化(0111->1000),raddr此时处于6的位置,跨时钟域的时候,寄存器会随机的取到中间状态的一个值,所以在rq2_wptr处得到的结果可能是2,此时raddr是6,相当于fifo存就存到了2,读却读到了6,这样会使fifo的功能错误。如果使用格雷码,waddr从7到8的变化(0100->1100),中间就涉及到了一个值的变化,就算出现亚稳态,不是1100就是0100,是1100的话,正好功能正确,如果是0100的话,不影响fifo的读,最多可能出现fifo的假空判断,不会出现fifo功能的错误,即读大于写(读指针指向当前的值,写指针指向下一时刻的值)
空满判断标志
在格雷码的基础上,扩展一位最高位,这个最高位可以方便判断空满,当写指针转了一圈又回来,说明把fifo写满了,此时读指针没有动的话,说明fifo是满的,此时扩展后的读指针和扩展后的写指针最高位不同,其他位置都一样。如果fifo是空的话,二者全相等。空标志在读时钟域判断,满标志在写时钟域判断
假空假满
假空假满根本原因是因为打两拍的原因,比如写指针打两拍到了读时钟域,此时写指针已经大于了同步的写指针,如果此时判断为空的话,实际上,写指针在同步的时间里已经存了值进去,这样就是假空。假满同理,但是这个对fifo功能没有影响,比如fifo的深度是6,在1的时候空标志位拉高,只能说fifo实际的深度只有5,这是一种保守设计,对功能没影响。
关于异步FIFO设计,这7点你必须要搞清楚_孤独的单刀的博客-CSDN博客_异步fifo为什么要打两拍
这篇文章从快慢时钟详细的分析了空满的判断已经对fifo功能影响
注意事项
二进制编码转换格雷码是组合逻辑,组合逻辑的输出不能直接的进行跨时钟域,因为毛刺会影响跨时钟域的结果,需要将组合逻辑的输出放到寄存器中,之后再进行跨时钟域的处理
async_fifo的设计代码(欢迎大家挑错)
module async_fifo(wclk,wr,din,full,rclk,rd,dout,empty,rst_n);
parameter data_width = 16;
parameter data_depth = 8;
parameter ram_depth = 256;input rst_n;
input wclk;
input wr;
input [data_width-1:0] din;
output full;input rclk;
input rd;
output [data_width-1:0] dout;
output empty;reg [data_width-1:0] dout;
wire empty;
wire [data_depth-1:0] wr_addr;
wire [data_depth-1:0] rd_addr;reg [data_depth:0] wr_addr_ptr;
reg [data_depth:0] rd_addr_ptr;reg [data_depth:0] wr_addr_gray_rdy;
wire [data_depth:0] wr_addr_gray;
reg [data_depth:0] wr_addr_gray1;
reg [data_depth:0] wr_addr_gray2;reg [data_depth:0] rd_addr_gray_rdy;
wire [data_depth:0] rd_addr_gray;
reg [data_depth:0] rd_addr_gray1;
reg [data_depth:0] rd_addr_gray2;assign wr_addr = wr_addr_ptr[data_depth-1:0];
assign rd_addr = rd_addr_ptr[data_depth-1:0];assign wr_addr_gray = (wr_addr_ptr >> 1) ^ wr_addr_ptr;
assign rd_addr_gray = (rd_addr_ptr >> 1) ^ rd_addr_ptr;reg [data_width-1 : 0] ram_fifo [ram_depth-1:0];integer i;
always@(posedge wclk or negedge rst_n)
if(!rst_n)beginfor(i=0;i<ram_depth;i=i+1)ram_fifo[i] <= 0;
end
else if(wr && (!full))
ram_fifo[wr_addr] <= din;always @(posedge rclk or negedge rst_n) beginif(!rst_n)dout <= 0;else if(rd && (!empty))dout <= ram_fifo[rd_addr];
endalways @(posedge wclk or negedge rst_n) beginif(!rst_n)wr_addr_ptr <= 0;else if(wr &&(!full))wr_addr_ptr <= wr_addr_ptr + 1;
endalways @(posedge rclk or negedge rst_n) beginif(!rst_n)rd_addr_ptr <= 0;else if(rd &&(!empty))rd_addr_ptr <= rd_addr_ptr + 1;
endalways@(posedge wclk or negedge rst_n) beginif(!rst_n)wr_addr_gray_rdy <= 0;elsewr_addr_gray_rdy <= wr_addr_gray;
endalways@(posedge rclk or negedge rst_n) beginif(!rst_n)rd_addr_gray_rdy <= 0;else rd_addr_gray_rdy <= rd_addr_gray;
endalways@(posedge wclk or negedge rst_n)beginif(!rst_n)beginrd_addr_gray1 <=0;rd_addr_gray2 <=0;endelse beginrd_addr_gray1 <= rd_addr_gray_rdy;rd_addr_gray2 <= rd_addr_gray1;end
endalways@(posedge rclk or negedge rst_n)beginif(!rst_n)beginwr_addr_gray1 <=0;wr_addr_gray2 <=0;endelse beginwr_addr_gray1 <= wr_addr_gray_rdy;wr_addr_gray2 <= wr_addr_gray1;end
endassign empty = (wr_addr_gray2 == rd_addr_gray)? 1'b1:1'b0;
assign full = (wr_addr_gray[data_depth:data_depth-1'b1] != rd_addr_gray2[data_depth:data_depth-1'b1]) && (wr_addr_gray[data_depth-1:0] == rd_addr_gray2[data_depth-1:0]);
endmodule
仿真波形
async_fifo实现与注意要点相关推荐
- Javascript变量的注意要点
ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型和引用类型的值 基本类型值(String,Number,Boolean,Null,Undefined)指的是简 ...
- C#8.0可空引用类型的使用注意要点
C#8.0可空引用类型的使用注意要点 最近VS2019正式版发布了,装下来顺便试用了一下C#8.0,最大的看点应该就是可空引用类型了.不过C#8.0仍然处于Beta的状态,而且试用时也遇到了几个坑. ...
- 广州电子厂房净化工程_简述设计电子车间净化工程的注意要点
在电子车间净化工程的设计.安装.选择净化设备与彩钢夹芯板的时候有哪些需要注意的要点呢?这些看起来不太重要的细节,却往往大大的影响了电子净化车间的净化效率与洁净度.而且这些注意要点,不仅在电子净化车间中 ...
- 3d制作中需要注意的问题_珠宝首饰工艺篇-戒指3D造型设计制作注意要点
1.戒指的常规手寸数据和戒指外围周长计算公式应用参考如下图: 戒指手寸内直径大小说明图 1.戒指手寸规格有14号.15号.16号.17号.18号.19号.20号.,但是从开发角度来说比较常见规格是17 ...
- 桦仔 笔记3-徐 设置数据库自动增长注意要点
1 --设置数据库自动增长注意要点 2 --1要设置成按固定大小增长,而不能按比例 对于小的数据库,设置一次增长50MB到100MB,大的数据库,一次增长100MB到200MB 3 --2要定期监测各 ...
- 浅谈上海装修设计公司吊顶安装的注意要点
随着我国对外开放政策日渐成熟,逐渐掀开了外国风土人情的神秘面纱,越来越多的国外特色风俗传入我国,为我国人民所热爱.上海作为我国经济最为发达的城市,在装修设计行业领域有着极大的发展优势.其中,上海装修设 ...
- CAD图形导入3dmax方法及注意要点
CAD图形导入3dmax方法及注意要点 1.用CAD打开图纸,打开时字体选择GB开头的.代理信息选择显示代理图形. 2.将视图放大到想要导出的平面图或立面图,隐藏或删除不需要的辅助线.标注线.填充图案 ...
- 布线前,布局这步极为关键!分享一些PCB设计布线注意要点
在我们的日常生活中,我们所接触到的每一种电子设备当中几乎都会出现印刷电路板,如果在某样设备中有电子零件,那么它们也都是镶在大小各异的PCB上. 要使电子电路获得最佳性能,元器件的布局及导线的布设至关重 ...
- 【JY】橡胶支座精细化模拟与有限元分析注意要点
不等待 即关注 简介 硫化天然橡胶是一种非线性材料,具有低剪切模量.低弹性模量.几乎不可压缩和断裂伸长率高的特点.典型的橡胶单轴拉伸应力应变曲线如下图所示,我们可以通过宏观单元对于橡胶支座进行模拟,详 ...
最新文章
- QIIME 2教程. 15样品分类和回归q2-sample-classifier(2021.2)
- Ardino基础教程 7_蜂鸣器发声实验
- unzip 分包_建筑总包企业计量分包成本时,未取得相应分包发票,增值税如何处理?...
- 应用营销策略知多少?
- 决策树-线性二分类+非线性二分类
- 说说单节点集群里安装hive、3\5节点集群里安装hive的诡异区别(版本搭配)
- centos php日志分析,Centos日志查看分析
- Cannot change version of project facet Dynamic Web Module to 3.0
- 将Altera FPGA的sof文件和NIOS II的elf固件合并为一个jic文件以使用Quartus Programmer烧写
- 华三交换机配置基础及讲解
- 课程设计每日总结0819
- MacOS 打开软件出现 ‘xxx‘ “将对您的电脑造成伤害。 您应该将它移到废纸篓。“的解决方式
- 理解AMQP协议和RabbitMQ的性能和可靠平衡
- 阿里云商标注册快速上手笔记(新手图文教程)
- vue打包后华为手机自带浏览器访问空白
- 【Android 你的SurfaceView休眠了吗】
- caoz的梦呓:谈谈信息不对称与To B业务的难点【推荐】
- [Luogu4169] [Violet]天使玩偶/SJY摆棋子 [cdq分治/k-d tree]
- Chrome小游戏《Boxel Rebound》
- 支付宝支付整体流程,包括验签【同步】【异步】