FPGA跨时钟域设计

1.前言

  一个FPGA设计通常包含多个时钟域,不同时钟域之间进行数据交互就涉及到跨时钟域。根据不同的传输情况,可以分为单bit跨时钟域和多bit跨时钟域。其中,单bit跨时钟域还可以分为快时钟域到慢时钟域和慢时钟域到快时钟域两种情况,多bit跨时钟域一般采用双端RAM或者异步FIFO进行处理。

2.单bit处理

  单bit跨时钟域传输的数据信号一般为使能或者标志信号,可以从两方面进行分析——快到慢和慢到快。
慢到快
慢时钟域到快时钟域的数据传输时一定可以被采集到的,但是可能会出现数据冗余(多次采集)的情况,如图所示。
在这里插入图片描述
原本在B时钟域只需要一个周期的信号,现在保持了4个B时钟。解决办法是:打两拍(防止亚稳态)+边沿检测(防止数据冗余)

reg d0,d1,d2;	//打拍寄存器
reg flag;	//边沿检测标志(DB)


always @(posedge clkb or negedge rst_n)
	if(!rst_n)begin
		d0 <= 'b0;
		d1 <= 'b0;
		d2 <= 'b0;
	end
	else begin
		d0 <= DB;
		d1 <= d0;
		d2 <= d1;
	end
		
assign flag = (~d1 & d2);

快到慢
  快时钟域的数据到慢时钟域有可能发生数据漏采的情况,主要原因是快时钟域的数据保持时间短,如下图所示。

在这里插入图片描述
很自然的可以想到,解决这种问题的办法就是将快时钟域的信号进行展宽处理,以使慢时钟信号可以采集到。最简单粗暴的方法就是在快时钟域设置一标志,拉高表示单bit信号到来。

reg flag;	//展宽信号标志


always @(posedge clka or negedge rst_n)
	if(!rst_n)
		flag <= 'b0;
	else if(DA)
		flag <= 1'b1;

然后,慢时钟域对信号flag进行打拍和边沿检测。

3.多bit处理

多bit数据跨时钟域传输一般采用异步FIFO处理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值