ic基础|时钟篇02:关于时钟分频器的二三事

大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是已经还准备入行,看过之后都会有有一些收获,如果看完后喜欢的话就请关注我吧~谢谢~

本期内容我们围绕时钟分频来展开,在实际项目中,我们在从锁相环(pll)中得到了主时钟后,通常会对其进行分频处理,以得到许多频率更低的时钟。这一方面是由于时钟在芯片中不断翻转,因此会带来许多的动态功耗,另一方面是芯片中不同的模块对时钟的频率的要求不同,因此通过对时钟分频,并以更低的时钟驱动电路,我们可以在保证芯片各个模块正常工作的前提下,降低影响芯片的功耗,并且在不同的工作条件下使用不同的分频比,使得芯片保持稳定的性能。

一、偶数分频

首先,我们来聊聊最为基础的偶数分频,通常来说,我们可以直接使用计数器对时钟进行分频,verilog代码如下所示:

module even_divider
#(parameter DIV_WIDTH = 8    
)
(input  wire                 clk_src,input  wire                 rst_n  ,input  wire [DIV_WIDTH-1:0] div_cfg,output reg                  clk_div
);reg [DIV_WIDTH-1:0] div_cnt;wire div_cnt_full; //计数满wire div_cnt_half; //计数到一半wire div_cnt_zero;reg clk_div_int;assign div_cnt_full = (div_cnt==div_cfg);assign div_cnt_half = (div_cnt=={1'b0,div_cfg[DIV_WIDTH-1:1]});assign div_cnt_zero = ~(|div_cfg);always @(posedge clk_src or negedge rst_n) beginif (!rst_n) begindiv_cnt <= {DIV_WIDTH{1'b0}};        end else if (div_cnt_full | div_cnt_zero) begin div_cnt <= {DIV_WIDTH{1'b0}};end else begindiv_cnt <= div_cnt + 1'b1;end        endalways @(posedge clk_src or negedge rst_n) beginif (!rst_n) beginclk_div_int <= 1'b1;end else if (div_cnt_zero) beginclk_div_int <= 1'b1;end else if (div_cnt_full | div_cnt_half) begin        clk_div_int <= ~clk_div;endendwire clk_sel = div_cnt_zero; //若是不分频,则选择源时钟,否则选择分频后的时钟clk_mux2 clk_mux2_inst(.in0(clk_div_int),.in1(clk_src),.s  (clk_sel),.q  (clk_div));endmodule

以上是产生50%偶数分频的verilog代码,简单解释一些:

通过div_cfg选择需要的分频比,例如:当分频比为0时,视为不分频,通过clk_mux2选择源时钟进行输出。当为1时,则为2分频,3时为4分频,5时为6分频,以此类推。使用计数器div_cnt进行计数,当计数达到配置值的一半或者全部时,分频时钟clk_div翻转。

2分频时的仿真结果如下所示:
在这里插入图片描述
可见,和我们设计目标一致,当div_cnt为1时,输出2分频时钟。

二、奇数分频

奇数分频相对于偶数分频要稍微复杂一些,如果我们不需要生成50%占空比的时钟,我们可以直接通过计数来产生所需的时钟。

如果要得到具有50%占空比的时钟,我们不能直接使用计数器生成时钟。我们可以基于时钟双边沿特性,首先以期望输出频率生成两个占空比不为50%的时钟(分别由时钟的上升沿和下降沿产生),它们的高低电平只差一个周期,然后再利用或操作或者与操作对生成的两个时钟进行处理,产生具有50%占空比的奇数分频时钟,具体操作如下所示:

module odd_divider
#(parameter DIV_WIDTH = 8    
)
(input  wire                 clk_src,input  wire                 rst_n  ,input  wire [DIV_WIDTH-1:0] div_cfg,output wire                 clk_div
);reg [DIV_WIDTH-1:0] div_cnt;wire div_cnt_full;wire div_cnt_half;wire div_cnt_zero;reg clk_div_int0;reg clk_div_int1;assign div_cnt_full = (div_cnt==(div_cfg-1'b1));assign div_cnt_half = (div_cnt==({1'b0,div_cfg[DIV_WIDTH-1:1]}-1'b1));always @(posedge clk_src or negedge rst_n) beginif (!rst_n) begindiv_cnt <= {DIV_WIDTH{1'b0}};        end else if (div_cnt_full) begin div_cnt <= {DIV_WIDTH{1'b0}};end else begindiv_cnt <= div_cnt + 1'b1;end        endalways @(posedge clk_src or negedge rst_n) beginif (!rst_n) beginclk_div_int0 <= 1'b1;end else if (div_cnt_full) begin        clk_div_int0 <= 1'b0;end else if (div_cnt_half) beginclk_div_int0 <= 1'b1;endendalways @(negedge clk_src or negedge rst_n) beginif (!rst_n) beginclk_div_int1 <= 1'b1;end else if (div_cnt_full) begin        clk_div_int1 <= 1'b0;end else if (div_cnt_half) beginclk_div_int1 <= 1'b1;endendand2_wrp and2_inst (.a (clk_div_int1),.b (clk_div_int2),.q (clk_div));endmodule

仿真如下所示:
在这里插入图片描述
现在我们结合上图来解释产生奇数分频的原理:

首先,我们的目标是产生3分频时钟,因此我们基于源时钟的上升沿和下降沿产生了两个占空比不为50%的时钟——clk_div_int0和clk_div_int1。由于clk_div_int0和clk_div_int1有两个源时钟周期为高电平,有一个源时钟周期为低电平,且它们彼此之间只错开了半个周期,因此我们可以利用与操作,来产生具有50%占空比的3分频时钟。其他奇数分频的时钟也是同理产生。同理,我们可以基于或操作来产生3分频时钟,和上面不同的是,我们只需要生成相对于源时钟有一个时钟周期为高电平,有两个时钟周期为低电平的两个时钟即可。代码和仿真图如下所示:

module odd_divider
#(parameter DIV_WIDTH = 8    
)
(input  wire                 clk_src,input  wire                 rst_n  ,input  wire [DIV_WIDTH-1:0] div_cfg,output wire                  clk_div
);reg [DIV_WIDTH-1:0] div_cnt;wire div_cnt_full;wire div_cnt_half;wire div_cnt_zero;reg clk_div_int0;reg clk_div_int1;assign div_cnt_full = (div_cnt==(div_cfg-1'b1));//对下面的div_cnt_half 进行更改,使得生成的时钟晚一拍变为高电平assign div_cnt_half = (div_cnt==({1'b0,div_cfg[DIV_WIDTH-1:1]}));always @(posedge clk_src or negedge rst_n) beginif (!rst_n) begindiv_cnt <= {DIV_WIDTH{1'b0}};        end else if (div_cnt_full) begin div_cnt <= {DIV_WIDTH{1'b0}};end else begindiv_cnt <= div_cnt + 1'b1;end        endalways @(posedge clk_src or negedge rst_n) beginif (!rst_n) beginclk_div_int0 <= 1'b1;end else if (div_cnt_full) begin        clk_div_int0 <= 1'b0;end else if (div_cnt_half) beginclk_div_int0 <= 1'b1;endendalways @(negedge clk_src or negedge rst_n) beginif (!rst_n) beginclk_div_int1 <= 1'b1;end else if (div_cnt_full) begin        clk_div_int1 <= 1'b0;end else if (div_cnt_half) beginclk_div_int1 <= 1'b1;endend//换成或逻辑or2_wrp or2_inst (.a (clk_div_int1),.b (clk_div_int2),.q (clk_div));endmodule

在这里插入图片描述

三、半整数分频

我们同样可以基于双边沿时钟来产生半整数分频,但是这种方式无法产生具有50%占空比的时钟,下面让我们举例来说明该如何产生2.5分频的时钟:

首先,我们利用计数器,其计数器循环计数到 5。对源时钟的上升沿敏感的寄存器生成时钟clk_div_int0:当计数器计数到0或3时,使其变为高电平,其余时刻为低电平。对源时钟的下降沿敏感的寄存器生成时钟clk_div_int1:我们当计数器计数到1或3时,使其变为高电平,其余时刻为低电平。我们再对clk_div_int0和clk_div_int1进行或操作,就可以得到一个2.5分频的时钟了。

上述过程的仿真图如下所示:
在这里插入图片描述

其对应的verilog如下所示:

module even_divider
#(parameter DIV_WIDTH = 8    
)
(input  wire                 clk_src,input  wire                 rst_n  ,input  wire [DIV_WIDTH-1:0] div_cfg,output wire                 clk_div
);reg [DIV_WIDTH-1:0] div_cnt;wire div_cnt_full;wire div_cnt_half;wire div_cnt_zero;reg clk_div_int0;reg clk_div_int1;assign div_cnt_full = (div_cnt==(div_cfg-1'b1));assign div_cnt_half = (div_cnt==({1'b0,div_cfg[DIV_WIDTH-1:1]}));always @(posedge clk_src or negedge rst_n) beginif (!rst_n) begindiv_cnt <= {DIV_WIDTH{1'b0}};        end else if (div_cnt_full | div_cnt_zero) begin div_cnt <= {DIV_WIDTH{1'b0}};end else begindiv_cnt <= div_cnt + 1'b1;end        endalways @(posedge clk_src or negedge rst_n) beginif (!rst_n) beginclk_div_int0 <= 1'b0;end else if ((div_cnt==1'b0) || (div_cnt==(div_cfg/2+1))) beginclk_div_int0 <= 1'b1;end else beginclk_div_int0 <= 1'b0;endendalways @(negedge clk_src or negedge rst_n) beginif (!rst_n) beginclk_div_int1 <= 1'b0;end else if ((div_cnt==1'b1) || (div_cnt==(div_cfg/2+1))) beginclk_div_int1 <= 1'b1;end else beginclk_div_int1 <= 1'b0;endendor2_wrp or2_inst (.a (clk_div_int1),.b (clk_div_int2),.q (clk_div));endmodule

四、总结

本篇文章我们对一些常见的时钟分频器,比如偶数分频器、计数分频器、半整数分频器进行了介绍。我们可以基于计数器、上升沿敏感的触发器和下降沿敏感的触发器来产生我们不同分频比的时钟。

如果你喜欢这篇文章的话,请关注我的公众号-熊熊的ic车间,里面还有ic设计和ic验证的学习资料和书籍等着你呢~欢迎您的关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/8764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发八:STM32启动过程分析

本次给大家分析 STM32F4 的启动过程&#xff0c;这里的启动过程是指从 STM32 芯片上电复位执行的第一条指令开始&#xff0c;到执行用户编写的 main 函数这之间的过程。我们编写程序&#xff0c;基本都是用 C 语言编写&#xff0c;并且以 main 函数作为程序的入口。但是事实上&…

1.使用uniapp搭建微信小程序项目并引入前端组件资源

文章目录 1. 项目配置1.1. 新建vue3项目1.2. 关联云空间1.3. 运行到微信开发者工具 2. 前端组件2.1. uniCloud的内置组件和扩展组件2.2. uView3.02.3. 在uniapp项目引入uview3 1. 项目配置 1.1. 新建vue3项目 由于我们要使用vue3而不是vue2&#xff0c;所以要选好版本&#x…

【GPT调用】本地使用python调用GPT接口

python调用GPT接口 环境变量设置主调用方法执行结果 环境变量设置 .env文件中配置GPT环境变量 api_key"你的GPT-API-KEY" urlhttps://ai-proxy.ksord.com/wps.openai.azure.com/openai/deployments/gpt-4-32k/chat/completions?api-version2023-09-01-preview主调…

中国结(科普)

中国结是一种手工编织工艺品&#xff0c;它身上所显示的情致与智慧正是汉族古老文明中的一个侧面。 [1]它原本是由旧石器时代的缝衣打结&#xff0c;后推展至汉朝的仪礼记事&#xff0c;再演变成今日的装饰手艺。周朝人随身的佩戴玉常以中国结为装饰&#xff0c;而战国时代的铜…

1756jsp农产品销售管理系统Myeclipse开发mysql数据库C2C模式java编程计算机网页项目沙箱支付

一、源码特点 java 农产品销售管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0…

天龙怀旧游戏python脚本

设置图&#xff1a; 游戏窗口最大化。 海贼洞这里定位你要回点的定位。 运行bat就行&#xff0c;脚本出错了还是会重新运行脚本&#xff0c;运行自动启动&#xff0c;end暂停脚本&#xff0c;home重新启动脚本 1. 我常用的是内挂回点脚本&#xff0c; 下面都是前台脚本&…

Python-100-Days: Day09 Object-oriented programming(OOP) Upgrade

1.property装饰器 之前有讨论过&#xff0c; Python中属性和方法访问权限的问题&#xff0c;不建议将属性设置为私有的&#xff0c;倘若直接将属性暴露给外界也是存在问题的。例如&#xff0c;我们没有办法检查赋给属性的值是否有效。之前的建议是将属性命名以单下划线开头&am…

C#贪吃蛇

C#贪吃蛇 文章目录 Program.csText1Game.csISceneUpdate.csText2BeginScene.csBegionOrEndScene.csEndScene.csGameScene.csText3GameObject.csIDraw.csPosition.csText4Food.csSnakeBody.csWall.csText5Map.csText6Snake.csProgram.cs using 贪吃蛇.Text1;Game game = new Ga…

java语言数据结构(单链表)

前言 不得承认java应用的广泛&#xff0c;所以毅然决定java版本的数据结构和算法专题还是要坚决更新。每日更新2题&#xff0c;希望学习的小伙伴可以关注一波跟上&#xff0c;评论区欢迎讨论交流。 实现原理 节点&#xff08;Node&#xff09;&#xff1a;链表的基本构建单元…

ElementUI Select选择器多选获取选中对象

html <el-form-item label"账户标签&#xff1a;" prop"tags"><el-selectstyle"width: 500px"value-key"tagId"v-model"form.tags"clearablefilterablemultipleplaceholder"请搜索选择账户标签"><…

网络基础-ARP协议

ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是一种用于将IP地址映射到物理MAC地址的协议&#xff1b;在计算机网络中&#xff0c;每个设备都有一个唯一的MAC地址&#xff0c;用于在局域网内进行数据通信。而IP地址则是用于在更大范围的网…

每日一题——力扣面试题 17.04. 消失的数字

题目链接&#xff1a;https://leetcode.cn/problems/missing-number-lcci/description/ 菜鸡做法&#xff1a; #include <stdlib.h> // 包含标准库头文件&#xff0c;用于内存分配等功能// 函数定义&#xff1a;寻找缺失的数字 int missingNumber(int* nums, int numsSi…

基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................. % figure; % subplot(121);…

Visual Studio C++ 2019进行安装

Visual Studio C 2019进行下载安装 链接&#xff1a;https://my.visualstudio.com/Downloads?qvisual%20studio%202017&wt.mc_idomsftvscom~older-downloads

SwiGLU激活函数

SwiGLU激活函数已经成为LLM的标配了。它是GLU的变体&#xff0c;公式如下&#xff1a; SwiGLU ⁡ ( x , W , V , b , c , β ) Swish ⁡ β ( x W b ) ⊗ ( x V c ) \operatorname{SwiGLU}(x, W, V, b, c, \beta)\operatorname{Swish}_\beta(x Wb) \otimes(x Vc) SwiGLU(x,…

开源免费的发票识别OCR应用:Invoice

Invoice&#xff1a;轻松识别&#xff0c;发票电子化扫描烦恼消- 精选真开源&#xff0c;释放新价值。 概览 Invoice 是github社区上一个采用开源许可协议发布的增值税发票光学字符识别&#xff08;OCR&#xff09;解决方案项目。该项目不仅集成了预训练的高级模型&#xff0c…

Python | Leetcode Python题解之第78题子集

题目&#xff1a; 题解&#xff1a; class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:self.res []self.backtrack([], 0, nums)return self.resdef backtrack(self, sol, index, nums):self.res.append(sol)for i in range(index, len(nums)):self…

Jenkins +git +web(vue) centos8.5 实战打包部署 运维系列二

1新建一个工程 #cat qy.sh #!/bin/bash cd /data/.jenkins/workspace/web rm -rf dist/ rm -rf qysupweb.tar.gz npm run build tar -czvf qysupweb.tar.gz dist/ #点击构建

基于控制工程的牛鞭效应simulink建模与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 牛鞭效应”对供应链性能和绩效产生了严重的影响。基于控制理论建立了多级线性供应链的模型&#xff0c;分别利用噪声带宽和Matlab&#xff0f;Simulink对一个可扩…

平航杯复现

简单介绍及前期操作 esxi镜像挂载是一个新的创新点 就根据官方的wp进行挂载就可以了&#xff0c;后面差不多常规的服务器取证操作&#xff0c;然后服务器和计算机&#xff0c;u盘取证都有点联系&#xff0c;还是需要队友配合好一点 配置网段我的建议是把本机的配置改一下&am…