DCM逻辑:DATA路径
因为是写得快读得慢,写时钟周期比读周期小,所以在写满以后,等待下一个读周期上升沿就得到读满信号;
异步FIFO跨时钟域问题,读写时钟不同,不能确定,写满信号和读空信号,采用的FIFO策略是,先写满,写的过程通过帧拉高,帧数据有效等来进入写的状态机,确定写的数量并缓存计数,确定写满。
写满信号到来之后,输出,接收读请求,进入读的状态机,读出有效计数等与写的缓存计数时,就可以判定读空了;
值得关注的一个信号是rd_control控制top层的模块读进程,并且因为跨时钟域的原因,需要等待读出的时钟上升沿,所以这个为了避免这个等待出现误判,即信号拉高一直持续到写状态机;
以下是verilog代码,因前端是项目自定义的8位数据后端是UART通信协议;
/*
异步FIFO控制,二进制码转为格雷码;
格雷码判空:直接判断读写地址是否相同;
格雷码判满:最高位不同,次高位也不同,其余位必须相同,
所以需要将信号高两位反抓,其余位不变;
格雷码最高位和次高位为空满标志位,满:读写地址最高位和次高位相反,空:读写地址的最高位与次高位相同;
采用格雷码可以降低亚稳态的发生概率;
读时钟采用0.1536MHZ(uart_clk),写时钟采用81.92MHz,写得快,读得慢;
*/
//fifo 策略改变,106个上行Byte写完,之后再读,不使用格雷码;
module asyfifo_da