FPGA面试题【Verilog实现无毛刺时钟切换】

2023-10-27

目录

题目

核心思路

答案

FPGA全貌

题目

用verilog实现无毛刺时钟切换电路。

核心思路

0:无毛刺的时钟切换英文名叫:Glitch-free clock switching circuit

1:如果单纯的在sel高是选择clka输出,sel为低时选择clkb输出,那么很有可能在时钟切换的时刻出现毛刺,这甚至会导致电路故障。所以要进行专门的时钟切换电路的设计,保证电路切换中不会有毛刺的出现,这一根本原理在时钟切换过程中,要在原时钟和待切换时钟的低电平进行切换。


2:

clk0和clk1是无关时钟,如何实现二者之间的一个无毛刺切换是接下来需要解决的问题?

先从最容易相当的设计说起:

可以使用纯组合逻辑来设计时钟切换电路,但是这种设计不可避免的产生毛刺:

如下,两种一个道理:

 

如何改进这种设计呢?

相关时钟源的时钟切换电路:

 从前面组合逻辑时钟切换电路的设计,我们得出的切换波形如上:

可见,会产生毛刺,而产生毛刺的原因在于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为无毛刺的时钟切换波形。

参考文章:

无毛刺的时钟切换电路(Glitch-free clock switching circuit)设计(Verilog)_glitch free clock switch and or_李锐博恩的博客-CSDN博客Glitch free 无毛刺时钟切换电路、时钟无缝切换、时钟无毛刺切换技术_Cheeky_man的博客-CSDN博客

答案

verilog

module glitch_free (
	input clk0,    // Clock
	input clk1,
	input select,
	input rst_n,  // Asynchronous reset active low
	
	output 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) begin
		if(~rst_n) mid_clk1_r1 <= 0;
		else mid_clk1_r1 <= mid_clk1;
	end
 
	//第二级触发器用下降沿采样
	always@(negedge clk1 or negedge rst_n) begin
		if(~rst_n) begin
			mid_clk1_r2 <= 0;
			mid_clk1_r2n <= 1;
		end
		else begin
			mid_clk1_r2 <= mid_clk1_r1;
			mid_clk1_r2n <= ~mid_clk1_r1;
		end
	end
 
 
	//第一级触发器用上升沿采样,选择信号与反馈信号的与运算
	always@(posedge clk0 or negedge rst_n) begin
		if(~rst_n) mid_clk0_r1 <= 0;
		else mid_clk0_r1 <= mid_clk0;
	end
 
	//第二级触发器用下降沿采样
	always@(negedge clk0 or negedge rst_n) begin
		if(~rst_n) begin
			mid_clk0_r2 <= 0;
			mid_clk0_r2n <= 1;
		end
		else begin
			mid_clk0_r2 <= mid_clk0_r1;
			mid_clk0_r2n <= ~mid_clk0_r1;
		end
	end
 
	wire 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 begin
    clk0 = 0;
    forever
    #2 clk0 = ~clk0;
    end
    
    initial begin
    clk1 = 0;
    forever
    #5 clk1 = ~clk1;
    end
    
    
    reg rst_n;
    reg in;
    initial begin
    select = 0;
    rst_n = 0;
    #5
    rst_n = 1;
    #30
    select = 1;
    #40
    select = 0;
    
    
    end
    
    
    
   	glitch_free inst_glitch_free (.clk0(clk0), .clk1(clk1), .select(select), .rst_n(rst_n), .clkout(clkout));
 
      
    
endmodule

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA面试题【Verilog实现无毛刺时钟切换】 的相关文章

  • 机器视觉与计算机视觉的区别

    机器视觉 Machine Vision MV 与计算机视觉 Computer Vision CV 两者既有联系又有区别 机器视觉与计算机视觉有很多相似之处 在架构上都是基础层 技术层 应用层 并且两者的基本理论框架 底层理论 算法等是相似的
  • netstat命令详解

    点击上方蓝字 快速关注 netstat命令用于显示与IP TCP UDP和ICMP协议相关的统计数据 一般用于检验本机各端口的网络连接情况 netstat是在内核中访问网络及相关信息的程序 它能提供TCP连接 TCP和UDP监听 进程内存管
  • 如何使用VSCode开发Qt项目?

    如何使用VSCode开发Qt项目 为何使用VSCode开发Qt项目 因为Qt自带的编辑器丑丑丑 颜值时代还得是vscode大妹子 最终效果预览 前期准备 一 环境工具 Qt 5 15 2 含MingW64构建工具 Visual Studio

随机推荐

  • #define 定义符号常量方法

    程序设计预算法 1 第二周题目如下 对于半径为r的球 其体积的计算公式为V 4 3 r3 这里取 3 14 现给定r 求V 输入 输入为一个不超过100的非负实数 即球半径 类型为double 输出 输出一个实数 即球的体积 保留到小数点后
  • 为什么fork函数创建的进程不能用return函数结束进程

    在C语言中 fork 函数用于创建一个新的进程 它会复制当前进程的副本 并在父进程和子进程中返回不同的值 当调用fork 函数时 操作系统会创建一个子进程 该子进程是父进程的副本 父进程和子进程都从fork 函数返回 并且分别得到一个返回值
  • 按规则合并多个长度不同的数组

    现有多组整数数组 需要将他们合并成一个新的数组 合并规则 从每个数组中按顺序取出固定长度的内容合并到新的数组中 取完的内容要删除掉 如果改行不足固定长度或者已经为空 则直接取出剩余部分的内容放到新的数组中 继续下一行 输入描述 第一行是每次
  • 单隐层神经网络

    这是单隐层神经网络的一些知识 那么话不多说 开始学习 单隐层神经网络与Logistic回归 让我们来回顾一下Logistic回归的流程图 这是样本集的一次Logistic回归计算 这其实可以被抽象为一个神经元接收样本集x 然后输出预测集y帽
  • linux进程处于e,linux进程后台运行的几种方法--转载

    我们经常会碰到这样的问题 用 telnet ssh 登录了远程的 Linux 服务器 运行了一些耗时较长的任务 结果却由于网络的不稳定导致任务中途失败 如何让命令提交后不受本地关闭终端窗口 网络断开连接的干扰呢 下面举了一些例子 您可以针对
  • Windows的蓝色生死符

    破解Windows的蓝色生死符 为什么Windows 2K XP会蓝屏 NT内核的操作系统采用的是分层结构 层又称为模式 主要有用户层 User Mode 和内核层 Kernel Mode 我们可以通过下面这个形象的比喻来理解Windows
  • 人体姿态估计总结

    Flowing ConvNets for Human Pose Estimation in Videos 2015 年 flow convnet 将姿态估计看作是检测问题 输出是 heatmap 其创新点在于从卷积神经网络的 3 和 7 层
  • Mindshow+gpt辅助生成ppt

    步骤如下 先使用GPT生成需要的文本 再用Mindshow生成ppt MindShow 快速演示你的想法 gpt描述技巧 1 输入的问题 Prompt 越详细 具体 ChatGPT回复的内容相应地会越精准 2 有任何需求都可以描述进去 3
  • 2015年Spring会议季-DotNetFringe,AngleBrackets,BUILD等!

    What a lovely time we had at DotNetFringe last week here in my hometown of Portland Wonderful speakers great topics good
  • 史上最详细的typescript入门教程

    什么是Typescript TypeScript是JavaScript类型的超集 它可以编译成纯JavaScript TypeScript可以在任何浏览器 任何计算机和任何操作系统上运行 并且是开源的 配置Typescript环境 安装Ty
  • Vector 容器快速删除方法

    vector是一个向量容器 在C 开发中经常会使用到 vector本身自带的删除函数有 iterator erase iterator it 删除向量中迭代器指向元素 iterator erase iterator first iterat
  • transUnet

    TransUNet Transformers Make Strong Encoders for Medical Image Segmentation 背景 医学图像分割是开发医疗保健系统 尤其是疾病诊断和治疗计划 的必要前提 问题 U Ne
  • 谷歌发布 Chrome 85 稳定版,引入 PGO,页面加载速度提升 10%

    转自 开源中国 谷歌今日发布了最新稳定版 Chrome 85 此版本将页面加载速度提高了 10 并带来了许多标签页方面的改进 以及提供了一系列开发者功能 可直接使用 Chrome 内置更新程序升级或从 Chrome 官网下载 页面加载速度提
  • 万亿条数据查询毫秒级响应

    深入探讨如何在如此大量的数据上保持毫秒级的查询响应时间 以及 TiDB 是一个开源的 MySQL 兼容的 NewSQL 混合事务 分析处理 HTAP 数据库 如何为我们提供支持获得对我们数据的实时洞察 系统架构要求 知乎的 Post Fee
  • 我把海外抖音TikTok当副业,一周赚了7000块:想给有梦想的人提个醒!

    前2天 月薪1万与10万的差距上了热搜 迅速达到了3 7亿的阅读量 文章指出 在上海 月工资1万的人 房租2500 吃饭3000 各种杂七杂八费用3000 一个月只剩1500 月工资10万的人 在这个生活成本的基础上 哪怕乘以3 也不过25
  • 计算机计算涨跌的公式,计算股票涨跌的神器—四段五点模型计算器

    很多朋友都很想知道自己手中的股票会涨到哪里 知道了自己手中的股票能够涨到哪里 也就知道了在什么价位卖出 卖出个好价钱 下面我就给朋友们介绍一种计算器 四段五点计算器 一 四段五点的概念 所谓的四段五点是指股票在上涨的过程中 一般会经过SH段
  • python 坐标移动

    题目描述 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 从 0 0 点开始移动 从输入字符串里面读取一些坐标 并将最终输入结果输出到输出文件里面 输入 合法坐标为A 或者D或者W或者S 数字 两位以内
  • 在Qt中如何使用QtDesigner创建的UI文件(一)

    使用Qt有一些时间了 一直在IDE环境 qtcreator和VS2003 集成器 中使用 自然少了很多麻烦的步骤 但是在享受这种便利的同 时 我们也失去了理解更多知识背后的点滴 在IDE中 如果我们要开发一个对话框 通常是使用 新建 gt
  • 卷积神经网络 手势识别_如何构建识别手语手势的卷积神经网络

    卷积神经网络 手势识别 by Vagdevi Kommineni 通过瓦格德维 科米尼 Vagdevi Kommineni 如何构建识别手语手势的卷积神经网络 How to build a convolutional neural netw
  • FPGA面试题【Verilog实现无毛刺时钟切换】

    目录 题目 核心思路 答案 FPGA全貌 题目 用verilog实现无毛刺时钟切换电路 核心思路 0 无毛刺的时钟切换英文名叫 Glitch free clock switching circuit 1 如果单纯的在sel高是选择clka输