本次主要分享的内容是时钟切换相关的设计,时钟切换在数字设计中也是很常用的设计,通常有一定的“套路”,本篇文章将会把“套路“拆开给你看。

关注公众号【TechDiary】后台回复“时钟切换”,可以获得相关Verilog代码和简单的验证testbench。

当我们在设计一些支持多时钟转换的外设驱动模块时,时常遇到需要无glitch切换时钟的情况。我们可以从分析问题的产生开始,再把整个问题拆解开来,逐一解决每个子问题。以下是本篇文章的目录结构:

  • 切换时钟时的毛刺是如何产生的
  • 为时钟加上一个“开关”
  • 为时钟加上“指示灯”

切换时钟时的毛刺是如何产生的

当我们拿到时钟切换这个需求的时候,脑子里冒出的第一个想法是不是下面这样的?

assign clk_out = (clk_sw) ? clk_A : clk_B;

NONONO这样写太不优雅了,简单粗暴并解决不了问题。我们来举个例子看上面的电路结构在切换时钟时的表现:

需要特别说明的是clk信号是clk_sw的时钟域,从上面的图中可以观察到在时钟切换的时刻(clk_sw 1 -> 0)输出时钟出现了即不属于clk_A也不属于clk_B时钟周期的一段信号,这段信号称为时钟当中的毛刺。由于目前的数字设计基本为同步电路设计,时钟上的毛刺的存在增加了系统的不确定性,很有可能因为切换时钟时的毛刺导致后面的触发器误触发,出现功能故障。

我们仔细来看时钟切换时发生了什么,毛刺的前半段其实是clk_A的残留部分,毛刺的后半段其实是clk_B的不完整时钟。时钟切换信号完全没有在意切换时两个时钟周期是否完整,因此这样的设计方法根本漏洞在于随意切换时钟,未监测前后两个时钟的时钟周期是否完整

那么我们要怎么实现无故障切换时钟功能呢?让我们先从第一步来——


为时钟加上一个”开关“

首先,我们要夺回对时钟的“控制权”,实现时钟信号的自由关断,并且这还是一个“智能开关”,它可以使输出的时钟不会是被截断的不完整输出。由于时钟信号的特殊性,我们需要使用一个特殊的元件来实现时钟的开关,这个元件就是大家在编写Verilog时“闻之色变”的Latch。我们先来看一下Latch的结构:

怎么样,是不是很眼熟?看过之前文章《一文解决建立保持时间的困惑》的朋友肯定已经看出了latch的结构和D触发器的结构非常相似,可以看作是D触发器的一半结构。根据上篇文章中的方法容易得到latch的运行机制:

  • 当EN = 1时,Q端值随D端变化,latch为透明状态
  • 当EN = 0时,Q端值保持上一状态的值,latch为保持状态

Verilog中当组合逻辑的条件分支未描述时就会出现latch(这也是我们在平时设计组合逻辑时要避免的),当我们要真的去描述一个latch时也可以用类似的方法:

always@(EN or D) beginif(EN)Q = D;
end

在时钟的开关电路(也就是门控时钟设计)中,常见的电路是下面这样的:

当clk_en信号是clk时钟域下的信号时,容易分析出下面的时序图:

当clk信号为低时,Q信号为clk_en的采样信号;clk信号为高时,Q将保持上一个clk_en的采样值。从时序波形上看更像是将clk_en信号在时钟的下降沿打了一拍。再将得到的Q信号与时钟信号相与,即可得到门控时钟的输出。

笔者在Design Compiler中截取了相应的门控电路的综合结果,可以看到电路有相应的逻辑优化,但是主要结构和之前的电路结构是相同的。

门控时钟设计不但在时钟切换中会用到,在很多的低功耗设计中也会涉及。这样的门控时钟设计能够保证完整的高电平时钟输出,从开关控制上消除毛刺可能产生的原因。


为时钟加上“指示灯”

现在,我们已经可以正确地开关时钟了,下一步将为时钟电路加上一个“指示灯”,这样我们的系统就可以通过这个指示变量判断开启的时钟支路,避免出现两个时钟同时打开的状态。

在我们为每条支路都加上指示信号时,在每条支路上也同时需要处理其他支路上的指示信号。需要注意的是,其他时钟支路上的指示信号对于本支路为异步信号,因此这里要用到跨时钟域的信号传输方法。常见的单比特控制信号的跨时钟域传输只要打两拍(经过两个触发器同步)后即可。

以4条切换时钟支路为例,在支路1中将其他三条支路的指示信号busy进行或非操作,得到的信号若为高电平,表明系统当中无其他支路正在输出,此时我们可以逐步开启本时钟支路。将该信号(称为bus_idle信号)在本时钟域里打两拍后,可以将其直接接到上一小节提到的门控时钟模块(ICG)中,作为门控时钟的控制信号。

接下来是设计本支路的busy信号。我们要清楚本支路的忙状态信号的开始和停止节点:

  • 开始节点:从系统选中该支路的一开始,busy信号就需要拉高,以抢占当前切换模块的时钟输出(尽管此刻上一支路还未关闭,当前支路也尚未开始)
  • 结束节点:当时钟输出完毕后将busy信号拉低。此时根据上一小节的分析,ICG也会将信号延迟一拍输出,故而需要在同等位置上添加D触发器也将时钟使能信号延迟一拍作为busy信号的结束节点
  • busy信号从开始节点至结束节点须一直保持高电平

具体我们可以看下面的电路结构(为了描述方便,未画出相关复位信号):

在此还是要继续聒噪一下,数字设计的流程还是先心中有电路,之后再使用Verilog将电路描述出来。因此建议读者根据上面的电路图自行用Verilog描述出来之后再与提供的代码核对,可以达到事半功倍的效果。

为了获得更好的扩展性,笔者将上述的时钟分支电路封装成了模块,在顶层模块中例化多个模块可以生成多个时钟分支,获得了极大的可扩展性,可以满足日常的工程需求。详细请见本文提供的代码。以下是仿真测试图,可以看到输出时钟clk_out随切换信号clk_sw的变化:

详细代码可在后台回复【时钟切换】获得,工程中也有复位信号的相关设计,读者可以结合之前的文章体会。


关注公众号【TechDiary】,回复“时钟切换”,领取工程代码

IC设计中的glitch free时钟切换相关推荐

  1. IC设计中时钟偏斜对延时的影响

    IC设计中时钟偏斜对延时的影响 1. 什么是时钟偏斜 芯片实际工作中,时钟并不是同时到达各个时序元件,在到达时间上又某种不确定性,因而可能减少用于计算的时间. 如下图所示:图中加粗clk线表示时钟可能 ...

  2. 数字IC设计中ECO的那些事,其实并不是事

    数字IC设计中ECO的那些事,其实并不是事! 文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点.点击进去后出现任何损失与社区无关. 点击标题下「蓝色微信名」可快速关注 刚好最近一直在忙着芯片的测 ...

  3. IC设计Linux设置文件夹颜色,IC设计中常用的Linux命令

    一个合格ICer,必需要熟练掌握常用的Linux命令.今天来介绍一下IC设计中常用的Linux命令.(管理员相关的命令后面另写一篇文章.) Linux常见命令一览 文件及目录操作 cd  pwd  l ...

  4. IC设计中如何用PTPX分析功耗

    PrimeTime PX(Power Analysis) userguide阅读笔记 IC设计中的功耗分析的流程 PrimeTime-PX功耗分析总结 低功耗设计 synopsys官方参考文档:pri ...

  5. 数字IC设计中为什么要避免锁存器(Latches)

    数字IC设计中为什么要避免锁存器(Latches) 上学时,老师说判断语句要把条件写全,不然会生成锁存器,做项目时又说多比特寄存器信号的赋值一定要加if条件,不让出现else的赋值.就很矛盾,本文主要 ...

  6. 数字时钟设计verilog_数字IC设计基本概念之创建时钟

    来自微信公众号 "数字芯片实验室" 时序分析的一个重要部分是准确地指定时钟和相关属性,例如延迟(latency)和不确定性(uncertainty). EDA工具可以分析以下类型的 ...

  7. 数字IC设计中的亚稳态问题

    亚稳态: 亚稳态是由于违背了触发器的建立时间和保持时间而产生的: 同步系统中输入信号总是满足触发器的时序要求,所以不会发生亚稳态: 异步设计中,由于数据和时钟的关系不是固定的,因此会出现违反建立时间和 ...

  8. IC设计中节省静态功耗和动态功耗的方法

    目录 1.功耗 2.静态功耗 3.动态功耗 4.  静态功耗与动态功耗 1.功耗 功耗 = 静态功耗 + 动态功耗         = 静态功耗 + 转换功耗 + 短路功耗   2.静态功耗 P_st ...

  9. IC设计中不同eda工具波形文件(wlf/vcd/fsdb/shm/vpd)的区别及生成方法

    转自http://www.eetop.cn/blog/html/30/523930-36594.html 波形文件一般用于仿真后记录波形文件,用于做详细分析和研究.说一下几种波形文件WLF(Wave ...

  10. IC设计中XilinxIP核申请与使用教程

    官网上申请evaluate IP 参考博客: https://blog.csdn.net/FPGADesigner/article/details/80694673 https://www.2cto. ...

最新文章

  1. linux c 并行编程从入门到精通,VISUAL STUDIO 2010并行编程从入门到精通(微软技术丛书)...
  2. postman调用webservice接口_【分享】关于接口对前后端和测试的意义
  3. 计算机 用户创建失败,电脑用户加载错误,无法创建新的配置文件的解决方法...
  4. es springboot 不设置id_springboot整合ES_文档ID删除
  5. 使用node中的express解决vue-cli加载不到dev-server.js的问题
  6. python学习中文第五版_前5个学习Python的网站
  7. udp模拟tcp java_Java简单实现UDP和TCP
  8. ccf小明放学20分_关于完全平方数的好题(20年3月1日)
  9. JDBC工具类,基于C3P0的数据库连接池,提供获取连接池、获取连接对象、释放资源和封装事务操作的方法...
  10. 百度网盘下载神器度盘下载器
  11. Linux中rz和sz命令用法详解
  12. Java如何实现定时任务——从某一天起每天定点执行
  13. CentOS-7部署安装Zabbix 3.0
  14. python-某旗小说app的学习过程
  15. 考研英一----2006年真题知识点总结
  16. java基础知识复习(上半)
  17. linux关闭计算机的命令是,关闭Linux计算机的命令操作
  18. CODING —— 云原生时代的研发工具领跑者
  19. start()方法和run()方法区别与多线程抢占式运行原理
  20. 比亚迪财报,高光与隐忧并存

热门文章

  1. 前端vue点击切换(黑夜/白天模式)主题最新(源码)
  2. 清华园那沁人心脾的秋天
  3. 【Python】WARNING: The script xx.exe is installed in xxdirectory which is not on PATH.
  4. java jwt登录_图解JWT如何用于单点登录
  5. go老鸟也会经常出现 并发channal问题引起的协程泄漏
  6. 极光效果通发布重定向app拉活服务,为头部app提升DAU
  7. php doctrine,PHP和Doctrine:如何创建唯一ID
  8. 在两台电脑之间通过网线、局域网快速传东西的几种方法
  9. 【Traffmonetizer】利用闲置电脑/VPS/安卓手机/树莓派来挂机
  10. 树莓派开机启动python脚本的另一种方法