1. 目录

    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实现与注意要点相关推荐

  1. Javascript变量的注意要点

    ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型和引用类型的值 基本类型值(String,Number,Boolean,Null,Undefined)指的是简 ...

  2. C#8.0可空引用类型的使用注意要点

    C#8.0可空引用类型的使用注意要点 最近VS2019正式版发布了,装下来顺便试用了一下C#8.0,最大的看点应该就是可空引用类型了.不过C#8.0仍然处于Beta的状态,而且试用时也遇到了几个坑. ...

  3. 广州电子厂房净化工程_简述设计电子车间净化工程的注意要点

    在电子车间净化工程的设计.安装.选择净化设备与彩钢夹芯板的时候有哪些需要注意的要点呢?这些看起来不太重要的细节,却往往大大的影响了电子净化车间的净化效率与洁净度.而且这些注意要点,不仅在电子净化车间中 ...

  4. 3d制作中需要注意的问题_珠宝首饰工艺篇-戒指3D造型设计制作注意要点

    1.戒指的常规手寸数据和戒指外围周长计算公式应用参考如下图: 戒指手寸内直径大小说明图 1.戒指手寸规格有14号.15号.16号.17号.18号.19号.20号.,但是从开发角度来说比较常见规格是17 ...

  5. 桦仔 笔记3-徐 设置数据库自动增长注意要点

    1 --设置数据库自动增长注意要点 2 --1要设置成按固定大小增长,而不能按比例 对于小的数据库,设置一次增长50MB到100MB,大的数据库,一次增长100MB到200MB 3 --2要定期监测各 ...

  6. 浅谈上海装修设计公司吊顶安装的注意要点

    随着我国对外开放政策日渐成熟,逐渐掀开了外国风土人情的神秘面纱,越来越多的国外特色风俗传入我国,为我国人民所热爱.上海作为我国经济最为发达的城市,在装修设计行业领域有着极大的发展优势.其中,上海装修设 ...

  7. CAD图形导入3dmax方法及注意要点

    CAD图形导入3dmax方法及注意要点 1.用CAD打开图纸,打开时字体选择GB开头的.代理信息选择显示代理图形. 2.将视图放大到想要导出的平面图或立面图,隐藏或删除不需要的辅助线.标注线.填充图案 ...

  8. 布线前,布局这步极为关键!分享一些PCB设计布线注意要点

    在我们的日常生活中,我们所接触到的每一种电子设备当中几乎都会出现印刷电路板,如果在某样设备中有电子零件,那么它们也都是镶在大小各异的PCB上. 要使电子电路获得最佳性能,元器件的布局及导线的布设至关重 ...

  9. 【JY】橡胶支座精细化模拟与有限元分析注意要点

    不等待 即关注 简介 硫化天然橡胶是一种非线性材料,具有低剪切模量.低弹性模量.几乎不可压缩和断裂伸长率高的特点.典型的橡胶单轴拉伸应力应变曲线如下图所示,我们可以通过宏观单元对于橡胶支座进行模拟,详 ...

最新文章

  1. QIIME 2教程. 15样品分类和回归q2-sample-classifier(2021.2)
  2. Ardino基础教程 7_蜂鸣器发声实验
  3. unzip 分包_建筑总包企业计量分包成本时,未取得相应分包发票,增值税如何处理?...
  4. 应用营销策略知多少?
  5. 决策树-线性二分类+非线性二分类
  6. 说说单节点集群里安装hive、3\5节点集群里安装hive的诡异区别(版本搭配)
  7. centos php日志分析,Centos日志查看分析
  8. Cannot change version of project facet Dynamic Web Module to 3.0
  9. 将Altera FPGA的sof文件和NIOS II的elf固件合并为一个jic文件以使用Quartus Programmer烧写
  10. 华三交换机配置基础及讲解
  11. 课程设计每日总结0819
  12. MacOS 打开软件出现 ‘xxx‘ “将对您的电脑造成伤害。 您应该将它移到废纸篓。“的解决方式
  13. 理解AMQP协议和RabbitMQ的性能和可靠平衡
  14. 阿里云商标注册快速上手笔记(新手图文教程)
  15. vue打包后华为手机自带浏览器访问空白
  16. 【Android 你的SurfaceView休眠了吗】
  17. caoz的梦呓:谈谈信息不对称与To B业务的难点【推荐】
  18. [Luogu4169] [Violet]天使玩偶/SJY摆棋子 [cdq分治/k-d tree]
  19. Chrome小游戏《Boxel Rebound》
  20. 支付宝支付整体流程,包括验签【同步】【异步】

热门文章

  1. 用opencv将图片转换为漫画风格
  2. ORACLE高级消息队列AQ
  3. 【色彩L3笔记:调子】
  4. 蒟蒻のJAVA小窝(关于封装的一些思考)经同意转载
  5. 【BZOJ2073】【POI2004】PRZ(状压dp)
  6. ap备考计算机科学a考情分析,真确备考AP计算机科学的方法
  7. 五个月的时间视力从0.4-1.2,她究竟用了什么“好方法”?
  8. [附源码]Python计算机毕业设计SSM家教中心管理系统(程序+LW)
  9. 瑞萨RH850 F1KM-S4 -LED闪烁
  10. 程序员记忆力差怎么办?