无毛刺的时钟切换电路(Glitch-free clock switching circuit)设计(Verilog)
从秋招的经验来看,Verilog设计类的题目,如:奇偶分频,状态机,序列检测,波形产生,跨时钟域处理,门控时钟,同步FIFO,格雷码与二进制码转换,异步复位同步释放,时钟切换,异步FIFO等,其中最为复杂的恐怕属于时钟切换了吧。
无毛刺的时钟切换英文名叫:Glitch-free clock switching circuit,不要把 Clock Domain Conversion当成了时钟切换,傻傻地设计了半天答非所问。
Clock Domain Conversion为跨时钟域传输问题,就是最常考也是经常听到的CDC问题(应该会有专门的总结)。
今天的主题是Glitch Free Clock Switching:
就像这样:
clk0和clk1是无关时钟,如何实现二者之间的一个无毛刺切换是接下来需要解决的问题?
先从最容易相当的设计说起:
可以使用纯组合逻辑来设计时钟切换电路,但是这种设计不可避免的产生毛刺:
如下,两种一个道理:
如何改进这种设计呢?
之前的博客也写过这个话题,今天仿真了下,用Verilog描述了下,确实有点意思?
相关时钟源的时钟切换电路:
从前面组合逻辑时钟切换电路的设计,我们得出的切换波形如下:
可见,会产生毛刺,而产生毛刺的原因在于sel信号改变的位置没有和需要切换的时钟对齐。
如何改进这种问题呢?
我们可以用当前时钟的下降沿来采样(sel与反馈的输出相与的结果),可以简单地理解为采样sel信号。具体的设计如下:
可以这么理解,如下图:
sel为0时,选择输出clk0,如上图,先对sel在时钟域clk0进行下降沿采样,得到sel_clk0,取反得到sel_clk0_n,这个信号与时钟clk0相与输出得到clkout0;
sel_clk0反馈到时钟域clk1的输入端,与sel相与之后,再经过clk1下降沿采样得到sel_clk1,这个信号与clk1想与得到输出clkout1;
clkout0与clkout1进行或运算得到输出clkout,这个时钟便是进行时钟切换后的时钟输出。
这样经过下降沿采样以及反馈就可以得到无毛刺的相关时钟切换电路。
对于无关时钟源的无毛刺时钟切换电路设计
上一部分讲了相关时钟源的无毛刺时钟切换,用的是下降沿采样sel信号从而达到去除毛刺的原理;
下面给出无关时钟源的无毛刺时钟切换方案:
如下图:
画出相关波形图:
sel为0时候,先取反得到seln,然后clk0时钟下上升沿采样seln_clk0_r1,之后下降沿采样得到seln_clk0_r2,这个信号与clk0相与得到clkout0;
seln_clk0_r2n反馈到时钟域clk1,与clk1相与,用clk1上升沿采样得到sel_clk1_r1,再用clk1下降沿采样得到sel_clk1_r2,这个信号与clk1相与得到输出clkout1;
最终的输出为clkout0与clkout1的或,即输出clkout为无毛刺的时钟切换波形。
对于无关时钟源的无毛刺时钟切换电路的设计,参考文章
无关时钟源的时钟切换电路设计:
设计的Verilog描述:
module glitch_free (input clk0, // Clockinput clk1,input select,input rst_n, // Asynchronous reset active lowoutput clkout
);wire mid_clk0;reg mid_clk0_r1, mid_clk0_r2, mid_clk0_r2n;wire mid_clk1;reg mid_clk1_r1, mid_clk1_r2, mid_clk1_r2n;assign mid_clk1 = select & mid_clk0_r2n;assign mid_clk0 = ~select & mid_clk1_r2n;//第一级触发器用上升沿采样,选择信号与反馈信号的与运算always@(posedge clk1 or negedge rst_n) beginif(~rst_n) mid_clk1_r1 <= 0;else mid_clk1_r1 <= mid_clk1;end//第二级触发器用下降沿采样always@(negedge clk1 or negedge rst_n) beginif(~rst_n) beginmid_clk1_r2 <= 0;mid_clk1_r2n <= 1;endelse beginmid_clk1_r2 <= mid_clk1_r1;mid_clk1_r2n <= ~mid_clk1_r1;endend//第一级触发器用上升沿采样,选择信号与反馈信号的与运算always@(posedge clk0 or negedge rst_n) beginif(~rst_n) mid_clk0_r1 <= 0;else mid_clk0_r1 <= mid_clk0;end//第二级触发器用下降沿采样always@(negedge clk0 or negedge rst_n) beginif(~rst_n) beginmid_clk0_r2 <= 0;mid_clk0_r2n <= 1;endelse beginmid_clk0_r2 <= mid_clk0_r1;mid_clk0_r2n <= ~mid_clk0_r1;endendwire mid_clk11, mid_clk00;assign mid_clk11 = clk1 & mid_clk1_r2;assign mid_clk00 = clk0 & mid_clk0_r2;assign clkout = mid_clk11 | mid_clk00;endmodule
Testbench文件:
`timescale 1ns / 1ps
//
//
module test_tb();reg clk0, clk1;reg select;wire clkout;initial beginclk0 = 0;forever#2 clk0 = ~clk0;endinitial beginclk1 = 0;forever#5 clk1 = ~clk1;endreg rst_n;reg in;initial beginselect = 0;rst_n = 0;#5rst_n = 1;#30select = 1;#40select = 0;endglitch_free inst_glitch_free (.clk0(clk0), .clk1(clk1), .select(select), .rst_n(rst_n), .clkout(clkout));endmodule
仿真波形:
无毛刺的时钟切换电路(Glitch-free clock switching circuit)设计(Verilog)相关推荐
- 无毛刺时钟切换(glitch free clock switching)
时钟切换电路的意义 为什么要做clock switching,在现代的SoC设计中,很多时候我们设计的模块并不是要跑在一个固定的频率下,而是根据性能和功耗的要求要跑在不同的时钟频率下,当需要降低功耗以 ...
- 【Verilog HDL 训练】第 14 天(glitch-free的两个时钟切换电路)
2019年5月13日 glitch-free的两个时钟切换电路. 可以看到这是一个星期之前的题目了,现在才抽空做,把这篇颠倒个顺序吧,也是最后一天了,以后的题目都是讨论性质的,不会以第多少天的形式来写 ...
- glitch-free的两个时钟切换电路
有毛刺的时钟切换电路 原理图: 这个时钟切换电路是一个纯组合逻辑,输出时钟(OUT CLOCK)由选择信号(SELECT)控制,当SELECT为1时输出CLK1,反之,输出CLK0. 看似很简单,实现 ...
- 时钟切换电路(clock switching glitch free)英文版
链接: https://pan.baidu.com/s/1x9h8iM9T6CPArWLTdnMyhw 提取码: 347n
- 时钟切换处理(Verilog)
随着各种应用场景的限制,芯片在运行时往往需要在不同的应用下切换不同的时钟源,例如低功耗和高性能模式就分别需要低频率和高频率的时钟.两个时钟源有可能是同源且同步的,也有可能是不相关的.直接使用选择逻辑进 ...
- 亚稳态/异步电路/glitch(毛刺)/glitchFree clk切换的一些疑问及理解
0 参考资料 0.0 图文,公式详细介绍了什么是亚稳态/产生/消除/危害/稳定 认识FPGA触发器的亚稳态 浅谈IC设计中亚稳态的问题以及信号同步电路简单实现 亚稳态与跨时钟域 高级FPGA设计技巧! ...
- IC基础知识:时钟无毛刺切换
参考这篇文章:数字电路时钟无毛刺切换 因为直接用组合逻辑判断去切换时钟,会产生毛刺,如下图所示. 产生该毛刺的原因: sel没有在时钟跳边沿改变.因为我们一般是用clk上升沿采样数据,所以我们sel选 ...
- 数字芯片设计中的时钟分频电路,你了解多少?
时钟分频电路在数字芯片设计中非常常见,而且也非常重要,正确的符合要求的数字分频电路对功能的正确与否至关重要.现在数字电路设计中的时钟分频主要包括以下几种方法: 1.寄存器分频 寄存器分频就是利用寄存器 ...
- 歪解单片机的时钟系统--关于内外时钟切换及时钟超频测试
群友问过这种问题,外部接8M晶振和16M晶振有啥区别? 以我微薄的经验来看,这两个在用的时候差别不大,如果使用ST的固件库(以STM32F103为例),使用8M的晶振会更方便,不用改任何 ...
最新文章
- 2022年你应该知道的机器学习算法
- PLL_BASE——Basic Phase Locked Loop Clock Circuit(Virtex-5, Spartan-6)
- vscode编辑python_VsCode中编写python环境配置
- HTML页面显示缩略所有空格为一格的方法
- HTML5移动端音乐播放器(启蒙篇)
- 关于计算机优点缺点的英语作文,跪求一篇英语作文 题目:论计算机的优缺点...
- Java之数据库基础理论
- 淘宝API介绍-淘宝的 API 开放到什么程度?哪些数据是可以抓取的,哪些不能?
- 连接NI采集箱9181与9184
- matlab提高循环运行效率,提高MATLAB运行效率
- 苹果公司向中国征收30%苹果税
- mouseenter事件java_javaScript事件(五)事件类型之鼠标事件
- 物流服务--查询物流
- 单元测试框架NUnit 之 constraints 约束
- 联通服务器维护破解限速,网速1mbps(联通限速1mbps解除方法)
- python中字典的键是唯一的吗_python 零散记录(四) 强调字典中的键值唯一性 字典的一些常用方法...
- DirectUI界面编程(零)简介
- Proteus教程——过零检测器
- Vue项目打包部署(hash模式)
- POJ 3322 Bloxorz I(进阶指南,广搜)
热门文章
- 优化CSS在网页中的加载方式
- .net System.Web.Caching.Cache缓存类使用详解(转载)
- 认识计算机系统反思,《认识计算机系统》教学反思
- php4和php5的区别,php4和php5区别是什么
- html表格鼠标高亮行列,JS实现的表格行鼠标点击高亮效果代码
- linux下redis安装教程,linux下安装配置redis图文详解
- linux守护进程中多线程实现,Linux下实现多线程客户/服务器
- mysql压缩配置_MySQL压缩版安装配置
- ireport各个版本的下载地址分享
- python实现远程登录_python远程登录代码