Verilog3-glitch_free_clock_switching(无毛刺时钟切换电路)

Verilog 实现 glitch free clock Switching(无毛刺时钟切换电路)

  • 要求:输入sel、clka 、clkb,sel 为1输出为 clka,sel为0 输出 clkb
  • 参考文章:http://www.asic-world.com/examples/verilog/syn_fifo.html
    • https://blog.csdn.net/bleauchat/article/details/96180815
  • 招牌Verilog设计类的题目
    • 奇偶分频、状态机、序列检测器、波形产生、跨时钟域传输(CDC,Clock Domain Conversion )、门控时钟、同步FIFO、异步FIFO、格雷码与二进制码转换、异步复位同步释放、始终切换等。

1、有毛刺的时钟切换电路

  • 原理图

img

  • Verilog描述

    assign outclk = (clk1 & select) | (~select & clk0);
    
  • 结果:存在毛刺信号

    img

2、相关时钟源(同步时钟)的毛刺保护

  • 防止源时钟相互倍数的时钟开关输出出现毛刺的解决方案 —— 在每个时钟源的选择路径中插入负边沿触发的D触发器
    • 思路:在时钟的下降沿采样选择控制(SELECT),以及仅在首先使其他时钟无效后使能选择(SELECT)。

img

  • 原理:

    • SELECT为0时,CLK1对应通路无效,CLK0对应通路有效。在CLK0的下降沿采样SELECT(取反后)信号,与CLK0相与之后输出
    • 同时触发器DFF0 反馈信号到 上半部分电路,使其输入一直处于低电位
    • SELECT为1时,CLK0对应通路无效,CLK1对应通路有效。但由于反馈信号存在,需要在CLK0 下降沿到来后,QN输出高电平,CLK1对应通路才能采样到 SELECT信号输出高电平,与CLK1相与之后输出
  • 结果:可以进行**相关时钟源(同步时钟)**的毛刺保护

    img

  • 注意:

    • 在时钟的下降沿寄存选择信号(SELECT),可以保证下降沿到来之前输出端保持不变,这样就不会斩断当前时钟。
    • 当SELECT信号突然发生变化,也必须等待到当前时钟的下降沿到来才能使当前时钟无效,避免了毛刺(glitch)
    • 电路中有三个时序路径需要特别考虑:SELECT控制信号到两个负边沿触发器中的任何一个,DFF0输出到DFF1的输入,DFF1的输出到DFF0的输入。如果三条路径中的任何一条路径上的信号与目标触发器的捕获边缘同时发生变化,则该寄存器的输出很可能变为亚稳态,其可能会进入理想的0和1两者之间的状态。
module Glitch_free_clock_switching_syn(clk0,clk1,rst_n,select,out_clk);
    input clk0,clk1;
    input rst_n,select;
    output outclk;
    
    reg out0,out1;
    always@(negedge clk1 or negedge rst_n)
        begin
            if(!rst_n) begin
                out1 <= 0;
            end
            else begin
                out1 <= ~out0 & select;
            end
        end
    
    always@(negedge clk0 or negedge rst_n)
        begin
            if(!rst_n) begin
                out0 <= 0;
            end
            else begin
                out0 <= ~out1 & ~select;
            end
        end
    assign outclk = (out1 & clk1) | (out0 & clk0)
                

3、无关时钟源(异步时钟)的毛刺保护

  • 通过为每个时钟源添加一个额外级的正边沿触发触发器来提供针对亚稳态的保护。每个选择路径中的正边沿触发器以及现有的负边沿触发器防止潜在的亚稳态性,这可能是由异步SELECT信号或从一个时钟域到另一个时钟域的异步反馈过来的
  • 第一级触发器帮助稳定数据,然后将数据传递到下一级
  • 原理
    • SELECT为0时,CLK0 部分电路有效,CLK1通路无效。在CLK0上升沿将 SELECT& out1 传到 out_r0,在CLK0下降沿 传到 out0,之后与 out0&CLK0 得到输出
    • 当SELECT变为1时,要等到CLK0 的一个上升沿、下降沿到来之后,才能将反馈信号 ~out0 置为1,CLK1通路的 SELECT信号才能发生作用。类似于CLK0通路作用过程
    • 当SELECT信号发生变化之后,要 经过一个上升沿、下降沿才能让另一条通路的开始工作。两级触发器防止跨时钟域的亚稳态和毛刺信号出现

img

module Glitch_free_clock_switching_asyn(clk0,clk1,rst_n,select,outclk);
    input clk0,clk1;		//asynchronous:异步
    input rst_n,select;
    output outclk;
    
    reg out_r1,out1;
    reg out_r0,out0;
    
    always@(posedge clk1 or negedge rst_n)
        begin
            if(!rst_n)
                out_r1 <= 0;
            else
                out_r1 <= select & ~out0;
        end
    
    always@(negedge clk1 or negedge rst_n)
        begin
            if(!rst_n)
                out1 <= 0;
            else
                out1 <= out_r1;
        end
    
    always@(posedge clk0 or negedge rst_n)
        begin
            if(!rst_n)
                out_r0 <= 0;
            else
                out_r0 <= ~select & ~out1;
        end
    
    always@(posedge clk0 or negedge rst_n)
        begin
            if(!rst_n)
                out0 <= 0;
            else
                out0 <= out_r0;
        end
    
    assign outclk = (out0 & clk0) | (out1 & clk1);
endmodule
### 关于 Clock Glitch 05 的技术解决方案 Clock glitch 是指由于时钟信号切换不当而导致的瞬态错误脉冲现象。这种现象可能发生在时钟切换过程中,尤其是在异步或多域时钟环境中[^1]。为了防止此类问题的发生,在设计无毛时钟切换电路时,通常采用特定的设计策略和技术手段。 #### 1. 防止 Clock Glitch 的基本原理 为了避免 clock glitch 的发生,核心原则是在新旧时钟源之间实现平滑过渡。这可以通过以下方法来完成: - **同步机制**:对于相关时钟源(即共享共同祖先的时钟),可以利用同步器确保两个时钟之间的相位关系稳定后再进行切换[^1]。 - **握手协议**:在异步时钟环境下,通过引入额外的状态机或控制逻辑,确认目标时钟已经完全稳定并被采样后才允许切换操作。 #### 2. 具体设计方案——Glitch-Free Clock Switching 以下是针对 `clock_glitch05` 提供的一种典型解决思路: ##### (a) 使用双锁存器结构 一种常见的做法是使用两级触发器组成的同步器来消除亚稳态影响。具体实现如下所示: ```verilog module clk_switch ( input wire old_clk, input wire new_clk, output reg out_clk ); reg [1:0] state; always @(posedge old_clk or posedge new_clk) begin case(state) 2&#39;b00: if (~old_clk && new_clk) state <= 2&#39;b01; // Detect rising edge of new_clk 2&#39;b01: if (!new_clk) state <= 2&#39;b10; // Wait until falling edge of new_clk default: ; endcase // Output the selected clock based on stable conditions if (state == 2&#39;b10) out_clk <= new_clk; else out_clk <= old_clk; end endmodule ``` 此模块通过检测新旧时钟边沿的变化情况,确保只有当新的时钟信号处于稳定的低电平时才会执行实际切换过程,从而有效避免了潜在的毛问题。 ##### (b) 引入缓冲区与门控逻辑 另一种方式则是结合 buffer 和 AND/OR gate 来构建更复杂的开关网络。这种方法特别适用于需要频繁改变工作频率的应用场景下。例如下面展示了一个简单的例子: ```verilog // Example implementation using gated clocks wire en_newclk, sel_oldclk; assign en_newclk = ~sel_oldclk & new_clk; assign sel_oldclk = |{reg_sel}; always @(*) begin : CLK_MUX out_clk = sel_oldclk ? old_clk : {en_newclk}; end ``` 这里的关键在于合理配置 enable signal (`en_newclk`) 及其关联条件表达式,使得最终输出始终维持单一有效的时钟波形而不会产生任何意外跳变[^2]。 #### 3. 功耗优化考虑 —— Clock Gating 技术应用 除了关注功能层面的安全性之外,还应注意到动态功耗管理的重要性。正如之前提到过的那样,通过对不必要活动区域实施局部关闭措施即可显著降低整体能耗水平。因此,在某些情况下也可以将 clock gating 思想融入进来作为辅助手段之一[^2]。 --- ### 结论 综上所述,“clock_glitch05”的主要应对方案包括但不限于运用双重锁存架构或者精心设计带使能端口的选择单元等方式达成无缝衔接效果;与此同时还要兼顾节能需求适时加入相应的抑制机制以进一步提升系统性能表现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值