零、前言
关于同步FIFO如何设计请参考之前的一篇文章:手写同步FIFO。
关于异步FIFO如何设计请参考之前的一篇文章:手写异步FIFO。
一、如何设计depth不是2的幂次的异步FIFO?如果FIFO的深度不是2的幂次,那么格雷码其实是不连续的,也即在最大值跳变到最小值时不止一个bit发生了变化。当然你也可以设计一个深度略大的,并且是2的幂次的FIFO,但是这样其实是浪费资源的。
例如我们需要一个深度为5的FIFO,此时我们可以设计一个深度为8的FIFO,但是这样会浪费资源。那么我们应该怎么办呢?
其实我们可以换一个思路,通过观察下表不难发现,格雷码具有对称性。0-15这16个格雷码,如果前后去掉相同个数的格雷码,那么剩余的格雷码仍然符合相邻两个数只有1 bit的跳变,也包括最后一个到第一个的跳变。 例如,如果要设计深度为5的FIFO,由于需要5*2 = 10个格雷码&