关于异步FIFO的详细设计参考《【校招Verilog进阶挑战】 跨时钟域传输篇:VL21 异步FIFO》
Q1:异步FIFO地址不用格雷码会影响FIFO功能吗?如果地址用正常二进制编码会有什么影响?
- A1:不用格雷码而用正常二进制正常编码,地址跨时钟域同步出错的话会导致空满判断错误,但不会影响FIFO的正常功能。即使格雷码出错也不会影响功能,最多会导致假空或者假满,但是数据不会丢失!
Q2:设计的时候读写指针用了至少两级寄存器同步,同步会消耗至少两个时钟周期,势必会使得判断空或满有所延迟,这会不会导致设计出错呢?
- A2:异步FIFO通过比较读写指针进行满空判断,但是读写指针属于不同的时钟域,所以在比较之前需要先将读写指针进行同步处理。将写指针同步到读时钟域再和读指针比较进行FIFO空状态判断,因为在同步写指针时需要时间,而在这个同步的时间内有可能还会写入新的数据,因此同步后的写指针一定是小于或者等于当前实际的写指针,所以此时判断FIFO为空不一定是真空,这样更加保守,一共不会出现空读的情况,虽然会影响FIFO的性能,但是并不会出错。同理将读指针同步到写时钟域再和写指针比较进行FIFO满状态判断**,同步后的读指针一定是小于或者等于当前的读指针**,所以此时判断FIFO为满不一定是真满,这样更保守,这样可以保证FIFO的特性:FIFO空之后不能继续读取,FIFO满之后不能继续写入。总结来说异步逻辑转到同步逻辑不可避免需要额外的时钟开销,这会导致满空趋于保守,但是保守并不等于错误,这么写会稍微有性能损失,但是不会出错。: