DCM逻辑:CMD路径
因为是写得快读得慢,写时钟周期比读周期大,所以在写满以后,下一个读周期上升沿就很快的得到读满信号。
异步FIFO跨时钟域问题,读写时钟不同,不能确定,写满信号和读空信号,采用的FIFO策略是,先写满,写的过程通过帧拉高,帧数据有效等来进入写的状态机,确定写的数量并缓存计数,确定写满。
写满信号到来之后,输出,接收读请求,进入读的状态机,读出有效计数等与写的缓存计数时,就可以判定读空了。
值得关注的一个信号是rd_control控制top层的模块读进程。
以下是verilog代码,因前端是UART通信协议,后端是项目自定义的8b/10b编码。
/*
UART信号接收完毕后,使用data_send需要数据连续,
策略是:cmd_check完成之后,所有数据将fifo全部写满之后,再进行连续的读出;
*/
module asyfifo_cmd(
input logic wrclk,
input logic rdclk,
input logic rst_n,
input logic wr_q,
input logic rd_q,
input logic [7:0] fifo_in,
input logic fifo_frame_h,//从cmd_check来的、拉高帧开始、拉低帧结束;
output logic [7:0] fifo_out,
output logic wrfull, //为1写满;
output logic rdempty, //为1读空;
output logic rd_control //为0读空;
);
//调用fifo核,不使用核的写满及读空;
asyfifo_8_128_cmd fifo_cmd(
//input
.data(fifo_in),
.rdclk(rdclk),
.rdreq(rd_q),
.wrclk(wrclk),
.wrreq(wr_q),
//output
.q(fifo_out),
.rdempty(), //为1读空;
.wrfull() //为1写满;
)