【问题标题】:Clock Domain Crossing for Pulse and Level Signal脉冲和电平信号的时钟域交叉
【发布时间】:2016-06-28 04:57:30
【问题描述】:

对于脉冲,我们使用 Pulse-Synchronizer,对于电平信号,我们使用 2-flop 同步器,但如果信号可以是 Pulse 或 Level 行为呢?有什么方法可以同步吗?

【问题讨论】:

    标签: verilog cdc asic digital-design


    【解决方案1】:

    可以,但解决方案需要基于输入脉冲相对于输出时钟的宽度。

    当输出时钟很慢,并且你有一个脉冲时,你需要添加一个在输入时钟域工作的内联脉冲展宽器。拉伸由下面的stretch_out 的位宽定义,并且“必须”大于输出clk 域上的一个时钟。

    reg [3:0] stretch_out;
    always @ (posedge inclk)
    begin 
       stretch_out <= in_signal ? 4'b1111 : {stretch_out[2:0],1'b0}; 
    end
    

    现在您可以使用双触发器同步器了。

    reg [1:0] out_sync;
    always @ (posedge outclk)
    begin 
        out_sync <= {out_sync[0],stretch_out[3]};
    end
    

    这应该将电平和脉冲从快域同步到慢域。

    唯一的问题是,您将增加的不仅仅是通常的两次翻牌延迟。

    【讨论】:

      【解决方案2】:

      您可以使用目标域中的信号异步设置,使用双触发器同步,然后检测上升沿。应该适用于短脉冲和长电平。

      // Prevent DRC violations if using scan
      wire in_signal_n = scan_mode ? 1'b1 : !signal_in;
      
      // Following code creates a flop with both async setb and resetb
      reg sig_n_async;
      always @ ( posedge outclk or negedge reset_n or negedge in_signal_n)
        if (!reset_n)
          sig_n_async <= 0;
        else if (!in_signal_n)
          sig_n_async <= 1;
        else
          sig_n_async <= 0;
      
      
      // Synchronizer
      reg [1:0] out_sync;
      always @ (posedge outclk or negedge reset_n)
        if (!reset_n)
          out_sync <= 0;
        else
          out_sync <= {out_sync[0],sig_n_async};
      
      
      // Rising edge
      reg out_sync_del;
      always @ (posedge outclk or negedge reset_n)
        if (!reset_n)
          out_sync_del <= 0;
        else
          out_sync_del <= out_sync[1];
      
      wire signal_out = out_sync[1] & !out_sync_del;
      

      【讨论】:

        猜你喜欢
        • 2021-11-09
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 2020-02-23
        • 1970-01-01
        • 2021-11-18
        相关资源
        最近更新 更多