FPGA知识点---跨时钟域处理

本文探讨了在不同时钟域间进行信号同步的方法,包括单bit信号的展宽及反馈机制,多bit信号的异步FIFO设计,以及通过握手协议实现数据传输的完整流程。介绍了如何解决时钟域交叉带来的数据采样问题。

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

单bit信号
慢时钟到快时钟,两级触发器同步。
快时钟到慢时钟,如果是下面第一个图,clkb可以采样到signal_a_in,但是如果只有单脉冲,如第二个图所示,怎不能确保采样到signal_a_in。
在这里插入图片描述
在这里插入图片描述
这个时候可以展宽signal_a_in,至少为clkb的一个时钟周期宽度。通常处理方法是使用反馈机制将输入信号展宽。

//在clka下,生成展宽信号signal_a
always @(posedge clka oe negedge rst_n) begin
	if(rst_n == 1'b0)
		signal_a <= 1'b0;
	else if(pulse_ina == 1'b1)
		signal_a <= 1'b1;
	else if(signal_a_r[1] == 1'b1)
		signal_a <= 1'b0;
	else
		signal_a <= signal_a;
end

//在clka下采集signal_b[1],生成signal_a_r[1]用于反馈拉低signal_a
always @(posedge clka or negedge rst_n) begin
	if(rst_n == 1'b0)
		signal_a_r <= 2'b00;
	else
		signal_a_r <= [signal_a_r[0],signal_b_r[1]];
end

多bit信号

  1. 采用异步FIFO,异步FIFO的设计见异步FIFO的设计
  2. 握手协议
    握手协议异步信号处理行为波形图大致如下所示
    在这里插入图片描述
    信号d_in所处时钟域是clk_in,且d_in只有1T的宽度,想要传送到clk_out时钟域(clk_out和clk_in不相关)

因为clk_out和clk_in相位关系不确定,时钟周期大小关系不确定,它无法保证一定能采样到d_in;

因此需要把d_in展宽,产生d_req信号;
d_req信号一直拉高,经过clk_out时钟域两级DFF同步器后,得到d_req_sync;
取d_req_sync上升沿1T,即可得到传送到clk_out时钟域的d_out。
此时,d_in从clk_in传送到ckk_out的任务就算是结束了。
但对于handshake电路来说,任务还没有结束,因为d_req一直是高电平。
因此,需要把d_req_sync信号再用两级DFF同步器,传回clk_in时钟域,得到d_ack信号;
当clk_in看到d_ack拉高后,就可以把d_req信号拉低,到这里一个handshake电路行为才算是结束了。

always @(posedge clk_in or negedge rst_n) begin
	if(rst_n ==1'b0)
		d_req <= 1'b0;
	else if(d_in == 1'b1)
		d_req <= 1'b1;
	else if(d_ack == 1'b1)
		d_req <= 1'b0;
end

此种方法要保证时钟周期要保证clka时钟域连续两个单周期脉冲信号的间隔要大于握手协议所需的延迟。
握手协议速度慢,相对于两级DFF占用更多的寄存器。
DMUX电路
将sel信号做异步处理,然后输出多比特数据。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值