上一篇文章讲解了如何进行任意的奇分频和任意的偶分频,这篇文章主要讲解占空比为50%的任意整数分频(奇分频和偶分频),下面首先以6分频和5分频来回顾一下奇偶分频。

偶分频

偶分频时最简单的,通过下图就可以很好的理解,其中只需要两个always块,其中一个用来计数,计数器每次计数到5,然后清零重新计数,第二个always块用来产生分频时钟,假设初始状态为高电平,当计数到2时,将信号拉低,当计数到5时,将信号拉高。

那么对于任意的偶分频,如何确定cnt的最大值,如何确定div_clk信号什么时候拉低,什么时候拉高呢,通过6分频的分析,我们看到,当cnt计数到6-1时,给cnt信号清零,并且当cnt=6-1时将div_clk拉高,当计数到(6-1)/2时,将div_clk拉低。因此,假设现在要进行n分频,n为偶数,则cnt 的最大值为n-1,当cnt计数到n-1时,将div_clk拉高,当cnt计数到(n-1)/2时,将div_clk拉低。

代码如下:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2021 All rights reserved
// -----------------------------------------------------------------------------
// Author : dongtaolv
// Email  : tdlv@stu.xidian.edu.cn
// File   : even_divider.v
// Create : 2021-04-26 19:59:35
// Revise : 2021-04-26 19:59:35
// Editor : sublime text3, tab size (4)
// -----------------------------------------------------------------------------
module even_divider #(parameter DIVIDER_NUMBER = 6
)(input wire    clk,input   wire    rst,output  wire    div_clk
);reg   [3:0]   cnt;           //当分频数大于15时,此值的位数需要扩展
reg         div_clk_r;assign div_clk = div_clk_r;always @(posedge clk)beginif(rst)begincnt <= 'd0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)begincnt <= 'd0;endelse begincnt <= cnt + 1'b1;end
endalways @(posedge clk)beginif(rst)begindiv_clk_r <= 1'b1;endelse if(cnt == ((DIVIDER_NUMBER - 1'b1) >> 1))begindiv_clk_r <= 1'b0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)begindiv_clk_r <= 1'b1;end
endendmodule

6分频仿真如下:

奇分频

奇分频相对于偶分频来说比较复杂,我们首先给出5分频的图。

其中div_clk信号就是我们的5分频产生的时钟,我们可以看到,这需要在系统时钟clk的上升沿和下降沿都工作,所以,我们使用三个always块,其中一个always块和偶分频一样,用来产生计数器cnt,这个计数器在clk的上升沿计数,每次技术到4时清零,第二个always块用来产生clk,初始为高电平,该信号在clk的上升沿产生,当cnt计数到2时,将clk1信号拉低,当计数到4时,将clk1信号拉高,这个信号和偶分频产生类似,第三个always块就有区别了,他是通过clk的下降沿来产生的,也就是图中的clk2信号,初始状态为高电平,当cnt 计数到2并且clk的下降沿到来时,我们将clk2信号拉低,当cnt计数到4并且clk的下降沿到来时,我们将clk2信号拉高,最后得到的分频时钟div_clk可以通过组合逻辑得到,我们直接将clk1clk2求与运算就可以得到div_clk信号。

代码如下:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2021 All rights reserved
// -----------------------------------------------------------------------------
// Author : dongtaolv
// Email  : tdlv@stu.xidian.edu.cn
// File   : odd_divider.v
// Create : 2021-04-26 19:59:35
// Revise : 2021-04-26 19:59:35
// Editor : sublime text3, tab size (4)
// -----------------------------------------------------------------------------
module odd_divider #(parameter DIVIDER_NUMBER = 5
)(input wire    clk,input   wire    rst,output  wire    div_clk
);reg   [3:0]   cnt;           //当分频数大于15时,此值的位数需要扩展reg          clk1;
reg         clk2;always @(posedge clk)beginif(rst)begincnt <= 'd0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)begincnt <= 'd0;endelse begincnt <= cnt + 1'b1;end
endalways @(posedge clk)beginif(rst)beginclk1 <= 1'b1;endelse if(cnt == ((DIVIDER_NUMBER - 1'b1) >> 1))beginclk1 <= 1'b0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)beginclk1 <= 1'b1;end
endalways @(negedge clk)beginif(rst)beginclk2 <= 1'b1;endelse if(cnt == ((DIVIDER_NUMBER - 1'b1) >> 1))beginclk2 <= 1'b0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)beginclk2 <= 1'b1;end
endassign div_clk = clk1 && clk2;endmodule

5分频仿真如下:

任意分频

在知道如何任意奇分频和任意偶分频之后,只需要将两个结合就可以得到任意整数分频,具体代码如下:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2021 All rights reserved
// -----------------------------------------------------------------------------
// Author : dongtaolv
// Email  : tdlv@stu.xidian.edu.cn
// File   : random_divider.v
// Create : 2021-04-26 19:59:35
// Revise : 2021-04-26 19:59:35
// Editor : sublime text3, tab size (4)
// -----------------------------------------------------------------------------
module random_divider #(parameter DIVIDER_NUMBER = 5
)(input wire    clk,input   wire    rst,output  wire    div_clk
);reg   [3:0]   cnt;           //当分频数大于15时,此值的位数需要扩展
reg         div_clk_r;
reg         clk2;always @(posedge clk)beginif(rst)begincnt <= 'd0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)begincnt <= 'd0;endelse begincnt <= cnt + 1'b1;end
endalways @(posedge clk)beginif(rst)begindiv_clk_r <= 1'b1;endelse if(cnt == ((DIVIDER_NUMBER - 1'b1) >> 1))begindiv_clk_r <= 1'b0;endelse if(cnt == DIVIDER_NUMBER - 1'b1)begindiv_clk_r <= 1'b1;end
endalways @(negedge clk)beginif(rst)beginclk2 <= 1'b1;endelse if(cnt == ((DIVIDER_NUMBER - 1'b1) >> 1) && DIVIDER_NUMBER % 2 == 1'b1)beginclk2 <= 1'b0;endelse if(cnt == DIVIDER_NUMBER - 1'b1 && DIVIDER_NUMBER % 2 == 1'b1)beginclk2 <= 1'b1;end
endassign div_clk = ( DIVIDER_NUMBER % 2) ? div_clk_r && clk2 : div_clk_r;endmodule

tb文件如下:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2021 All rights reserved
// -----------------------------------------------------------------------------
// Author : dongtaolv
// Email  : tdlv@stu.xidian.edu.cn
// File   : tb_random_divider.v
// Create : 2021-04-26 20:39:48
// Revise : 2021-04-26 20:39:48
// Editor : sublime text3, tab size (4)
// -----------------------------------------------------------------------------`timescale 1ns/1psmodule tb_random_divider;reg     clk;
reg     rst;
wire    div_clk;initial beginclk = 0;rst = 1;#100rst = 0;
endalways #10 clk = ~clk;random_divider #(.DIVIDER_NUMBER(7)      //通过设置此值来确定几分频
)
random_divider_inst(.clk        (clk    ),.rst      (rst    ),.div_clk  (div_clk)
);endmodule

任意整数分频(图文并茂)相关推荐

  1. 可任意切换分频倍数的时钟分频电路

    IC校招笔试题:设计一个可任意切换1-8时钟分频,且无论奇偶分频,时钟占空比均为50%. 一.奇数分频 例如7分频,若不要求占空比为50%,很简单地产生3个cycle的高电平,4个cycle的低电平即 ...

  2. 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    数字分频器设计 一.前言 二.偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三.奇数分频 3.1 占空比非50%奇数分频 ...

  3. STM32输出1-500KHz任意整数频率脉冲,代码时间空间优化实现误差最小频率输出。

    提示:此文章只是分析了一种优化STM32发送脉冲减少误差的方法实现,由于本人水平有限,该方法并不是最优解,但确是一种比较容易理解的实现方法. STM32输出1-500KHz任意整数频率脉冲,代码时间空 ...

  4. 分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

    分频器定义: 在数字系统的设计中经常会碰到需要使用多个时钟的情况.时钟信号的产生通常具有两种方法,一种是使用PLL(Phase Locked Loop,锁相环),可生成倍频.分频信号:另一种则是使用硬 ...

  5. Verilog任意整数分频器

    Verilog任意整数分频器 Verilog任意整数分频器 偶数分频 奇数分频 两种情况结合一下 在实际设计中有的时候需要简单的任意整数分频器,整数分频器主要解决两种情况下的分频,一个是偶数分频,另一 ...

  6. 数字IC手撕代码-分频器(任意偶数分频)

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

  7. matlab x为整数,关于matlab中用什么字符表示任意整数

    matlab做除法,怎么取整数? 方法一: floor(a/b);就是舍去小数点. ceil(a/b)就是舍去小数点+1的数. 方法二: fix(x)截尾取整 fix(x)不超过x的最大整数 ceil ...

  8. java 五个数字_关于java:五个任意整数找出其中第二大的数字

    package comxaqf.w02_objectoriented.a_saturday1030; import java.util.Scanner; /** [题6] 6.五个任意整数,找出其中第 ...

  9. C语言随笔小算法:取出一个任意整数的每一位数值

    C语言随笔小算法:取出一个任意整数的每一位数值 代码: #include "stdlib.h" #include "stdio.h"//将val的各位取出来 i ...

最新文章

  1. jQuery-内置动画(实质)
  2. 使用Fiddler监控网易云笔记客户端向服务器定时发送的sync请求
  3. 整机压力测试_加湿器防水检测仪防水测试与气密性检测是怎么做的
  4. python做接口自动化如何输出测试报告-python生成接口自动化测试报告模版
  5. 我对软件开发的一点思考
  6. 树莓派入门教程 - 0 - 准备篇 - 0.0 SD卡制作树莓派系统镜像启动盘 开机
  7. NDoc使用简要手册增加了例子代码
  8. 图形用户界面GUI会被淘汰吗
  9. 求解二叉查找树中的最低公共祖先结点
  10. 常见的一些SQL注入漏洞类型
  11. 移动端H5解惑-页面适配
  12. java循环制作万年历,JAVA-万年历代码--循环语句
  13. 昂达 v891 v1 终于 删除 windows 分区 并且恢复了容量。
  14. 802.11-2020协议学习__$12-Security__$12.5.2-TKIP__2
  15. 一文带你入坑全链路监控,skywalking
  16. 任正非:不惑之年创立华为是生活所迫,CEO真不是人干的活
  17. 脉冲式激光测距机原理
  18. 致远A8-m协同管理系统
  19. 航空航天与国防数字化验证解决方案 | 达索系统百世慧®
  20. Python中strip用法

热门文章

  1. 如何debug web worker
  2. SAP CRM 物料request download - 两个队列的分析
  3. CRM WebClient UI的external service功能介绍
  4. equipment download scenario3
  5. CL_THTMLB_COLOR_UTIL
  6. 两种删除internal table entry的性能比较
  7. SAP Cloud Connector的介绍
  8. 从产品展示页面谈谈Hybris系列之二: DTO, Converter和Populator
  9. java 安卓界面 可视化_Monkey可视化工具开发(android篇)
  10. js 将图片置灰_JS 上传一张图片让其部分变灰色