1. 同步FIFO
1.1 设计要求
设计一个深度为512,位宽是10bit的同步FIFO
输入端口:CLK,RSTN, RD_EN, WRT_EN, DATA_WRT[9:0]
输出端口:FULL, EMPTY, DATA_ED[9:0]
fifo其实就是基于ram做的一些扩展,区别一:顺序读写,区别二:防止ram写满溢出以及读空。
1.2 补充
1.3 设计代码
顶层fifo:
调用的ram模块
2. 异步FIFO
2.1 跨时钟域问题
design在两个时钟域下工作,会有两个问题:
1. 静态时序分析工具不能起作用;2.电路会存在亚稳态。
对于单bit异步信号:当异步信号来临时(异步信号发生变化),如果触发器B采样的DATA不满足建立时间,就会出现亚稳态,导致触发器B在Q端输出的值可能是1,也可能是2,而触发器B的Q端会连接其他触发器,那么其他触发器拿到的值就会不一样,这样是有问题的。
2.2 跨时钟域-解决办法1:两级同步
1. 慢时钟域传到快时钟域可以采用触发器挡两拍的方式防止x的传播(但必须保证异步信号CLKA是一个慢时钟)
2. 局限:不能处理多bit同时变化的情况
2.3 跨时钟域-解决办法2:握手协议
1. 握手协议(等待数据稳定再采数据,可以解决任意时钟频率的问题,但是效率较低)
2. 可以处理任意bit位宽,效率较低,发送方必须接到AWK信号后才能发送下一个数据。
2.4 跨时钟域-解决办法3:异步FIFO
异步FIFO:可以处理任意位宽,效率较高。适用于有连续跨时钟域数据的传递。
格雷码:与普通的二进制编码相比,格雷码在递增或递减的过程中只会出现一位数码的变换。有效解决异步FIFO中的多bit异步信号问题。
2.5 异步FIFO
2.5.1 设计要求:设计一个深度为512,位宽是10bit的异步FIFO
输入端口:CLK_W,CLK_R,RSTN, RD_EN, WRT_EN, DATA_WRT[9:0]
输出端口:FULL, EMPTY, DATA_ED[9:0]
异步FIFO和同步FIFO的设计类似,只是多了格雷码的转换和两级同步。
2.5.2 设计代码:
顶层fifo_512x10模块
调用的ram模块