亚稳态与异步信号处理

数字IC 专栏收录该内容
11 篇文章 0 订阅

一、亚稳态

        寄存器的 D 端信号需要满足建立时间 Tsu 和保持时间 Th 要求,否则就会出现 Q 端采样到不确定的值的状态,就是俗称的亚稳态。亚稳态是一个不稳定的状态,这个状态可能会很快迁移到逻辑 1 或者逻辑 0 的状态。如下图所示:绿色表示亚稳态。

       产生亚稳态的原因:寄存器采样需要满足一定的建立时间(setup)和保持时间(holdup),而异步电路没有办法保证建立时间(setup)和保持时间(holdup),所以会出现亚稳态。

      解决方法:

        (1)降低系统时钟频率,可以减少亚稳态发生的概率。

        (2)用反应更快的FF

        (3)引入同步机制,防止亚稳态传播。(打拍、FIFO、握手信号、复位采用异步复位同步释放)

        (4)改善时钟质量,用边沿变化快速的时钟信号。

二、异步信号处理

异步电路设计的目的就是解决亚稳态问题,一般方法有:

(1)单bit信号:直接多级寄存器同步法,一般采用 2-3 级寄存器进行同步处理,这个 2-3 级寄存器也称作同步器,在 ASIC 设计中,一般都有提供专用的同步器库,因为同步器要求多级寄存器位置靠的越近越好,靠的越近,亚稳态消失的概率就越大。FPGA 设计中,直接使用 2-3 级寄存器进行同步处理即可。

        针对单 bit 信号,可以再细分为慢时钟信号同步到快时钟和快时钟信号同步到慢时钟两个情况。信号在慢时钟到快时钟域传递,且两个时钟相差比较大时,慢时钟的脉冲可以被快时钟当做电平,使用多级寄存器同步后,在采用边沿检测电路即可得到相应的脉冲信号。信号在快时钟到慢时钟域传递,即使使用同步器同步,也很可能采样不到快时钟信号,所以此时需要先对快时钟信号进行展宽处理(就是同一个信号先在快时钟进行多次寄存,然后将多个打拍延迟不同的信号或起来),然后再进行慢时钟同步。

(2)多 bit 信号:异步 FIFO 或者使用多次握手同步方法。在握手协议中,异步的 REQ/ACK 也需要使用单 bit 同步技术进行同步处理,异步 FIFO 也是如此。

单bit信号从快时钟到慢时钟:

          根据简介介绍的单 bit 信号从快时钟切换到慢时钟,我们需要先对这个信号进行展宽处理,然
后再进行同步处理。
        我们假定有两个时钟,CLK1 和 CLK2,还有一个信号叫 READ,CLK1 时钟频率快于 CLK2,READ 信号是 CLK1 时钟产生的,READ_DLY1 信号是 READ 信号相对于 CLK1 时钟打一拍产生的,READ_DLY2 信号是 READ 信号相对于 CLK1 时钟打两拍产生的,由于单纯的 READ 信号宽度根本不够 CLK2 采样,所以需要展宽 READ 的信号宽度, READ_OR 信号是由 READ 和 READ_DLY1 以及 READ_DLY2 相或产生的。或之后 READ_OR 信号宽度以及够 CLK2 采样。同步原理如下,直接使用 CLK2 采样 READ_OR 信号得到 READ_ SYNC,然后再对 READ_SYNC 打 2 拍,第一拍得到 READ_ SYNC_DLY1,第二拍得到 READ _SYNC_DLY2,然后 READ_ SYNC_DLY1 和 READ_OR_SYNC_DLY2 的取反信号相与得到 READ_SYNC_PULSE,即已经同步到 CLK2 时钟域的 READ 信号上升沿指示信号。
        对 READ_SYNC 打 2 拍目的是消除亚稳态,打两拍之后的亚稳态概率已经非常非常小了,由于有电路噪声,所以寄存器会恢复到固定电平。我们画出如下的时序图。

 代码如下:

module asyn_process (
 input clk1 , //快时钟信号
input read , //信号,快时钟阈的
input clk2 , //慢时钟信号
 input sys_rst_n , //复位信号,低电平有效
output wire read_sync_pulse //输出信号
);
 //wire define

//reg define
reg read_dly1 ;
reg read_dly2 ;

reg read_or ;

reg read_sync ;
reg read_sync_dly1 ;
 reg read_sync_dly2 ;
//*****************************************************
//** main code
//*****************************************************
always @(posedge clk1 or negedge sys_rst_n) begin
if (sys_rst_n ==1'b0)
read_dly1 <= 1'b0;
else
read_dly1 <=read;
end

always @(posedge clk1 or negedge sys_rst_n) begin
 if (sys_rst_n ==1'b0)
read_dly2 <= 1'b0;
else
 read_dly2 <= read_dly1 ;
end

always @(posedge clk1 or negedge sys_rst_n) begin
if (sys_rst_n ==1'b0)
read_or <= 1'b0;
else
read_or <= read | read_dly1 | read_dly2;
end

always @(posedge clk2 or negedge sys_rst_n) begin
if (sys_rst_n ==1'b0) begin
 read_sync <= 1'b0;
end
else
read_sync <= read_or;
end

always @(posedge clk2 or negedge sys_rst_n) begin
 if (sys_rst_n ==1'b0)
read_sync_dly1 <= 1'b0;
else

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

交芯

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值