非2幂次异步asyncFIFO的指针转grayCode

grayCode做afifo的地址指针,有两个作用:

1.利用grayCode相邻两个数只有1bit变化,作为跨异步

2.用最高bit来表示地址wrap,可以产生空满信号,其中w/rpt_bin[msb]==w/rpt_gray[msb]

以4深度afifo为例,我们需要2bit的waddr/raddr和3bit的wpt_bin/rpt_bin,wpt_gray/rpt_gray

fifo_empty=(wpt_bin_sync[2:0] == rpt_bin[2:0])

fifo_full     = (wpt_bin[2]!=rpt_bin_sync[2] && wpt_bin[1:0] == rpt_bin_sync[1:0])

编号w/rpt_binw/rpt_gray
03'b0003'b000
13'b0013'b001
23'b0103'b011
33'b0113'b010
43'b1003'b110
53'b1013'b111
63'b1103'b101
73'b1113'b100

现在afifo深度为3,在地址从2跳到0的时候,地址发生wrap,如果w/rpt_bin继续记到3'b011,那么w/rpt_bin[2]没有翻转,不能表示这个wrap。后面在生成full或者empty就会出错。

我们仔细观察w/rpt_gray[2:0]的低两bit 发现上一半和下一半是镜像对称的。那么我们可以在w/rpt_bin[2:0]=3'b010-->w/rpt_bin[1:0]=3'b011的过程中,直接把w/rpt_gray[2:0]=3'b011跳到

w/rpt_gray[2:0]=3'b111,对应w/rpt_bin[2:0]=3'b010-->w/rpt_bin[1:0]=3'b101,人为增加了w/rpt_bin[2]的一次跳变。因为镜像对称的原因,此时从w/rpt_bin[2:0]=3'b101的位置到3'b111正好有fifo深度个地址,当下一次w/rpt_bin[2]发生跳变时,正好对应w/raddr的wrap。用图表示如下:

编号w/raddrw/rpt_binw/rpt_gray
003'b0003'b000
113'b0013'b001
223'b0103'b011
3NA3'b0113'b010
4NA3'b1003'b110
503'b1013'b111
613'b1103'b101
723'b1113'b100

总结一般性的规律,首先grayCode的低bit镜像对称是都满足的。设afifo深度为FIFO_DEPTH,对应的w/raddr的地址位宽为

ADDR_WID=ceil(log2(FIFO_DEPTH)),

ADDR_WID能表示的最大深度与FIFO_DEPTH深度差

DIFF_DEP=2^ADDR_WID - FIFO_DEPTH

那么当w/rpt_bin=FIFO_DEPTH-1时,下拍直接跳过2*DIFF_DEP即可,跳完之后的值为

PNT_HOP_VAL=FIFO_DEPTH+2*DIFF_DEP

assign w/rpt_bin_d = (w/rpt_bin_q == FIFO_DEPTH-1) ? PNT_HOP_VAL : (w/rpt_bin_q + 1'd1);

 其中_d信号表示w/rpt_bin reg的输入;_q信号表示w/rpt_bin reg的输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值