异步FIFO跨时钟域,写的慢,读的快

本文探讨了在异步FIFO中,写操作比读操作慢的情况。当写满信号出现后,通过状态机控制读取过程,确保数据正确传输。在UART通信协议和8b/10b编码的背景下,使用Verilog实现关键逻辑,包括CMD路径和读写计数的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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写满;
	)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值