IC基础(九):单bit跨时钟域同步

在IC基础(三):跨时钟域处理——电平同步器中介绍了点评同步器,但是其在由快时钟域向慢时钟域传输的时候clk_b有可能采样不到clk_a传输过来的信号。

自己看过不少的书,其中对跨时钟域的处理讲的不是很明白,因此抱着试一试的心态在eetop上搜索了跨时钟域。直到看到大神“杰克淡定”讲的单比特跨时钟域处理的帖子才有所感悟。在此表示感谢。地址在这,建议大家亲自过去看看,讲的真好,还有各位网友的回复,为啥不去呢;http://bbs.eetop.cn/forum.php?mod=viewthread&tid=605419&highlight=verilog基本电路设计&mobile=2

博主“杰克淡定”主要也是介绍了两种情况,一种是针对电平信号的,一种是针对脉冲信号的。针对电平信号采用的是两级DFF进行同步,也是很常见的。这种方法我在IC设计基础(三)中也介绍了。“杰克淡定”在讲脉冲信号的同步讲的很精彩也很详细。下面摘抄其中一段讲述原理的。

“下面是更常见的,clka下的脉冲信号,同步到clkb时钟域下,它对clka与clkb的时钟频率关系没有任何限制,快到慢,慢到快都没有问题。其主要的原理就是先把脉冲信号在clka下展宽,变成电平信号,再向clkb传递,当确认clkb已经“看见”信号同步同步夺取之后,再清掉clka下的电平信号。脉冲信号同步处理电路,有两个地方使用了上面的电平信号同步处理原则,请仔细揣摩原因。详见下面的RTL,其中省略了信号定义声明”

代码如下:

module	sync_pulse(
	//input	
	input	rst_n,//system reset
	input	clka,//clockA
	input	clkb,//clockB
	input	puls_a_in,//pulse input	from clka
	//output
	output	puls_b_out,//pulse ouput  in clkb
	output	levl_b_out //level output in clkb
	);

parameter	DLY = 1;
reg		signal_a;
reg		signal_b;
reg		signal_b_b1;
reg		signal_b_b2;
reg		signal_b1_a1;
reg		signal_b1_a2;

//将脉冲信号展宽
always@(posedge clka or rst_n) begin
	if(rst_n==1'b0)
		signal_a <=#DLY 1'b0;
	else if(puls_a_in)
		signal_a <=#DLY 1'b1;
	else if(signal_b1_a2)
		signal_a <= #DLY 1'b0;
	else
		signal_a <= #DLY signal_a;
end

// 将展宽的信号同步到clkb
always@(posedge clkb or negedge rst_n) begin
	if(rst_n==1'b0)
		signal_b<=#DLY1'b0;
	else
		signal_b<=#DLY signal_a;
end

//两级同步
always@(posedge clkb or negedge rst_n) begin
	if(rst_n==1'b0)begin
		signal_b_b1<=#DLY 1'b0;
		signal_b_b2<=#DLY 1'b0;
	end
	else begin
		signal_b_b1 <= #DLY signal_b;
		signal_b_b2 <= #DLY signal_b_b1;
	end
end

//在clka下采集signal_b1_a2,生成signal_b1_a2用于反馈拉低signal_a
always@(posedge clka or negedge rst_n) begin
	if(rst_n ==1'b0)begin
		signal_b1_a1 <= #DLY 1'b0;
		signal_b1_a2 <= #DLY 1'b0;
	end
	else begin
		signal_b1_a1 <= #DLY signal_b1_b1 ;
		signal_b1_a2 <= #DLY signal_b1_a1 ;
	end
end

assign puls_b_out = signal_b_b1&(~signal_b_b2);
assign	levl_b_out = signal_b_b1;//这里其实也可以用signal_b_b2,只是会晚一个周期,但是比signal_b_b1更好。

endmodule

其实我觉得这个代码也是可以用于电平信号的,因为你将一个电平信号看作一个脉冲信号也可以啊,只是在展宽的时候会将电平信号当作脉冲信号展宽而已。

仿真波形:

由慢到快,单脉冲:
IC基础(九):单bit跨时钟域同步_第1张图片
由慢到快,电平信号:

IC基础(九):单bit跨时钟域同步_第2张图片
由快到慢,电平信号:
IC基础(九):单bit跨时钟域同步_第3张图片
由快到慢,脉冲信号:
IC基础(九):单bit跨时钟域同步_第4张图片

你可能感兴趣的:(IC设计基础,IC设计基础)