目录

写在前面

偶数分频

Verilog 实现

TestBench 测试文件

RTL 视图

仿真波形

奇数分频

Verilog 实现

TestBench 测试文件

RTL 视图

仿真波形

任意小数分频

Verilog 实现

TestBench 测试文件

RTL 视图

仿真波形


写在前面

在实际的项目工程中,经常需要不同的时钟频率工作,或者在一些笔试面试中,时钟分频也会被问到,因此这篇文章介绍几种常见的时钟分频的案例:偶数分频、奇数分频、任意小数分频。

偶数分频

偶数分频是最常见的分频方式也是最简单的,只需要一个简单的计数器即可,如果要实现4分频的时钟,只需要计数器从0计数到3,然后输出的时钟在计数到1和3的时钟翻转即可。

Verilog 实现

//`timescale 100ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: freq_div_even
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description: 实现偶数四分频
// Additional Comments:
//
//module freq_div_even(input       clk,input       rst,output reg  clk_out);
reg  [1:0]   cnt;always @(posedge clk or posedge rst) beginif (rst) begincnt <= 'd0;endelse if (cnt == 'd3) begincnt <= 'd0;endelse begincnt <= cnt + 'd1;end
endalways @(posedge clk or posedge rst) beginif (rst) beginclk_out <= 'd0;endelse if (cnt == 'd1) beginclk_out <= 'd1;endelse if (cnt == 'd3) beginclk_out <= 'd0;endelse beginclk_out <= clk_out;end
endendmodule

TestBench 测试文件

`timescale 10ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: tb_freq_div_even
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description:
// Additional Comments:
//
//module tb_freq_div_even();reg   clk;reg   rst;wire  clk_out;initial beginclk = 'd0;rst = 'd1;#20rst = 'd0;endalways #10 clk = ~clk;freq_div_even inst_freq_div_even (.clk(clk), .rst(rst), .clk_out(clk_out));endmodule

RTL 视图

仿真波形

可以看到原时钟为50Mhz,在四分频后时钟为12.5Mhz,符合设计要求。如果要设计八分频甚至更大的分频也是如此操作。


奇数分频

相对于偶数分频,奇数分频要复杂一些,不仅要实现奇数分频而且占空比为50%,这里需要多加一个计数器,一个计数器由输入时钟上升沿触发,另一个计数器由输入时钟下降沿触发,最后将两个计数器的输出做相运算,即可得到奇数分频并且占空比为50%的时钟。

Verilog 实现

//`timescale 100ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: freq_div_odd
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description: 实现奇数五分频
// Additional Comments:
//
//module freq_div_odd(input        clk,input        rst,output wire  clk_out);
reg  [2:0]   cnt1;
reg  [2:0]   cnt2;
reg          clk1;
reg          clk2;always @(posedge clk or posedge rst) beginif (rst) begincnt1 <= 'd0;endelse if (cnt1 == 'd4) begincnt1 <= 'd0;endelse begincnt1 <= cnt1 + 'd1;end
endalways @(posedge clk or posedge rst) beginif (rst) beginclk1 <= 'd0;endelse if (cnt1 < 'd2) beginclk1 <= 'd1;endelse beginclk1 <= 'd0;end
endalways @(negedge clk or posedge rst) beginif (rst) begincnt2 <= 'd0;endelse if (cnt2 == 'd4) begincnt2 <= 'd0;endelse begincnt2 <= cnt2 + 'd1;end
endalways @(negedge clk or posedge rst) beginif (rst) beginclk2 <= 'd0;endelse if (cnt2 < 'd2) beginclk2 <= 'd1;endelse beginclk2 <= 'd0;end
endassign clk_out = clk1 | clk2;endmodule

TestBench 测试文件

`timescale 10ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: tb_freq_div_odd
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description:
// Additional Comments:
//
//module tb_freq_div_odd();reg   clk;reg   rst;wire  clk_out;initial beginclk = 'd0;rst = 'd1;#20rst = 'd0;endalways #10 clk = ~clk;freq_div_odd inst_freq_div_odd (.clk(clk), .rst(rst), .clk_out(clk_out));endmodule

RTL 视图

仿真波形


任意小数分频

任意小数分频如果要分的更细一些,可以分成半整数分数和非半整数的小数分频,因为半整数也属于小数,所以这里统一用任意小数分频的设计方法实现。

在设计时也可以选择直接调用 PLL 锁相环实现,比如要实现 6.3 的分频,可以先将源时钟 10 倍频,得到源时钟的 10 倍频率的时钟,再进行 63 分频实现,这样就可以得到 63 分频的时钟。

另外也可以自己设计实现,分频结果 N = M + P,其中 M 为小数分频值得整数部分,P 为小数分频值得小数部分,同时小数可以用分式表示 b/a+b,比如 0.3 可以表示为3/7+3,此时b = 3,则原式可以表示为 N = M + b/a+b,对 M 进行通分得到 N = M(a+b) + b/a+b = [aM + b(M+1)]/a+b,这样就可以列出二元一次方程,6.3分频可以写成分式63/10。

可以得到以下二元一次不等式:

6a + 7b = 63

a + b = 10

解得:a = 7,b = 3

表示先做 7 次 6 分频,再做 3 次 7 分频即可达到 6.3 分频的目的。

Verilog 实现

//`timescale 100ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: freq_div_decimal
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description: 实现任意小数分频,以6.3分频为例
// Additional Comments:
//    先做 7 次 6 分频,再做 3 次 7 分频
//
//module freq_div_decimal(input       clk,input       rst,output reg  clk_out);
reg  [3:0]   cnt1;
reg  [3:0]   cnt2;always @(posedge clk or posedge rst) beginif (rst) begincnt1 <= 'd0;endelse if ((cnt2 < 'd7) &&(cnt1 == 'd5)) begincnt1 <= 'd0;endelse if (cnt1 == 'd6) begincnt1 <= 'd0;endelse begincnt1 <= cnt1 + 'd1;end
endalways @(posedge clk or posedge rst) beginif (rst) begincnt2 <= 'd0;endelse if ((cnt2 == 'd9) && (cnt1 == 'd6)) begincnt2 <= 'd0;endelse if ((cnt1 == 'd5) && (cnt2 < 'd7)) begincnt2 <= cnt2 + 'd1;endelse if (cnt1 == 'd6) begincnt2 <= cnt2 + 'd1;endelse begincnt2 <= cnt2;end
endalways @(posedge clk or posedge rst) beginif (rst) beginclk_out <= 'd0;endelse if ((cnt1 == 'd5) && (cnt2 < 'd7)) beginclk_out <= 'd1;endelse if (cnt1 == 'd6) beginclk_out <= 'd1;endelse beginclk_out <= 'd0;end
endendmodule

TestBench 测试文件

`timescale 10ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: tb_freq_div_even
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description:
// Additional Comments:
//
//module tb_freq_div_even();reg   clk;reg   rst;wire  clk_out;initial beginclk = 'd0;rst = 'd1;#20rst = 'd0;endalways #10 clk = ~clk;freq_div_decimal inst_freq_div_decimal (.clk(clk), .rst(rst), .clk_out(clk_out));endmodule

RTL 视图

仿真波形

可以看到仿真波形,先经过了 7 次的 6 分频,再经过 3 次的 7 分频,最终形成 6.3 分频的时钟输出。

【Verilog 设计】Verilog 实现偶数、奇数分频和任意小数分频相关推荐

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

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

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

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

  3. 【数字IC手撕代码】Verilog奇数分频|题目|原理|设计|仿真(三分频,五分频,奇数分频及特殊占空比)

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  4. 【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  5. Verilog设计(二):分频电路设计

    目录 1.偶数分频 2. 奇数分频 3.半整数分频 分频器是FPGA中常用的设计之一,在FPGA设计中担任重要的角色(时钟对于FPGA电路系统的重要性不言而喻!).尽管大多数设计中会广泛采用厂家集成的 ...

  6. verilog奇数分频,三分频实例

    verilog奇数分频,三分频实例 目的:输入一个时钟信号,输出占空比为50%的三分频. 首先得到一个占空比为1/3的分频时钟,然后将输入信号取反,得到一个移相180度的占空比为1/3的分频时钟,将两 ...

  7. FPGA分频电路实现(奇数,偶数,小数半分频,任意分频)

    https://blog.csdn.net/weixin_43950612/article/details/104687942(简介明了,奇数,偶数,小数,任意分频) http://www.myexc ...

  8. Verilog设计分频器(面试必看)

    分频器是指使输出信号频率为输入信号频率整数分之一的电子电路.在许多电子设备中如电子钟.频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种 ...

  9. 分频器的Verilog设计

    分频器是指使输出频率为输入频率的M分之一的数字电路,其中M为整数.下面介绍的是常用的50%占空比的分频器及Verilog代码: 偶分频 偶分频是指分频系数M为偶数的分频器. 现以4分频为例,即M=4. ...

最新文章

  1. python map lambda 分割字符串_python之lambda、filter、map、reduce的用法说明(基于python2)...
  2. 异星工厂 自动机器人_刚刚,ABB机器人全球最大机器人超级工厂在康桥动工! 投资10亿元,用机器人造机器人...
  3. 战神背光键盘如何关系_谁说轻薄和性能不可兼得?神舟战神Z7助你“清凉”一夏...
  4. ASP.NET2.0入门经典(第4版)—3.5 服务器控件的类型(2)--zt
  5. java 文本变量_如何将一变量作为可配置文件 java
  6. Swift实战-豆瓣电台(八)播放进度与时间
  7. Android 性能测试工具- Emmagee
  8. 云计算,制造业数字化转型的催化剂
  9. 微信小程序项目实例——双人五子棋
  10. mysql explain字段意思解释
  11. android内存置换,安卓手机64GB内存如何更换内存
  12. 禅道和xxd(喧喧)两台主机服务器采坑记!
  13. 华为鸿蒙麒麟玉兔_华为!《鸿蒙出世:中国神兽图鉴》
  14. 北航计算机考博经验,最新的北航考博经验
  15. 【Java爬虫】Jsoup
  16. 描写火车站场景_描写火车站的句子_优美语句
  17. IDF实验室-抓到一只苍蝇
  18. matlab无功仿真,第八章MATLAB在无功补偿的仿真 实例.ppt
  19. 使用微信小程序获取附近人的位置遇到的坑
  20. python爬虫 爬取猫眼电影数据

热门文章

  1. ERC721: Non-fungible Token Standard
  2. 获取MLX90614温度探头的通讯地址
  3. android的边框设置
  4. Django模型之Meta属性详解
  5. ajax读取文件数据,Ajax 实现读取 properties 格式资源文件数据
  6. flex布局小案例——制作骰子
  7. 航拍无人机 无人车_无人机将有自己的时刻
  8. java必备英语单词
  9. android源码分析
  10. 【图像分类】华为云·垃圾分类亚军方案分享