异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,将写地址同步到读时钟域再和读地址比较进行FIFO空状态判断(同步后的写地址一定是小于或者等于当前的写地址,所以此时判断FIFO为空不一定是真空,这样更保守),将读地址同步到写时钟域再和写地址比较进行FIFO满状态判断(同步后的读地址一定是小于或者等于当前的读地址,所以此时判断FIFO为满不一定是真空,这样更保守),这样可以保证FIFO的特性:FIFO空之后不能继续读取,FIFO满之后不能继续写入。
  大多数情形下,异步FIFO两端的时钟不是同频的,或者读快写慢,或者读慢写快,这时候进行地址同步的时候,可能会有地址遗漏,以读慢写快为例,进行满标志判断的时候需要将读地址同步到写时钟域,因为读慢写快,所以不会有读地址遗漏,同步后的读地址滞后当前读地址,所以可能满标志会提前产生。进行空标志判断的时候需要将写地址同步到读地址,因为读慢写快,所以当读时钟同步写地址的时候,必然会漏掉一部分写地址(写时钟快,写地址随写时钟翻转,直到满标志出现为止),那到底读时钟会同步到哪个写地址?不必在意是哪一个,我们关注的是漏掉的地址会不会对FIFO的空标志产生影响。比如写地址从0写到10,期间读时钟域只同步到了2,5,7这三个写地址,漏掉了其他地址。同步到7地址时,真实的写地址可能已经写到10地址,相当于“在读时钟域还没来得及觉察的情况下,写时钟域可能偷偷写了数据到FIFO去”,这样在比较读写地址的时候不会产生FIFO“空”读操作。漏掉的地址也没有对FIFO的逻辑操作产生影响。
  我们可以对异步FIFO的地址采用binary编码,这样并不影响异步FIFO的功能,前提是读写地址同步时能够保持正确。这种情况在功能仿真时完全正确,问题只有到时序仿真时才会遇到。毛刺可以说是异步电路的杀手,一个毛刺被触发器采样后会被放大,然后传播,导致电路功能出错。binary编码的地址总线在跳变时极易产生毛刺,因为binary编码是多位跳变,在实现电路时不可能做到所有的地址总线等长,address bus skew必然存在,而且写地址和读地址分属不同时钟域,读写时钟完全异步,这样地址总线在进行同步过程中出错不可避免,比如写地址在从0111到1000转换时4条地址线同时跳变,这样读时钟在进行写地址同步后得到的写地址可能是0000-1111的某个值,这个完全不能确定,所以用这个同步后的写地址进行FIFO空判断的时候难免出错。
  这个时候gray码体现了价值,一次只有一位数据发生变化,这样在进行地址同步的时候,只有两种情况:1.地址同步正确;2.地址同步出错,但是只有1位出错;第一种正确的情况不需要分析,我们关注第二种,假设写地址从000->001,读时钟域同步出错,写地址为000->000,也就是地址没有跳变,但是用这个错误的写地址去做空判断不会出错,最多是让空标志在FIFO不是真正空的时候产生,而不会出现空读的情形。所以gray码保证的是同步后的读写地址即使在出错的情形下依然能够保证FIFO功能的正确性,当然同步后的读写地址出错总是存在的(因为时钟异步,采样点不确定)。这里需要注意gray码只是在相邻两次跳变之间才会出现只有1位数据不一致的情形,超过两个周期则不一定,所有地址总线bus skew一定不能超过一个周期,否则可能出现gray码多位数据跳变的情况,这个时候gray码就失去了作用,因为这时候同步后的地址已经不能保证只有1位跳变了。
  另外需要将地址总线打两拍,这是为了避免亚稳态传播,理论上将打两拍不能消除亚稳态现象,因为时钟异步,亚稳态不可避免,但是可以极大降低亚稳态传播的概率,低频情况下甚至STA不需要分析这里的异步时序,因为寄存器都可以在一拍内将亚稳态消除,恢复到正常0/1态。而在高频情况下则不一定,尤其在28nm工艺以下,需要检查两级触发器的延迟,保证延迟低,这样可以提高Tr,提高系统MTBF。

二进制转格雷码

二进制转格雷码: 数据左移1位,高位补0之后与原数据进行异或。

reg [5:0]  data ;
reg [5:0]  gray;always@(posedge clk or negedge rst_n)
if(!rst_n)gray=6'b0;
elsegray=data^{1'b0,data[5:1]};

3、格雷码转二进制

由gray[5:0]得到二进制data[5:0]

最高位不变:其他位为格雷码对应位以及高位的异或值。

二进制

表达式

说明

data[5]

gray[5]

最高位不变

data[4]

gray[5]^gray[4]

从最高位开始异或

data[3]

gray[5]^gray[4]^gray[3]

从最高位开始异或

data[2]

gray[5]^gray[4]^gray[3]^gray[2]

从最高位开始异或

data[1]

gray[5]^gray[4]^gray[3]^gray[2]^gray[1]

从最高位开始异或

data[0]

gray[5]^gray[4]^gray[3]^gray[2]^gray[1]^gray[0]

从最高位开始异或

function [5:0] gray2bin;
input [5:0]gray_in;
reg [5:0]gray_code;
reg [5:0]bin_code;
integer i,j;
reg tmp;
begingray_code=gray_in;for(i=0;i<=5;i=i+1)begintmp=1’b0;for(j=i;j<=5;j=j+1)tmp=gray_code^tmp;bin_code[i]=tmp;endgray2bin=bin_code;
end
endfunction
assign data=gray2bin(gray_bin);   //调用

异步fifo的空满判断原理相关推荐

  1. 异步FIFO设计原理及Verliog源代码

    1.什么是FIFO? FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据 ...

  2. 【FPGA学习记录1】异步FIFO的介绍

    文章目录 写在前面 1.FIFO的定义以及为什么要用FIFO.FIFO的分类 1.1什么是FIFO 1.2为什么要用FIFO 1.3FIFO的分类 2.异步FIFO的工作原理 2.1FIFO的结构 2 ...

  3. 基于FPGA的异步FIFO设计

    今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...

  4. 格雷码在异步FIFO中的应用

    格雷码在异步FIFO中的应用 2018年7月1日 22点44分 1.格雷码的介绍 在介绍格雷码之前,我们先说说自然二进制码,也就是我们经常说的二进制数. 我们用二进制数表示一个变化的数值,例如,用一个 ...

  5. 【verilog】 异步FIFO设计(格雷码转换,跨时钟域)

    功能图 空满判别 顶层 子模块 测试 功能图 空满判别 对FIFO的空满判断采用地址位扩展的方法 waddr=raddr,fifo为空 waddr[最高bit]≠raddr[最高bit],waddr[ ...

  6. Verilog实现FIFO专题5-异步FIFO设计(异步FIFO工作方式、异步FIFO介绍、异步FIFO介绍)

    FIFO根据输入输出时钟是否一致,分为同步FIFO与异步FIFO.同步FIFO中,读写控制信号以及数据均处于同一时钟域,满足STA分析时一般不会出现亚稳态等不稳定情形:而对于异步FIFO,读写相关信号 ...

  7. IC学习笔记3——异步FIFO

    IC学习笔记3--异步FIFO 异步FIFO的工作内容与同步FIFO类似,但是异步FIFO的控制并不像同步FIFO那么简单,因为异步FIFO工作在不同的时钟域,这将会带来一些问题,比如空满检测?是否还 ...

  8. 异步FIFO格雷码及同步相关问题?

    零.前言 关于异步FIFO如何设计请参考之前的一篇文章:手写异步FIFO. 关于异步FIFO的空满现象可以参考:你真的理解异步FIFO读写中的空满现象吗? 一.格雷码的作用 格雷码的每两个相邻码字只有 ...

  9. 异步FIFO的verilog代码实现(包含将满和将空逻辑)

    目录 异步FIFO的verilog代码实现(包含将满和将空逻辑) 异步FIFO简介 异步FIFO关键技术1 -- 读写信号跨时钟域同步 异步FIFO关键技术2 -- 读写地址的比较 异步FIFO关键技 ...

最新文章

  1. iOS中KVO模式的解析与应用
  2. 1136 A Delayed Palindrome 需再做
  3. mysql源码安装都能装什么模块_源码安装后,添加其他模块
  4. js中图片显示用ajax,javascript - 前台用ajax上传图片,怎么让图片上传完成显示的缩略图片的时候显示分辨率大小...
  5. Java集合Vector
  6. 在Angular单元测试代码的it方法里连续调用两次detectChange方法,会触发两次ngAfterViewInit吗
  7. Codeforces1080F. Katya and Segments Sets
  8. Activity与Service通信(不同进程之间)
  9. NS3中路由协议分析【AODV理论分析】
  10. PostgreSQL12中文手册
  11. 音频处理与压缩技术漫谈
  12. 美团旅行数据质量监管平台实践
  13. wamp 增加php 7.2,wamp环境下php7.2升级,WAMP本地环境升级php7+版本
  14. WSL2 安装 CUDA(Win11)
  15. 学会这些句子,你还愁英语单词吗
  16. UrlRewriter.NET 与 UrlRewrittingNet.UrlRewriter比较
  17. 蓝牙设备名字和地址ID如何设置
  18. 【ESP32_8266_BT篇(二)】Beacon信标广播
  19. Pytorch:stride步长
  20. Bug管理系统BugFree

热门文章

  1. php怎么调节字体大小,ps中怎么调整字体大小
  2. 商标申请主体证明文件主体材料资格证明都有哪些
  3. python怎么读write_Python读写文件
  4. 使用Zookeeper实现服务注册中心-《架构探险-从零开始写分布式服务框架》读书笔记
  5. 路由器的模式之间有什么区别
  6. 微信支付V3 超级详细版请认真看完——(第2集)
  7. 兰伯特(Lambert)方程的求解算法2
  8. 密室NPC的演技吊打流量明星
  9. 均值归一化_机器学习总结(算法):高斯、高斯过程、SVM、归一化
  10. 什么是站内SEO优化(应该怎么做)