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

单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信号做异步处理,然后输出多比特数据。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gemengxia/article/details/108348892