首页 > 其他分享 >门控时钟-无毛刺的时钟切换

门控时钟-无毛刺的时钟切换

时间:2024-11-18 13:29:56浏览次数:1  
标签:reg clk 毛刺 assign sys b0 sel 门控 时钟

一、问题

假设存在这样的时钟控制模型:

CLK1、CLK2以及系统时钟的频率与相位均不一致,我们希望在clk_sel=1时,输出CLK1,反之输出CLK2,CLK_SEL可以由系统时钟驱动,也可以由组合逻辑驱动。那么在这种情况下就会出现以下的“毛刺”问题:

可以看到,在CLK_SEL的交界处,非常容易出现CLK_OUT时钟出现毛刺的现象,从而影响系统的正常工作。

二、解决方法

(以下方法出自B站UP:皮特派)

具体思路是:1.两个时钟互斥输出,即B4、B5两个非门作为最后的A2、A4的输入;

2.S3、S6寄存器采用下降沿驱动对sel进行同步,这样就可以在延迟一拍的情况下做到两个时钟无毛刺的输出。

分析如下:当sel为0时,ali_2初始值为0,ali_1为1,A1选通,随后在CLKA的驱动下对alo信号打两拍同步,随后S3在CLKA的下降沿对打拍同步的信号进行采样,这样在下降沿到后一个上升沿之前,由于CLKA为0,CLK-OUT始终拉低,而后CLKA为高,此时由于上个下降沿已经对ai2_2进行了同步,CLKA为1,且ai2_2为1,此时CLK_OUT输出为CLKA。
本质上是用延迟换准确性。

三、代码

根据上述的RTL,代码如下:

  1. RTL

// // =============================================================================
// File Name    : clk_gating_module.v
// Module       : clk_gating_module
// Function     : Burr free clock switching
// Type         : RTL
// Aythor       : Dongyang
// -----------------------------------------------------------------------------
// Update History :
// -----------------------------------------------------------------------------
`timescale 1 ns/1 ns
module  clk_gating_module(
        input            sys_clk    ,
        input            sys_rst_n  ,
  
        input            i_clka     ,
        input            i_clkb     ,
        input            i_clk_sel  ,
        output           o_clk_out  

);

//******************** siganl define ********************
wire         a1i_1        ;
wire         a1i_2        ;
wire         a3i_1        ;
wire         a1o          ;
wire         a3o          ;
wire         a3i_2        ;
wire         a2o          ;
wire         a4o          ;
reg          a4i_2    =  'b0;
reg          a2i_2    =  'b0;
reg  [1:0]   a1o_dly  =  'b0;
reg  [1:0]   a3o_dly  =  'b0;  

//******************** assign  *****************************
assign   a1i_1 =   ~i_clk_sel         ;
assign   a3i_1 =    i_clk_sel         ;
assign   a1i_2 =    ~a4i_2         ;
assign   a3i_2 =    ~a2i_2         ;
assign   a1o   =   a1i_1 & a1i_2 ;
assign   a3o   =   a3i_2 & a3i_1;
assign   a2o   =   i_clka & a2i_2;
assign   a4o   =   a4i_2 & i_clkb;
assign   o_clk_out = a2o | a4o   ;

//**********************always*********************************
// CLKA domain
always @(posedge i_clka) begin
    if(~sys_rst_n) begin
        a1o_dly <= 'b0;
    end
    else begin
        a1o_dly<= {a1o_dly[0],a1o};
    end
end

always @(negedge i_clka) begin
    if(~sys_rst_n) begin
        a2i_2 <= 'b0;
    end
    else  begin
        a2i_2 <= a1o_dly[1];
    end
end

//CLK B domain
always @(posedge i_clkb) begin
    if(~sys_rst_n) begin
        a3o_dly <= 'b0;
    end
    else begin
        a3o_dly<= {a3o_dly[0],a3o};
    end
end

always @(negedge i_clkb) begin
    if(~sys_rst_n) begin
        a4i_2 <= 'b0;
    end
    else  begin
        a4i_2 <= a3o_dly[1];
    end
end

endmodule
  1. TestBench

`timescale 1 ns/1 ns
module  tb_clk_gatting();

reg    clka   = 'b0;
reg    clkb   = 'b0;
reg    sys_clk = 'b0;
reg    sys_rst_n = 'b0;
reg    clk_sel  = 'b0 ;

initial begin
clka   = 'b0;
clkb   = 'b0;
sys_clk = 'b0;
sys_rst_n = 'b0;
clk_sel  = 'b0 ;
#6
clkb   = 'b1;
#100
sys_rst_n = 'b1;
#1000
clk_sel  = 1'b1;
#756
clk_sel  = 1'b1;
#1500
clk_sel  = 1'b0;
end

always  # 10   sys_clk = ~sys_clk;    //sys_clk     50M
always  # 50   clka    = ~clka   ;    // CLKA       10M
always  # 30   clkb    = ~clkb   ;     // CLKB     16.6M
clk_gating_module  U_clk_gating_module(
        .sys_clk    (sys_clk),
        .sys_rst_n  (sys_rst_n),
        .i_clka     (clka),
        .i_clkb     (clkb), 
        .i_clk_sel  (clk_sel), 
        .o_clk_out  ()

);

endmodule

四、仿真波形

标签:reg,clk,毛刺,assign,sys,b0,sel,门控,时钟
From: https://www.cnblogs.com/dy-stairmed/p/18552401

相关文章

  • 一文讲透 FPGA CDC 多bit跨时钟域同步-hand-shanking机制
    一、背景数据的跨时钟域处理是FPGA开发过程中的常见问题,存在两种情况慢时钟向快时钟同步:只需在快时钟域打两拍即可。其RTL如下:打拍同步的原理:大家在初学FPGA时,经常听过FPGA中对信号打拍可以有效得避免亚稳态,而且一般要打两拍,其数学本质是如果打一拍发生错误得概率是1/1000......
  • 【025A】基于51单片机多功能电子时钟【Proteus仿真+Keil程序+报告+原理图】
    ☆、设计硬件组成:51单片机最小系统+DS1302时钟芯片+LCD1602液晶显示+按键设置+蜂鸣器+LED灯。1、本设计采用STC89C52、AT89C52、AT89S52单片机作为主控芯片,并采用LCD1602进行实时显示信息;2、可以显示年月日,时分秒,星期,以及上/下午;3、可以设置闹钟,并且闹钟数据保存在AT24C......
  • 关于有源蜂鸣器和无源蜂鸣器、时钟极性与时钟相位的理解
    有源蜂鸣器和无源蜂鸣器是两种常见的蜂鸣器类型,它们的主要区别在于驱动方式和工作原理:有源蜂鸣器(ActiveBuzzer)1.驱动方式:有源蜂鸣器内置了振荡电路,只需要提供电源即可发出声音。它自身会生成震动信号,因此不需要外部频率信号。2.工作原理:当电源接入时,蜂鸣器会自动产生固定频率......
  • wifi模块使用主控输出的32k时钟
    soc:rk3568WiFi模块需要的32.768K时钟,有三种时钟源,rk809和8563提供,或者使用主控输出的。 dts修改如下:&wireless_bluetooth{compatible="bluetooth-platdata";-clocks=<&rk8091>;+clocks=<&cruSCLK_32K_IOE>;clock-n......
  • 京准时钟:北斗卫星时钟服务器助力自控统一时间
    京准时钟:北斗卫星时钟服务器助力自控统一时间京准时钟:北斗卫星时钟服务器助力自控统一时间京准电子科技官微——ahjzsz前言随着计算机和网络通信技术的飞速发展,各行业自动化系统数字化、网络化的时代已经到来。这一方面为各控制和信息系统之间的数据交换、分析和应用提供了更......
  • 门控循环单元GRU
    结构:特点:结构简单,参数较少结构图:对比LSTM:1.LSTM有三个门,而GRU只有两个门2.LSTM在左侧有两项输入,而GRU只有一项输入,将两项和合二为一合成一个部分3.LSTM中的参数数量很多(、、、等9个),而GRU中的参数少得多(、等6个)4.LSTM中的门为输入门、遗忘门、输出门,GRU的门为更新门和......
  • Bayes-CNN-BiGRU-Att贝叶斯算法-卷机网络-双向门控循环单元-注意力机制多特分类预测 M
    %*****************************************************************************************************************************************************************************************************************%%清空环境变量warningoff%关闭报警......
  • 【CNN-GRU-Attention】基于卷积神经网络和门控循环单元网络结合注意力机制的多变量回
    ......
  • 简单但实用,RTC时钟使用指南
    合宙Air201快速入门-RTC实时时钟使用示例- 本教程教你通过使用脚本代码,实现Air201内置RTC实时时钟同步时间、获取时间、设置时间等功能,可根据实际需求灵活应用。我们先了解一些相关基础知识:RTC——Real-TimeClock实时时钟,通常称为时钟芯片,可以提供精确的实时时间,它......
  • DAC8568IAPWR 数据手册 具有 2.5V、2ppm/°C 内部基准电压的 DAC7568、DAC8168、DAC85
    DAC7568、DAC8168和DAC8568分别为12位、14位和16位低功耗、电压输出、八通道数模转换器(DAC)。这些器件包括一个2.5V、2ppm/°C内部基准电压(默认禁用),可提供2.5V或5V的满量程输出电压范围。内部基准电压初始精度为0.004%,而且可在VREFIN/VREFOUT引脚上提供高达20mA......