(4)跨时钟域设计(多bit+FIFO)
一、引入
以上是多bit指示信号的传输
与指示信号不同,多bit数据流具有连续性,即背靠背传输,同时要求信号具有较快的传播速度
目前多bit数据流传输有两种,一种是借助SRAM,另一种是借助FIFO
二、FIFO
如果FIFO内数据写满则生成满信号,反压上游结点,上游停止写入新的数据,否则会冲洗掉已写入的数据;如果FIFO内的数据全部被读则实时生成空信号,控制下游结点不再进行读操作,否则会将读过的数据再读一遍
总体架构:
FIFO Memory:FIFO内部的双端口SRAM,存储上游结点写入的数据wdata,下游节点从rdata中读出;SRAM的读写地址采用每次只递增1的机制,写和读到最高地址后重新返回0地址
FIFO wptr & full:满信号生成电路,通过判断在写时钟域下,写指针和读指针之间的关系,实时生成满信号wfull,以通知上游结点停止写操作
FIFO rptr & empty:空信号生成电路,通过判断在读时钟域下,写指针和读指针之间的关系,实时生成空信号rempty,以通知下游结点停止读操作
sync_r2w、sync_w2r:两级同步器,将对方的指针传递到自己的时钟域下进行同步
二进制的读写指针通常超过了1bit,而多比特信号是不能直接使用同步器的,因此这里使用格雷码进行传输
所以在传输读写指针之前,需要先将二进制转化为格雷码,然后再传到对方的时钟域下,转化方法如下:
空满状态判断:
从下往上看
读空:读写指针相同,读指针追上了写指针,这种情况发生在复位操作或读指针读出FIFO中最后一个字时
写满:读写指针再次相同,写指针转了一圈(wrapped around),追上了读指针
区分:
使用格雷码进行空满判断:
如下图所示为二进制转化为格雷码后的编码图,其中0~7为真实的FIFO地址,8~15为指针多转一圈的地址
设计FIFO的深度:
关键:分清数据重载和轻载的情况,如果在重载时满足需求则轻载时也能胜任
注:X、Y为每Y个时钟周期有X个数据读出,也就是读的速率
关于如何计算FIFO深度,可以参考这个帖子:FPGA数字IC笔试面试009—异步/同步FIFO深度计算_牛客网 (nowcoder.com)
关于异步FIFO设计,可以参考这个帖子:IC学习笔记3——异步FIFO_异步fifo空满判断-CSDN博客,里面给出了详细的介绍和代码仿真