1.电平检测
从慢时钟到快时钟
用触发器打两拍,降低亚稳态的影响。
限制条件:(data数据变化间隔)>(慢时钟域周期)+2*(快时钟域周期)+(路径延时)
确保所有数据的变化都能被采集到。
2.边沿检测
从慢时钟到快时钟
由慢时钟域到快时钟域的边沿同步电路结构相对简单。慢时钟域的脉冲信号在快时钟域来看就是电平信号。注意跨时钟域同步的时候输出的脉冲必须是寄存器信号,如果需要被同步的脉冲是通过组合逻辑产生的,那么在同步之前一定要在本时钟域下用寄存器抓一拍。比如,clka下通过计数器产生了脉冲信号pls_a = (cnt==4’d5),如果要将pls_a同步到另外一个时钟域,首先在clka下将pls_a打一拍,避免组合逻辑产生的毛刺,这一点是异步信号处理的基本原则。
如图3所示,pls_slow是来自慢时钟域的脉冲信号被同步到快时钟域clk_fast,在pls_slow经过2级DFF处理后的信号认为是稳定的,将该信号取反并和下一拍的信号作与逻辑,即可在clk_fast时钟域产生脉冲信号neg_b(下降沿脉冲检测),同理将该信号与下一拍的取反信号作与逻辑可产生pos_b(上升沿脉冲检测)。
下面展示一些 内联代码片
。
module plus_s2f(
input clka, //慢时钟
input clkb, //快时钟
input rstn,
input pls_a,
output pls_b
);
reg pls_b_1;
reg pls_b_2;
reg pls_b_3;
always@(posedge clkb)begin
if(!rstn) begin
pls_b_1 <= 1'b0;
pls_b_2 <= 1'b0;
pls_b_3 <= 1'b0;
end
else begin
pls_b_1 <= pls_a;
pls_b_2 <= pls_b_1;
pls_b_3 <= pls_b_2;
end
end
assign pls_b = pls_b_3 &(~pls_b_2);
endmodule
3.脉冲同步
从快时钟到慢时钟
基本功能:从某个时钟域取出一个单时钟宽度脉冲,然后在新的时钟域中建立另一个单时钟宽度脉冲。
step1: 由于快时钟的时钟频率比慢时钟高,慢时钟域采样快时钟的脉冲很可能会采不到。通过toggle电路将快时钟域前后间隔较多个周期的两个有效脉冲进行了有效的标定,形成图中toggle波形
step2: 在慢时钟域clk2通过同步电路将这个toggle信号进行同步,形成引脚A的波形XOR(A)
step3:通过触发器将同步电路输出信号再次经过一个触发器,使得B引脚的波形比A引脚的波形晚一个时钟周期,如图XOR(B)所示
step4:逻辑门对AB信号进行逻辑运算,得到了慢时钟域下两个有效的单周期脉冲output
module plus_syn(
input clka, //快时钟
input clkb, //慢时钟
input i_data,
output o_data
);
wire D_in;
wire Q_a1;
reg Q_a0 = 1'b0;
reg Q_b0 = 1'b0;
reg Q_b1 = 1'b0;
reg Q_b2 = 1'b0;
assign D_in = i_data?Q_a1 :Q_a0 ;
assign Q_a1 = ~Q_a0;
always@(posedge clka)begin
Q_a0 <= D_in;
end
always@(posedge clkb)begin
Q_b0 <= Q_a0 ;
Q_b1 <= Q_b0 ;
Q_b2 <= Q_b1 ;
end
assign o_data = Q_b2 ^ Q_b1;
endmodule
4.结绳法
从快时钟域到慢时钟域
**结绳法原理:**将快时钟的脉冲周期延长,等到慢时钟同步后再解绳
结绳的方式有两种:1.利用脉冲的边沿做时钟
2.利用脉冲电平做选择器选择信号
解绳的方式有两种:1.利用采集到的脉冲做异步复位信号
2.利用采集到的脉冲做握手响应信号
举例1:结绳、解绳均采用方式1:
利用数据的边沿作为时钟(可以将脉冲无限延长,直到可以采集到数据,然后复位,要考虑产生数据的频率)
将快时钟信号的脉冲周期延长,等到慢时钟同步采样后再“解绳”,还原为原来的脉冲周期宽度
2、功能分析
step1: 当数据有上升沿时,寄存器1的输出将会稳定在高电平,此时等待ClkB采样。
step2: clk的同步器完成采样后,寄存器4会输出高电平,该信号同时会反馈回第一个寄存器。
step3:若此时输入的数据Din_clkA为低电平,与反馈信号一同经过与门逻辑运算激活异步复位,开始下一次采样等待。
3、结绳法限制
在慢时钟采样快时钟域时,结绳法适合采样数据较少(即脉冲间隔较大>3CLKB)的控制信号;即等待3个clkB时钟后,完成复位,才允许下一个输入脉冲。
举例2:结绳、解绳均采用方式2:
要将快时钟域的脉冲信号同步到慢时钟域的信号常采用握手的机制实现,所以该电路又常被称为握手电路,其设计思路为:首先在慢时钟域下将快时钟域的脉冲转换为电平信号,然后把电平信号同步到快时钟域,同步完成后的信号要反馈回快时钟域,快时钟域接收到该信号后给控制信号,原来的电平信号被拉低。
module pls_f2s(
input clka, //快时钟
input clkb, //慢时钟
input rstn,
input pls_a, //快时钟脉冲
output pls_b //慢时钟脉冲
);
reg reg_pls_level;
reg reg_pls_a1;
reg reg_pls_a2;
reg reg_pls_b1;
reg reg_pls_b2;
reg reg_pls_b3;
always@(posedge clka)begin
if(!rstn)
reg_pls_level <= 1'b0;
else if(pls_a) //快时钟域下脉冲信号展宽
reg_pls_level <= 1'b1;
else if(reg_pls_a2) //握手信号
reg_pls_level <= 1'b0;
else
reg_pls_level <= reg_pls_level;
end
always@(posedge clkb)begin //慢时钟域下打拍
if(!rstn)begin
reg_pls_b1 <= 1'b0;
reg_pls_b2 <= 1'b0;
reg_pls_b3 <= 1'b0;
end
else begin
reg_pls_b1 <= reg_pls_level ;
reg_pls_b2 <= reg_pls_b1;
reg_pls_b3 <= reg_pls_b2;
end
end
always@(posedge clka)begin //快时钟域下打拍
if(!rstn)begin
reg_pls_a1 <= 1'b0;
reg_pls_a2 <= 1'b0;
end
else begin
reg_pls_a1 <= reg_pls_b2;
reg_pls_a2 <= reg_pls_a1 ;
end
end
assign pls_b = reg_pls_b2 &(~reg_pls_b3); //边沿信号检测