前言
记录学习FIFO的相关知识
正文
1、跨时钟域传输的三种方法
- 打两拍、异步FIFO、握手信号
2、什么是异步FIFO?画出异步FIFO的结构图。
- 读写时钟域不同。在写时钟域下将数据放入缓存区,读时钟域下将数据读取出来
- 没有外部读写地址线,只能按照顺序读写
- 写指针指向下一个要写入的位置,读指针指向当前要读取的位置。复位时,都指向零,是写指针下一个要写入的位置,读指针当前读取的位置,所以是“读空/empty”
3、如何判断读空或者写满信号?
- 如果是直接判断读写指针相等,无法知道是满还是空
- 对指针增加一位最高有效位MSB,n位指针,n-1位表示访问FIFO所需的地址位数。n位完全相同表示“空”;MSB不同,n-1位完全相同表示“满”
4、为什么要用格雷码?
- 二进制码在传输时可能会发生多bit位同时变化得情况,如0111->1000,这样容易发生亚稳态(触发器在规定时间内无法达到一个稳定的状态)。
- 格雷码:循环码,相邻两位之间只有1bit发生改变,减少亚稳态发生的概率,并不能从根本上解决
- 假设写指针为为7->8跳转,读指针为6->7跳转。写指针由于异常情形出现了7->7的跳转,将写指针同步到读时钟域,读写指针都指向7,出现了“假空”。“假满”与之类似,不再赘述。“假空”和“假满”的出现降低了FIFO的性能,但是避免了亚稳态的问题,是可以接受的。
5、不同读写时钟域情况
- 写时钟域慢,读时钟域快:读时钟域总是能采集到信号(慢到快),判断空不成问题
假如读指针从1-9,同步到写时钟域的是7,写指针也在7,那么会判断“满”,会停止写入,其实没满,还差点
- 写时钟域快,读时钟域慢:会出现漏采(只能采集到135)。将读指针传到写时钟域是可以的(慢到快),判断满不成问题
假设写指针从1-9,同步到读时钟域是7,读指针也在7,会产生“空信号”,会停止读,但实际上没有空
- 当在极端状况下,写很快,读很慢,那一开始就被写满;相反则永远是读空
总结:写得快,会错误判断产生虚空;读得快,会错误判断产生虚满
6、异步FIFO设计核心
- 格雷码+指针同步
7、如何验证FIFO?
- 验证场景:
- 验证平台: