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

这篇具有很好参考价值的文章主要介绍了【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球
四社区联合力荐!近500篇数字IC精品文章收录
【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍

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

一、前言

本系列旨在提供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,
【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真
但是这种做法会存在毛刺问题,如图所示,当control信号转换的边缘时,假如clk_50M与clk_100M的边沿没对准,就有可能出现毛刺,影响时钟质量
【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真
因此我们需要无毛刺时钟切换电路的帮助,进入下一节

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信号的改变恰好在采样边沿,会存在出现亚稳态的风险,所以我们可以打两拍第一拍可以采用上升沿,第二拍可以采用下降沿。

那只打拍,够吗?

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

所以以下这张图片可以登场
【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真

  1. control信号无论是从上面通过还是从下面通过,都经过两级采样,避免了亚稳态的出现
  2. 后一级的DFF用下降沿采样,避免了采样毛刺的出现
  3. 第二级DFF的not Q的逻辑以负反馈的形式接回了输入,取了与逻辑,构建起50M时钟和100M时钟的关系,代表着切换前时钟等待一阵子后,才会转换到切换后时钟,避免了切换毛刺的出现
  4. 最终上面的电路和下面的电路,以或的逻辑相取,输出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

六、仿真分析

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

我们可以发现,当control变化后,有一段时间的时,时钟信号才切换至目标的时钟处,就是这段延时的出现,确保了没有毛刺的出现,设计符合需求文章来源地址https://www.toymoban.com/news/detail-402334.html

到了这里,关于【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字IC经典电路(4)——经典滤波器的实现(滤波器简介及Verilog实现)

    数字滤波器一般可以分为两类:有限冲激响应(FIR)滤波器和无限冲激响应(IIR)滤波器。 在Verilog综合方面,通常可以实现四种数字滤波器: 基于时域采样的FIR滤波器(Time Domain Sampling FIR Filter) 快速傅里叶变换(FFT)算法实现的FIR滤波器(FFT-based FIR Filter) 直接IIR滤波器

    2024年02月09日
    浏览(34)
  • 数字IC经典电路(1)——经典加法器的实现(加法器简介及Verilog实现)

    加法器是数字系统最基础的计算单元,用来产生两个数的和,加法器是以二进制作运算。负数可用二的补数来表示,减法器也是加法器,乘法器可以由加法器和移位器实现。加法器和乘法器由于会频繁使用,因此加法器的速度也影响着整个系统的计算速度。对加法器的设计也

    2024年02月14日
    浏览(38)
  • 数字IC经典电路(2)——经典乘法器的实现(乘法器简介及Verilog实现)

    数字电路中乘法器是一种常见的电子元件,其基本含义是将两个数字相乘,并输出其乘积。与加法器不同,乘法器可以实现更复杂的运算,因此在数字电路系统中有着广泛的应用。 乘法器的主要用途是在数字信号处理、计算机科学以及其他数字电路应用中进行精确的数字乘法

    2024年02月06日
    浏览(44)
  • 【数字IC/FPGA】百度昆仑芯手撕代码--累加器

    已知一个加法器IP,其功能是计算两个数的和,但这个和延迟两个周期才会输出。现在有一串连续的数据输入,每个周期都不间断,试问最少需要例化几个上述的加法器IP,才可以实现累加的功能。 由于加法器两个周期后才能得到结果(再将该结果作为加法器的输入进行累加

    2024年02月09日
    浏览(28)
  • 数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)

     前言:         本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。 目录如下: 1.数字IC手撕代码-分频器(任意偶数分频) 2.数字IC手撕代码-分频器(任意奇数分频) 3.数字IC手撕代码-分

    2024年02月02日
    浏览(31)
  • verilog手撕代码2——各种加法器介绍——真值表、表达式、电路图

    2023.4.25 两个数直接相加,无进位,真值表如下 两个数和进位一起相加,根据真值表画出卡诺图,对表达式进行化简 用两个半加器来组成一个全加器 原理 : N bit的加法器由N个1 bit的全加器组成 。从低位开始,逐位相加, 每一bit需要等待前面计算出来得到进位,才能进行下一

    2024年02月01日
    浏览(35)
  • FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)

    一、实现功能 1. 能正常完成时钟的时、分、秒走时; 2. 使用 LED 闪烁或者改变颜色等方式实现秒的指示,要求闪烁频率或者颜色切换频率为 1Hz ; 3. 使用两位七段数码管显示时和分,其切换方式为:默认显示“分钟”,按住 K4 键显示“小时”,按下 K3 显示秒针; 4. 关上开关

    2024年02月11日
    浏览(42)
  • 【数字IC/FPFA】时序约束--时钟约束

    时钟周期约束,顾名思义,就是我们对时钟的周期进行约束,这个约束是我们用的最多的约束了,也是最重要的约束。 下面我们以vivado中的时钟约束为例,介绍时钟约束的相关内容。 在Vivado中我们通过使用create_clock来创建时钟周期约束。使用方法如下: 其中,参数name为创建

    2024年02月03日
    浏览(32)
  • IC验证必备的数字电路基础知识(三):时序逻辑电路

    参考教材:数字电路与逻辑设计(第2版)邬春明 目录 1. 边沿触发器(D触发器) 2. 时序电路描述/构成 3. 时序逻辑电路的功能描述方法 组合逻辑电路掌管了电路中的逻辑运算,基本单元是与或非门。而时序逻辑电路则掌管了电路中数据的存储。触发器就是构成时序逻辑电路

    2024年02月09日
    浏览(35)
  • IC面试常考题 Verilog三分频电路设计(占空比50%,三分之一,三分之二)

    实现三分频电路最简单的是: 利用计数器实现。 时序图分析(本人比较懒,平常科研忙,所以直接手画时序图了,懒得用软件画了): 直接上图分析:利用计数器每隔三个周期信号翻转一次,同时在不同的计数下翻转得到的同步信号 clk_1和clk_2,再利用异或即可实现出一个

    2024年02月16日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包