同步与异步电路信号交互的问题

电子说

1.3w人已加入

描述

 

1.同步电路设计

2.全异步电路设计

3.异步信号与同步电路交互的问题及其解决方法

4.SoC设计中的时钟规划策略

1.同步电路设计

同步电路,即电路中的所有受时钟控制的单元,如触发器(Flip Flop)或寄存器(Register),全部由一个统一的全局时钟控制。

电路设计

同步电路的时序收敛

电路设计触发器的建立时间和保持时间

同步电路设计的优点

在同步设计中,EDA工具可以保证电路系统的时序收敛,有效避免了电路设计中竞争冒险现象

由于触发器只有在时钟边缘才改变取值,很大限度地减少了整个电路受毛刺和噪声影响的可能

同步电路设计的缺点

时钟偏斜(Clock Skew)

时钟树综合,需要加入大量的延迟单元,使得电路的面积和功耗大大增加

时钟抖动(Clock Jitter)

电路设计时钟偏斜

2.全异步电路设计

全异步设计跟同步设计最大的不同就是它的电路中的数据传输可以在任何时候发生,电路中没有一个全局的或局部的控制时钟。

电路设计

异步电路设计的基本原理

电路设计自定时的流水线数据通路

握手协议

电路设计握手协议原理

异步电路设计的优点

模块化特性突出

对信号的延迟不敏感

没有时钟偏斜问题

有潜在的高性能特性

好的电磁兼容性

具有低功耗的特性异步电路设计的缺点

设计复杂

缺少相应的EDA工具的支持

在大规模集成电路设计中应避免采用异步电路设计

3.异步信号与同步电路交互的问题及其解决方法

3.1亚稳态现象

电路设计亚稳态示意图 电路设计亚稳态信号的传播

亚稳态问题的解决及其RTL实现

电路设计亚稳态现象的解决方法

module  synchronizer (   
              bclk,            //目的时钟,与aclk异步的时钟
              reset_b,         //全局异步复位信号
              adat,            //异步输入信号,工作在aclk
              bdat,            //同步器输出
         );
input     bclk;
input     reset_b;
input     adapt;
output    bdat;
wire     bdat;
reg      bdat1;
reg      bdat2;
always @ (posedge bclk or negedge reset_b)
if (reset_b)
    {bdat2,bdat1} <= 2 ' b0;
else
    {bdat2,bdat1} <= {bdat1,adat};
assign bdat = bdat2;
endmodule

 

3.2快时钟同步慢时钟域下的异步控制信号

电路设计快时钟同步慢时钟信号示意图

module  synchronizer (
                      clk_fst,
                      reset_b,
                      rd_en,
                      rd_en_s2f
               );
    input      clk_fst, reset_b, rd_en
    output     rd_en_s2f;      
    wire      rd_en_s2f;      
    reg       rd_en_s2f1, rd_en_s2f2, rd_en_s2f3
always @ (posedge clk_fst or negedge reset_b)  
    if (!reset_b)                                  
       {rd_en_s2f3,rd_en_s2f2,rd_en_s2f1} <= 3'b111;
    else
       {rd_en_s2f3,rd_en_s2f2,rd_en_s2f1}<={rd_en_s2f2,rd_en_s2f1,rd_en};
always @ (rd_en_s2f3  or  rd_en_s2f2)
    case ({rd_en_s2f3,rd_en_s2f2})
            2'b01:
                rd_en_s2f <= 1'b1;        
            default:
                rd_en_s2f <= 1'b0;
     endcase


 

3.3慢时钟同步快时钟域下的异步控制信号

电路设计慢时钟同步快时钟信号示意图

解决办法 : 握手机制实现方法一

电路设计

module adapt_gen (
                 aclk,       //快时钟
                 reset_b,    //系统复位信号
                 adat,       //原始控制信号
                 abdat2,     //从慢时钟域反馈回来的同步控制信号
                 adat1       //经过保持后的信号输出
       );
    input aclk, reset_b, adat, abdat2;
    output adat1;
    reg adat1;
    always @ (posedge aclk or negedge reset_b)
    if (!reset_b)
          adat1 <= 1'b0;    
    else if (abdat2)
          adat1 <= 1'b0;
    else if (adat)
          adat1 <= 1'b1;
endmoudule 

 

解决办法 : 握手机制实现方法二

电路设计电路设计

module stall_logic (
                rd_en,
                rd_en_
                ack_s2f,
                stall_b
        );
inputrd_en;
input rd_en_ack_s2f;
output stall_b;      
wire  stall_b;      
always @ (rd_en or rd_en_ack_s2f)
if (rd_en_ack_s2f)
    stall_b <= 1'b1;
else if (rd_en)
    stall_b <= 1'b0;
else
    stall_b <= 1'b1;
endmodule


 

3.4异步时钟域的数据同步

握手机制

电路设计握手同步异步数据

先入先出队列(FIFO)

电路设计FIFO结构图 电路设计FIFO空满示意图

同步异步时钟FIFO的电路行为

待同步的数据时钟域会在其写信号的控制之下,将数据写入到FIFO中

目的时钟域在发现空标志位无效后,执行FIFO读动作,读出被异步时钟域写入FIFO的数据

如果只要同步一个数据,空标志位再次有效

如果需要同步多个数据,因为FIFO的读/写之间可以不受影响的进行,所以待同步

FIFO设计中的亚稳态问题

通常,通过比较读/写指针是否相等来判断FIFO是否为空。而因为读/写指针属于不同的时钟域,两者显然不能直接连到比较器的两端来产生空信号,否则会造成读FIFO的目的时钟域的电路碰到亚稳态现象.

解决办法

以格雷码编码表示读/写指针,用格雷码加法器来实现读/写地址的加一动作

用同步器将读指针同步到FIFO满标志的产生逻辑,同样用同步器将写指针同步到FIFO空标志的产生逻辑中

电路设计新的异步FIFO的结构框图

4.SoC设计中的时钟规划策略

首先尽可能使用同步设计:

对于同步电路,逻辑综合和时钟树综合等EDA工具能发挥更大的作用,可以用静态时序分析工具分析单时钟同步设计的时序收敛问题

可测性设计(DFT)的插入工作得到最大的简化

其次,注意同步电路设计的缺陷

噪声问题

时钟树上的功耗很大

如果必须采用不同的时钟,则要注意

后端设计的复杂化,如约束条件中要考虑多周期路径(Multi Cycle Path)

可测性设计更加复杂,因为此时系统中需要有多条独立的扫描链

越多的时钟域,发生亚稳态的概率就会越大

最后,设计规划中应注意以下几点:

尽可能将不同时钟域的数量减到越少越好

尽可能将异步交互电路归入同一或多个独立的模块,这样不但方便后端设计脚本的书写,也方便代码的阅读

尽可能避免使用电平触发器(Latch),因为静态时序分析会变得复杂,不能得到EDA工具很好的支持

尽可能减小时钟树的延时,因为这个延时可能会造成系统功能失效和多余的功耗;

任何异步时钟域交互的环节都要尽可能避免亚稳态现象.

 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分