赞
踩
相关文章
数字IC前端专栏https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482
当一个触发器的输入信号不满足建立时间(setup time)和保持时间(hold time)时,输出会处于亚稳态,即输出即不是1也不是0,处于一个不确定值,当亚稳态输出作为其他逻辑门的输入时,可能会导致亚稳态的连锁传递,因此必须使用一些方法组织触发器进入亚稳态。
在只有一个时钟的数字系统中(称为单时钟域数字系统),通过控制两个触发器之间的组合逻辑电路的延迟,可以确保建立时间和保持时间满足时序要求。但当一个时钟域触发器的输出作为另一个时钟域触发器的输入时,两个时钟没有任何关联,这时的亚稳态需要其他方法来避免。
图1给出了解决这个问题的一种方法,即在CLK_B时钟域的输出最后插入两个级联的D触发器。此时,输出Q_BS1的输出可能会出现亚稳态,但当下个时钟沿来临前,亚稳态会稳定下来,这时Q_BS2就大概率不会出现亚稳态。但当CLK_B时钟很快时,Q_BS2依旧可能出现亚稳态,此时可以考虑增加级联的D触发器数量。实际应用中,多使用两级触发器打拍即可。
图1 亚稳态示意图
当信号同步时,需要遵循以下几条规则。
1、跨时钟域的信号必须直接来自源时钟域的寄存器输出。如果信号来自组合逻辑,而不是直接来自触发器,可能会造成竞争与冒险,图2给出了一个例子。在开始时,与门的两个输入是1和0,输出c为0,当a从0变1,同时b从1变0时,最终输出c仍然是0,但a和b可能在短暂的时间都处于1状态,造成了输出c在一段时间内错误的为1,如果恰好CLK_B上升沿出现在此时,那么毛刺信号1将传递到后级,使得d和e出现了一个有一定宽度的错误信号,这是我们不希望看到的。如果使用CLK_A时钟域的寄存器插入到与门后,那么c上的毛刺就不会出现,从而不影响电路正常工作。
图2 来自组合逻辑的异步信号
2、使用逻辑单元库中的专用触发器实现同步器。这里说的专用触发器具有高驱动能力和高增益(),这会使他们能更快进入稳定状态,所以使用他们能加快电路摆脱亚稳态的速度。
3、一个输出信号,避免使用多个同步装置进行同步。这句话的意思是,不能使用多个同步装置将一个信号同步到另一个时钟域的多个点,因为同步装置会导致信号延迟1到2个周期,如果有多个同步装置,那么结果可能会出现不一致(即使最终的结果是一致的),会导致下游系统出错。
4、多位输出信号,避免使用多个同步装置分别同步。我们这篇文章讨论的,都是单比特信号,多为控制信号,当有多比特信号需要同步时,我们不能使用本文的方法,原因同上,多位结果可能会出现不稳定的组合情况,可能会导致出错(这里也可以通过使用格雷码编码避免,因为格雷码每次只改变一位)。那么多位Bit信号如何同步?我们可以利用异步FIFO,或者握手协议等其他方式同步。
根据两个频率域时钟速度的相对快慢,我们把单比特信号的同步分为下面的几种情况,对于这几种情况,需要采用不同方法来进行同步。
对于电平单比特信号(即持续多个周期的信号),直接使用图1所示两级同步器将慢时钟域的电平信号同步至快时钟域即可。
在这种情况下,可能会出现的问题是:异步脉冲信号在自己的慢时钟域中只是持续一个时钟周期的脉冲信号,但在快时钟域却被采样了多次,这可能会导致目标时钟域误以为有多个脉冲信号。
这里采用的方法为在两级同步器后再加一个D触发器,然后利用第三个触发器的输出和第二个同步器的输出译码出一个周期的脉冲,如下代码所示。
- input sig_a;
- input clkb;
- input rstb;
-
- reg sig_a_d1,sig_a_d2,sig_a_d3;
- wire sig_a_posedge;
-
- assign sig_a_posedge=sig_a_d2&!sig_a_d3;
-
- always@(posedge clkb,negedge rstb)
- begin
- if(!rstb)
- begin
- sig_a_d1<=1'b0;
- sig_a_d2<=1'b0;
- sig_a_d3<=1'b0;
- end
- else
- begin
- sig_a_d1<=sig_a;
- sig_a_d2<=sig_a_d1;
- sig_a_d3<=sig_a_d2;
- end
- end
对于电平单比特信号(即持续多个周期的信号),直接使用图1所示两级同步器将快时钟域的电平信号同步至慢时钟域即可(这需要保证快时钟域的电平信号对于慢时钟域也是一个电平信号)。
用慢时钟同步快时钟域下的异步脉冲信号可能会出现的问题是:在慢时钟到来之前,快时钟的脉冲信号已经失效,这样就丢失了控制信号,显然造成了功能错误,信号波形如图3所示。对于这个问题,常见的是使用握手机制。
图3 快时钟到慢时钟域下的单比特脉冲信号同步失败
我们通过握手机制,人为锁存快时钟域的脉冲信号,然后通过两级同步器穿越边界,在慢时钟域采样到信号,再通过两级同步器反馈给快时钟域,接着快时钟域释放当前被锁存的信号,这时就可以响应下一个控制信号,如图4所示。
图4 使用握手机制同步脉冲信号
其中,脉冲信号为adat,左下角是一个可以根据反馈信号abdat2锁存adat的触发器,锁存后的信号为adat1,随后这个信号通过两级同步器进入慢时钟域,使用慢到快脉冲信号相同的方法,译码出一个脉冲信号,同时将反馈信号同步回快时钟域,表示信号已收到,可以取消快时钟域的锁存信号了,并等待下一个adat脉冲信号的到来。
下面是左下角锁存器的Verilog描述。
- module adapt_gen(input aclk,rest_b,adat,abdat2,output reg adat1);
- always@(posedge clk,negedge rest_b)
- if(!reset_b)
- adat1<=1'b0;
- else if(abdat2)
- adat1<=1'b0;
- else if(adat)
- adat1<=1'b1;
- endmodule
这种方法不能解决快时钟域信号在两个慢时钟域信号间多次翻转的问题。握手机制默认了这种情况不存在,也就是说,在设计时,必须保证快时钟域两个有效信号间的最小时间限制。这个最小值是反馈回路的延迟和第一个同步器恢复无效状态的时间之和。
我们还可以将快时钟域脉冲信号连接到一个D触发器的时钟端,而输入端连接至高电平,然后通过两级同步器连接至慢时钟域,慢时钟域收到信号后给出反馈信号,复位D触发器和第一个同步器,如图5所示。
图5 另一种握手机制
当异步信号有效沿来临时,D触发器的输出q1被置为1,此时q1可能不满足第一个同步器的建立时间要求,导致q2出现亚稳态,但在Synch_out端,亚稳态不会出现(同步装置的原理),输出被反馈回到复位端,与输入信号的低电平一起复位前两个触发器,这样使得输出信号的宽度为一个慢时钟域时钟周期(脉冲信号)。
以上内容来源于《Verilog高级数字系统设计技术和实例分析》、《SOC设计方法与实现》和《Verilog HDL高级数字设计》,有删改
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。