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
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值