Gray码在异步FIFO中的应用

来源:互联网 发布:php求和字符串函数 编辑:程序博客网 时间:2024/05/20 05:56

 在异步FIFO中,写操作和读操作工作在不同的时钟域,需要跨时钟域来传递FIFO的空满状态信息。一般是通过传递读写的地址来实现空满状态控制的。写地址减去读地址(如果写地址小于读地址,则写地址先加上FIFO深度再减去读地址),即为FIFO中存放的数据个数,由此产生FIFO的空满判断。不管是读地址还是写地址,每次变化都是加1,溢出后从0开始重新累加。当写地址跨越时钟域到达读操作一侧时,需要用读时钟去采样由写时钟产生的数据(即写地址)。由于是异步操作,有可能会出现竞争和冒险,采样过程不满足建立保持时间,导致亚稳态。写地址变化的位越多,出现亚稳态的位就越多,用读时钟采样时出错的概率越高。同理,当读地址跨越时钟域到达写操作侧时,读地址变化的位越多,写时钟采样时出错的概率越高。因为,必须采用有效的编码,降低读写地址在连续变化时的位翻转率。采用格雷码就能有效的降低连续变化数值的位翻转率。所以,可以在将地址跨越时钟域之前,先转换成格雷码,然后跨越时钟域。到达另一时钟域后,通过两级寄存器消除亚稳态,再将格雷码转换成二进制数。这样,每次地址变化,跨越时钟域时只有一位可能出错,可以大幅降低出错概率,提高FIFO运行的可靠性。

下面附上格雷码和二进制码的转换程序

module BinToGray(input clk              ,input rst              ,input [3:0]bin_in      ,output reg [3:0]gray_out    );always@(bin_in ) begingray_out <= {1'b0,bin_in[3:1]}^bin_in;endendmodule
module GrayToBin(input clk             ,input rst_n          ,input [3:0]gray_in    ,output reg [3:0]bin_out    );always@(gray_in) beginbin_out[3] = gray_in[3];bin_out[2] = gray_in[2]^bin_out[3];bin_out[1] = gray_in[1]^bin_out[2];bin_out[0] = gray_in[0]^bin_out[1];endendmodule




0 0
原创粉丝点击