(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博客,里面给出了详细的介绍和代码仿真

 

posted @ 2024-06-06 20:35  xuxuxu69  阅读(88)  评论(0编辑  收藏  举报