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
- Gray码在异步FIFO中的应用
- 格雷码在异步FIFO中的应用(转)
- 异步FIFO在系统中的使用
- 格雷码在异步FIFO中的使用
- fifo在FPGA中的应用小结
- Gray码及其应用
- Verilog基础知识11(异步FIFO为什么使用格雷码(gray-code) )
- 异步FIFO
- 异步FIFO及verilog原码_1
- 异步FIFO及verilog原码_2
- 同步FIFO和异步FIFO
- 异步FIFO中的几个难点问题思考与解释
- Visual C++在异步串行通信控制中的应用
- iOS开发笔记--异步加载图片在TableView中的应用
- iOS开发笔记--异步加载图片在TableView中的应用
- springBoot事件监听 在项目实际业务中的异步应用
- 线程与异步在监控系统中的应用
- celery异步执行任务在Django中的应用实例
- C++和C#中的class和struct区别
- [C++] [算法] [Linux] radix tree
- 在Linux下不重启让配置文件修改后立即生效
- 双向链表的操作
- 微信小观
- Gray码在异步FIFO中的应用
- 多进程间通信方式和多线程同步机制总结
- poj里java的一些常用的语法(转自博客http://www.blogjava.net/DreamAngel/archive/2009/10/18/298731.html)
- HDOJ 1011 Starship Troopers(树形DP)
- Linux之守护进程理解(2)
- java中的IO整理
- 扑腾的小鸟-你是猴子搬来的救兵吗?
- MyEclipse添加xml文件自动提示
- 手把手图文教你eclipse下如何配置tomcat