【Verilog 设计】Verilog 实现偶数、奇数分频和任意小数分频
目录
写在前面
偶数分频
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 实现偶数、奇数分频和任意小数分频相关推荐
- 分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)
分频器定义: 在数字系统的设计中经常会碰到需要使用多个时钟的情况.时钟信号的产生通常具有两种方法,一种是使用PLL(Phase Locked Loop,锁相环),可生成倍频.分频信号:另一种则是使用硬 ...
- 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)
数字分频器设计 一.前言 二.偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三.奇数分频 3.1 占空比非50%奇数分频 ...
- 【数字IC手撕代码】Verilog奇数分频|题目|原理|设计|仿真(三分频,五分频,奇数分频及特殊占空比)
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- 【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
- Verilog设计(二):分频电路设计
目录 1.偶数分频 2. 奇数分频 3.半整数分频 分频器是FPGA中常用的设计之一,在FPGA设计中担任重要的角色(时钟对于FPGA电路系统的重要性不言而喻!).尽管大多数设计中会广泛采用厂家集成的 ...
- verilog奇数分频,三分频实例
verilog奇数分频,三分频实例 目的:输入一个时钟信号,输出占空比为50%的三分频. 首先得到一个占空比为1/3的分频时钟,然后将输入信号取反,得到一个移相180度的占空比为1/3的分频时钟,将两 ...
- FPGA分频电路实现(奇数,偶数,小数半分频,任意分频)
https://blog.csdn.net/weixin_43950612/article/details/104687942(简介明了,奇数,偶数,小数,任意分频) http://www.myexc ...
- Verilog设计分频器(面试必看)
分频器是指使输出信号频率为输入信号频率整数分之一的电子电路.在许多电子设备中如电子钟.频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种 ...
- 分频器的Verilog设计
分频器是指使输出频率为输入频率的M分之一的数字电路,其中M为整数.下面介绍的是常用的50%占空比的分频器及Verilog代码: 偶分频 偶分频是指分频系数M为偶数的分频器. 现以4分频为例,即M=4. ...
最新文章
- python map lambda 分割字符串_python之lambda、filter、map、reduce的用法说明(基于python2)...
- 异星工厂 自动机器人_刚刚,ABB机器人全球最大机器人超级工厂在康桥动工! 投资10亿元,用机器人造机器人...
- 战神背光键盘如何关系_谁说轻薄和性能不可兼得?神舟战神Z7助你“清凉”一夏...
- ASP.NET2.0入门经典(第4版)—3.5 服务器控件的类型(2)--zt
- java 文本变量_如何将一变量作为可配置文件 java
- Swift实战-豆瓣电台(八)播放进度与时间
- Android 性能测试工具- Emmagee
- 云计算,制造业数字化转型的催化剂
- 微信小程序项目实例——双人五子棋
- mysql explain字段意思解释
- android内存置换,安卓手机64GB内存如何更换内存
- 禅道和xxd(喧喧)两台主机服务器采坑记!
- 华为鸿蒙麒麟玉兔_华为!《鸿蒙出世:中国神兽图鉴》
- 北航计算机考博经验,最新的北航考博经验
- 【Java爬虫】Jsoup
- 描写火车站场景_描写火车站的句子_优美语句
- IDF实验室-抓到一只苍蝇
- matlab无功仿真,第八章MATLAB在无功补偿的仿真 实例.ppt
- 使用微信小程序获取附近人的位置遇到的坑
- python爬虫 爬取猫眼电影数据