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

news/2024/11/18 13:39:57/文章来源:https://www.cnblogs.com/dy-stairmed/p/18552401

一、问题

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

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) beginif(~sys_rst_n) begina1o_dly <= 'b0;endelse begina1o_dly<= {a1o_dly[0],a1o};end
endalways @(negedge i_clka) beginif(~sys_rst_n) begina2i_2 <= 'b0;endelse  begina2i_2 <= a1o_dly[1];end
end//CLK B domain
always @(posedge i_clkb) beginif(~sys_rst_n) begina3o_dly <= 'b0;endelse begina3o_dly<= {a3o_dly[0],a3o};end
endalways @(negedge i_clkb) beginif(~sys_rst_n) begina4i_2 <= 'b0;endelse  begina4i_2 <= a3o_dly[1];end
endendmodule
  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;
endalways  # 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

四、仿真波形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836137.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs code 提示图标含义

图标姓名符号类型方法和函数 method,,function​constructor变量 variable字段 field类型参数 typeParameter常量 constant课程 class接口 interface结构 struct活动 event运算符 operator模块 module属性和特性 property值和枚举 value,enum参考 reference关键词 keyword文…

Windows右键--新建文本创建快捷键

前言全局说明Windows右键--新建文本创建快捷键,中文版默认不带创建快捷键,而英文版带,一、说明 环境: Windows 7 旗舰版二、中文版系统 2.1 增加快捷键 打开注册表,路径: HKEY_CLASSES_ROOT\Local Settings\MuiCache\10B\AAF68885修改: 文本文档 为 文本文档(&T)使用…

Java 基础 - 字符串类

字符串类 重要的字符串类有 String、StringBuilder、StringBuffer 1、String String 是不可变类,内部是由 final 定义的字符数据构成。 private final char value[]; 1.1 String 类的层次结构如下:String 实现了比较接口,字符序列接口,序列化接口,具有以上接口的特性 1.2 …

Windows调用系统右键发送到zip打包指定文件

前言全局说明Windows 从 XP 自带的zip文件压缩/解压工具组件,但使用过程中,只能用鼠标操作,命令行中没有提供相关命令 如果想要用命令行打包成zip后缀的,就要调用第三方软件如7z,这样不方便。 今天在搜索如何修改右键新建文本名时,发现注册表中有个 @zipfldr.dll,-10148 …

Python程序py代码加密方法

Python程序语言使用方便,应用范围广,但Python的代码加密保护是一个问题,下面介绍一种专业的python程序py代码加密方法,可以有效地保护源代码!下载最新加密锁开发工具包 http://chinadlp.com/?list-DriveDownload.html完全默认安装后,打开如下开发工具 在安装目录下找到…

Nuxt.js 应用中的 vite:serverCreated 事件钩子

title: Nuxt.js 应用中的 vite:serverCreated 事件钩子 date: 2024/11/18 updated: 2024/11/18 author: cmdragon excerpt: 通过使用 vite:serverCreated 钩子,开发者可以在 Vite 服务器创建时执行特定的操作,包括添加中间件和自定义配置。这使得在开发环境中能够快速响应请…

DDL:数据库操作

1.所有的命令代码需要“;”做结尾 ,nivicat中已经默认加上了,但是命令行中一定要自己手动加上,不然不会被判定为写完语句。2.不区分大小写,nivicat中无需注意“;”结尾3.四种SQL语句: 数据查询语言:基本结构是SELECT子句,FROM子句,WHERE子句组成的查询快 数据操纵语言…

百度网盘文件手机和电脑如何保存、下载、打印、发送给好友?

原文持续更新中:https://www.cnblogs.com/MrFlySand/p/18552343 教程一:手机保存网盘文件并下载 教程介绍:通过别人发送的链接,用手机将别人的资源保存到自己的网盘中,随时根据自己的需求下载文件,对文件进行查看、编辑、打印等操作。操作教程如下:将链接发送到微信/QQ中…

生成 Windows 窗体 Blazor 应用 (WinForm+Bootstrap Blazor)

官方文档有介绍如何用 WinForm+ Blazor 生成应用, 生成 Windows 窗体 Blazor 应用先按照官方文档 启动 Visual Studio。 在“开始”窗口中,选择“创建新项目”: 创建WinForm项目 起名为:WinFormsBlazor框架我们选择:.NET 8.0 创建完成项目后,使用 NuGet 包管理器安装…

cmu15545笔记-查询执行(Query Excution)

目录执行模型Iterator ModelMaterialization ModelVectoriazation Model对比数据访问方式Sequential ScanIndex ScanMulti-Index ScanHalloween Problem表达式求值 执行模型 执行模型(Processing Model)定义了数据库系统如何执行一个查询计划。 Iterator Model 基本思想:采用…

【大模型】模型安全

核心内容来自《大模型安全研究报告(2024年).pdf》 更多的安全内容见内部“语雀-大模型”-笔记真实性:训练数据能真实反映物理世界客观规律和人类社会实际运转情况的性质。 多样性:训练数据应覆盖尽可能多的样本,以确保大模型能对不同情况进行泛化的性质。 准确性:针对所规…