【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真

简介: 【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真

cb39282b8fb147aaa3a300f70d43c278.png

一、前言


本系列旨在提供100%准确的数字IC设计/验证手撕代码环节的题目,原理,RTL设计,Testbench和参考仿真波形,每篇文章的内容都经过仿真核对。快速导航链接如下:


1.奇数分频

2.偶数分频

3.半整数分批

4.小数/分数分频

5.序列检测器

6.模三检测器

7.饮料机

8.异步复位,同步释放

9.边沿检测(上升沿,下降沿,双边沿)

10.全加器,半加器

11.格雷码转二进制

12.单bit跨时钟域(打两拍,边沿同步,脉冲同步)

13.奇偶校验

14.伪随机数生成器[线性反馈移位寄存器]

15.同步FIFO

16.无毛刺时钟切换电路


应当说,手撕代码环节是面试流程中既重要又简单的一个环节,跟软件类的岗位相比起来,数字IC的手撕代码题目固定,数量有限,属于整个面试中必得分的一个环节,在这个系列以外,笔者同样推荐数字IC求职者使用“HdlBits”进行代码的训练

链接如下

HDLBits — Verilog Practice


二、题目


为了SOC设计的低功耗性,多时钟域的划分是常用手段之一,有两个时钟,A为50Mhz,B为100Mhz,请设计无毛刺时钟切换电路,根据控制信号control,输出所需时钟信号。


三、原理


3.1 有毛刺时钟切换

想要切换时钟电路,最简单的方法肯定是使用一个MUX,control作为控制信号

control=1,clk_output = clk_50M,

control=0,clk_output =clk_100M,

image.png

但是这种做法会存在毛刺问题,如图所示,当control信号转换的边缘时,假如clk_50M与clk_100M的边沿没对准,就有可能出现毛刺,影响时钟质量

d16a884819d94c4f9d4a96b4592b7ab6.png

因此我们需要无毛刺时钟切换电路的帮助,进入下一节


3.2 无毛刺时钟切换

首先我们需要明确的是,毛刺发生的原因


control信号至少对一个时钟信号为异步信号,导致了毛刺的出现,假如control,clk_50M,还是clk_100M都是边沿完全同步的理想信号话,应该是不会出现毛刺的。


所以避免毛刺发生的方法顺理成章地过渡到了“异步信号同步化”这个理论上面,如何做同步呢?


毫无疑问,肯定是需要打拍/采样的方式


上升沿同步还是下降沿同步呢?


这里是上升沿打拍还是下降沿打拍其实是因电路而异的一个问题,我们假如希望最终用与门处理时钟信号和控制信号

即:当control信号为1时,按照时钟输出,control信号为0,输出为0(即相与逻辑)

没有电路会是完全理想的边沿完全同步的信号

假如是上升沿同步control信号,同步的control会比clk的边沿稍微慢一点点,二者相与,肯定会出现毛刺

假如是下降沿同步control有效信号,下降沿到来时,control被同步后为1,clk此时为0,二者相与为0,上升沿到来时,control保持,clk为1,二者相与为1,无毛刺出现,所以用与逻辑的时候,需要采用下降沿去做触发。


只打一拍,够吗?


不够,若control信号的改变恰好在采样边沿,会存在出现亚稳态的风险,所以我们可以打两拍。第一拍可以采用上升沿,第二拍可以采用下降沿。


那只打拍,够吗?


不够,为什么不够呢?

因为只打拍,只能保证各自的控制信号是同步的,无毛刺,但是不能保证切换不产生毛刺,所以我们还需要增加电路来处理切换的过程,假如我们可以在切换的时候排除相邻时钟的影响,是不是就可以完美确保无毛刺的出现了?


所以以下这张图片可以登场了

c5d425871ea5413f951e59d92240cdad.png

control信号无论是从上面通过还是从下面通过,都经过两级采样,避免了亚稳态的出现

后一级的DFF用下降沿采样,避免了采样毛刺的出现

第二级DFF的not Q的逻辑以负反馈的形式接回了输入,取了与逻辑,构建起50M时钟和100M时钟的关系,代表着切换前时钟等待一阵子后,才会转换到切换后时钟,避免了切换毛刺的出现

最终上面的电路和下面的电路,以或的逻辑相取,输出clk_output.


四、RTL设计


module free_glitch(clk_50M,clk_100M,control,rst_n,clk_output);
input clk_50M; // clock with 50M frequency
input clk_100M; // clock with 100M frequency
input control; // control signal
input rst_n; // reset signal
output clk_output; // output clock
reg clk_50_r1; // register for 50M clock
reg clk_50_r2;
reg clk_100_r1;// register for 100M clock
reg clk_100_r2;
wire logic_50_ctl; // logic "and" before DFF_r1 for 50M clock
wire logic_100_ctl; // logic "and" before DFF_r2 for 100M clock
assign logic_50_ctl  =  control & !clk_100_r2; // generate logic
assign logic_100_ctl = !control & !clk_50_r2; // generate logic
always@(posedge clk_50M or negedge rst_n)
  if(!rst_n)
  clk_50_r1 <= 1'b0;
  else
  clk_50_r1 <= logic_50_ctl;
always@(negedge clk_50M or negedge rst_n)
  if(!rst_n)
  clk_50_r2 <= 1'b0;
  else
  clk_50_r2 <= clk_50_r1;
always@(posedge clk_100M or negedge rst_n)
  if(!rst_n)
  clk_100_r1 <= 1'b0;
  else  
  clk_100_r1 <= logic_100_ctl;
always@(negedge clk_100M or negedge rst_n)
  if(!rst_n)
  clk_100_r2 <= 1'b0;
  else
  clk_100_r2 <= clk_100_r1;
assign clk_output = (clk_100_r2&clk_100M) | (clk_50_r2&clk_50M ); // generate final signal clock output
endmodule


五、仿真


`timescale 1ns / 1ps
module free_glitch_tb();
reg clk_50M;
reg clk_100M;
reg control;
reg rst_n;
wire clk_output;
free_glitch u1(clk_50M,clk_100M,control,rst_n,clk_output);
always #5 clk_100M = !clk_100M;
always #10 clk_50M = !clk_50M;
initial
begin
clk_100M = 0;
clk_50M = 1;
rst_n = 1;
control = 1;
#100
rst_n = 0;
#50
rst_n = 1;
#100
control =0;
#100
control =1;
#128
control = 0;
end
endmodule


六、仿真分析


2222d0b1a1e94da18940b0bfe922a070.png

我们可以发现,当control变化后,有一段时间的延时,时钟信号才切换至目标的时钟处,就是这段延时的出现,确保了没有毛刺的出现,设计符合需求

相关文章
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog小数分频|题目|原理|设计|仿真
|
C语言
蓝桥杯之单片机学习(二十六)——模拟风扇控制系统(附题目和完整代码)
蓝桥杯之单片机学习(二十六)——模拟风扇控制系统(附题目和完整代码)
299 0
蓝桥杯之单片机学习(二十六)——模拟风扇控制系统(附题目和完整代码)
【数字IC手撕代码】Verilog边沿检测电路(上升沿,下降沿,双边沿)|题目|原理|设计|仿真
【数字IC手撕代码】Verilog边沿检测电路(上升沿,下降沿,双边沿)|题目|原理|设计|仿真
【数字IC手撕代码】Verilog边沿检测电路(上升沿,下降沿,双边沿)|题目|原理|设计|仿真
【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真
【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真
【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真
【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog半整数分频|题目|原理|设计|仿真
【数字IC手撕代码】Verilog同步FIFO|题目|原理|设计|仿真
【数字IC手撕代码】Verilog同步FIFO|题目|原理|设计|仿真
【数字IC手撕代码】Verilog同步FIFO|题目|原理|设计|仿真
【数字IC手撕代码】Verilog轮询仲裁器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog轮询仲裁器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog轮询仲裁器|题目|原理|设计|仿真
|
人工智能
【数字IC手撕代码】Verilog全加器半加器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog全加器半加器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog全加器半加器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog异步复位同步释放|题目|原理|设计|仿真
【数字IC手撕代码】Verilog异步复位同步释放|题目|原理|设计|仿真
【数字IC手撕代码】Verilog异步复位同步释放|题目|原理|设计|仿真
|
自然语言处理 算法
【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真