当前位置: 首页 > news >正文

06 分频器设计

分频器简介

实现分频一般有两种方法,一种方法是直接使用 PLL 进行分频,比如在 FPGA 或者 ASIC 设计中,都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性,无法得到频率很低的时钟信号,比如输入 100Mhz 时钟,很多PLL 都无法得到 1Mhz 以下的时钟信号。另外一种方法是直接使用 Verilog 代码来实现分频。
注意:
使用 Verilog 代码分频得到的时钟信号尽量不要当做其他模块的输入时钟信号,因为通过 Verilog 代码分频得到的时钟信号默认不会连接到 FPGA 的时钟网络上,这样会导致时钟出现偏移和抖动,在高频电路中会影响电路稳定性,这种分频方式一般用于产生外部低速总线的参考时钟,如SPI、I2C的参考时钟。

偶数分频器和奇数分频器

根据分频器的分频比例是偶数还是奇数,可以将其分为偶数分频器和奇数分频器。

  • 偶数分频:就是分频前的频率和分频后的频率比值是偶数,比如一个 50Mhz 的晶振时钟,进行二分频后,就是 50Mhz/2=25Mhz
  • 奇数分频:就是分配前的频率和分频后的频率比值是奇数。比如一个 50Mhz 的晶振时钟,进行三分频后,就是 50Mhz/3=16.667Mhz

偶数分频实现

假设 N(N为偶数)分频,只需计数到 N/2-1,然后时钟翻转、计数器清零,如此循环就可以得到 N 分频。举个例子,比如晶振时钟是 100Mhz 时钟,想得到一个 25Mhz 的时钟,那么这个是一个 100/25=4 的四分频设计,按照我们刚说的计数到 4/2-1=1,然后时钟翻转、计数器清零,就可以得到一个 25Mhz 的时钟。
在这里插入图片描述

偶数分频 Verilog 代码

`timescale 1ns / 1psmodule divider4(input sys_clk,input sys_rst_n,output reg out_clk
);//分频计数器
reg [2:0] count;//分频计数器,按分频比/2-1进行计数
always @(posedge sys_clk) beginif(!sys_rst_n)count <= 2'd0;else if(count < 2'd1)count <= count + 2'd1;elsecount <= 2'd0;
end//翻转输出时钟
always @(posedge sys_clk) beginif(!sys_rst_n)out_clk<= 1'b0;else if(count == 2'd1)out_clk <= ~out_clk;
endendmodule

奇数分频器实现

同样假设 N(N为奇数)分频,计数器需要计数到 N-1,当计数器为0时输出时钟1在输入时钟的上升沿拉低,当计数器计数到 N/2 取整时输出时钟1在输入时钟的上升沿进行拉高,同时当计数器为0时输出时钟2在输入时钟的下降沿拉低,当计数器计数到 N/2 取整时输出时钟2在输入时钟的下降沿进行拉高,将输出时钟1和输出时钟2相与即可得到真正的输出时钟。
在这里插入图片描述

奇数分频 Verilog 代码

`timescale 1ns / 1psmodule divider5(input sys_clk,input sys_rst_n,output out_clk
);//分频计数器
reg [2:0] count;
//上升沿跳变的中间时钟
reg out_clk1;
//下降沿跳变的中间时钟
reg out_clk2;//分频计数器,按分频比-1进行计数
always @(posedge sys_clk) beginif(!sys_rst_n)count <= 3'd0;else if(count < 3'd4)count <= count + 3'd1;elsecount <= 3'd0;
end//输出时钟1
always @(posedge sys_clk) beginif(!sys_rst_n)out_clk1 <= 1'b0;else if(count == 3'd0)out_clk1 <= 1'b0;else if(count == 3'd2)out_clk1 <= 1'b1;
end//输出时钟2
always @(negedge sys_clk) beginif(!sys_rst_n)out_clk2 <= 1'b0;else if(count == 3'd0)out_clk2 <= 1'b0;else if(count == 3'd2)out_clk2 <= 1'b1;
end//输出分频后的时钟
assign out_clk = out_clk1 & out_clk2;endmodule

任意分频器实现

在实现任意分频器时可以利用条件生成语句,当模块例化时传入的参数为偶数则生成偶数分频的代码,否则生成奇数分频的代码,有关生成语句相关的内容参考03 Verilog HDL 语法。

任意分频 Verilog 代码

`timescale 1ns / 1psmodule divider #(//参数列表parameter COUNT_WIDTH = 3,				//内部分频计数器宽度parameter DIV = 5						//分频系数
)
(input sys_clk,input sys_rst_n,output reg out_clk
);//分频计数器
reg [COUNT_WIDTH-1:0] count;generateif((DIV % 2) == 0) begin//偶数分频//按分频比/2-1进行计数always @(posedge sys_clk) beginif(!sys_rst_n)count <= 0;else if(count < (DIV / 2 -1))count <= count + 1;elsecount <= 0;end//翻转输出时钟always @(posedge sys_clk) beginif(!sys_rst_n)out_clk <= 1'b0;else if(count == (DIV / 2 -1))out_clk <= ~out_clk;endendelse begin//奇数分频//上升沿跳变的中间时钟reg out_clk1;//下降沿跳变的中间时钟reg out_clk2;//按分频比-1进行计数always @(posedge sys_clk) beginif(!sys_rst_n)count <= 0;else if(count < (DIV -1))count <= count + 1;elsecount <= 0;end//输出时钟1always @(posedge sys_clk) beginif(!sys_rst_n)out_clk1 <= 1'b0;else if(count == 0)out_clk1 <= 1'b0;else if(count == (DIV / 2))out_clk1 <= 1'b1;end//输出时钟2always @(negedge sys_clk) beginif(!sys_rst_n)out_clk2 <= 1'b0;else if(count == 0)out_clk2 <= 1'b0;else if(count == (DIV / 2))out_clk2 <= 1'b1;end//输出分频后的时钟always @(*) beginout_clk = out_clk1 & out_clk2;endend
endgenerateendmodule
http://www.lryc.cn/news/305028.html

相关文章:

  • 力扣hot100题解(python版7-9题)
  • ECMAScript 6+ 新特性 ( 四 ) 迭代器 与 生成器
  • 【MySQL】事务的一致性究竟怎么理解?
  • 证件照(兼容H5,APP,小程序)
  • pytorch-textregression,中文文本回归实践,支持多值输出
  • go语言学而思【持续更新】
  • LVS-NAT之VMNET环境搭建
  • [TCP] TCP/IP 基础知识词典(2)
  • 【牛牛送书 | 第四期】《高效使用Redis:一书学透数据存储与高可用集群》带你快速学习使用Redis
  • Threejs 实现3D影像地图,Json地图,地图下钻
  • 根据Excel创建管道系统及材质
  • 第八篇【传奇开心果系列】python的文本和语音相互转换库技术点案例示例:Google Text-to-Speech虚拟现实(VR)沉浸式体验经典案例
  • ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器
  • Windows 远程控制 Mac 电脑怎么操作
  • c# HttpCookie操作,建立cookie工具类
  • 【这个词(Sequence-to-Sequence)在深度学习中怎么解释,有什么作用?】
  • 挑战30天学完Python:Day16 日期时间
  • Web3之光:揭秘数字创新的未来
  • Stable Diffusio——采样方法使用与原理详解
  • 小米14 ULTRA:重新定义手机摄影的新篇章
  • 【leetcode热题】路径总和 II
  • ChatGPT在数据处理中的应用
  • 微服务-Alibaba微服务nacos实战
  • Linux Driver | 设备树开发之初识设备树
  • 2月24日(周六)比赛前瞻:曼联 VS 富勒姆、拜仁 VS 莱比锡
  • React18源码: task任务调度和时间分片
  • 【工具类】阿里域名关联ip(python版)
  • STM32自学☞输入捕获测频率和占空比案例
  • [yolov9]使用python部署yolov9的onnx模型
  • ShellExecute的用法