06 分频器设计

news2024/11/29 12:51:31

分频器简介

实现分频一般有两种方法,一种方法是直接使用 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 / 1ps

module divider4(
	input sys_clk,
	input sys_rst_n,

	output reg out_clk
);

//分频计数器
reg [2:0] count;

//分频计数器,按分频比/2-1进行计数
always @(posedge sys_clk) begin
	if(!sys_rst_n)
		count <= 2'd0;
	else if(count < 2'd1)
		count <= count + 2'd1;
	else
		count <= 2'd0;
end

//翻转输出时钟
always @(posedge sys_clk) begin
	if(!sys_rst_n)
		out_clk<= 1'b0;
	else if(count == 2'd1)
		out_clk <= ~out_clk;
end

endmodule

奇数分频器实现

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

奇数分频 Verilog 代码

`timescale 1ns / 1ps

module 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) begin
	if(!sys_rst_n)
		count <= 3'd0;
	else if(count < 3'd4)
		count <= count + 3'd1;
	else
		count <= 3'd0;
end

//输出时钟1
always @(posedge sys_clk) begin
	if(!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) begin
	if(!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 / 1ps

module 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;

generate
	if((DIV % 2) == 0) begin
	//偶数分频
		//按分频比/2-1进行计数
		always @(posedge sys_clk) begin
			if(!sys_rst_n)
				count <= 0;
			else if(count < (DIV / 2 -1))
				count <= count + 1;
			else
				count <= 0;
		end
		
		//翻转输出时钟
		always @(posedge sys_clk) begin
			if(!sys_rst_n)
				out_clk <= 1'b0;
			else if(count == (DIV / 2 -1))
				out_clk <= ~out_clk;
		end
	end
	else begin
	//奇数分频
		//上升沿跳变的中间时钟
		reg out_clk1;
		//下降沿跳变的中间时钟
		reg out_clk2;
		
		//按分频比-1进行计数
		always @(posedge sys_clk) begin
			if(!sys_rst_n)
				count <= 0;
			else if(count < (DIV -1))
				count <= count + 1;
			else
				count <= 0;
		end
		
		//输出时钟1
		always @(posedge sys_clk) begin
			if(!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
		
		//输出时钟2
		always @(negedge sys_clk) begin
			if(!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 @(*) begin
			out_clk = out_clk1 & out_clk2;
		end
	end
endgenerate

endmodule

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

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

相关文章

LeetCode 热题 100 Day01

哈希模块 哈希结构&#xff1a; 哈希结构&#xff0c;即hash table&#xff0c;哈希表|散列表结构。 图摘自《代码随想录》 哈希表本质上表示的元素和索引的一种映射关系。 若查找某个数组中第n个元素&#xff0c;有两种方法&#xff1a; 1.从头遍历&#xff0c;复杂度&#xf…

【Node-RED】安全登陆时,账号密码设置

【Node-RED】安全登陆时&#xff0c;账号密码设置 前言实现步骤密码生成setting.js 文件修改 安全权限 前言 Node-RED 在初始下载完成时&#xff0c;登录是无账号密码的。基于安全性考虑&#xff0c;本期博文介绍在安全登陆时&#xff0c;如何进行账号密码设置。当然&#xff…

spring boot自动装配及自动装配条件判断

第一步需要在pom.xml文件指定需要导入的坐标 要是没有自动提示需要检查maven有没有 实现代码 /*springboot第三方自动配置实现方法 * 什么是自动配置 自动配置就是springboot启动自动加载的类不需要在手动的控制反转自动的加入bean中 * * *//*第一种方案包扫描 不推荐因为繁琐…

CentOS 7.9如何禁止内核自动更新升级

要在 CentOS 7.9 系统中禁止内核自动更新&#xff0c;你可以通过配置 YUM&#xff08;Yellowdog Updater, Modified&#xff09;来实现。这里有几种方法可以阻止内核自动更新&#xff1a; 方法 1: 使用 exclude 选项在 YUM 配置中 编辑 YUM 的配置文件 /etc/yum.conf&#xff…

第三篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:pyttsx3实现语音助手经典案例

传奇开心果短博文系列 系列短博文目录Python的文本和语音相互转换库技术点案例示例系列 短博文目录一、项目背景和目标二、雏形示例代码三、扩展思路介绍四、与其他库和API集成示例代码五、自定义语音示例代码六、多语言支持示例代码七、语音控制应用程序示例代码八、文本转语音…

【C语言】Debian安装并编译内核源码

在Debian 10中安装并编译内核源码的过程如下&#xff1a; 1. 安装依赖包 首先需要确保有足够的权限来安装包。为了编译内核&#xff0c;需要有一些基础的工具和库。 sudo apt update sudo apt upgrade sudo apt install build-essential libncurses-dev bison flex libssl-d…

kettle中JavaScript使用例子

1.将输入日期减一后&#xff0c;得到对应格式的输出 输入为20240216则Alert输出20240215 日期减一。 对应函数参考&#xff1a; https://blog.csdn.net/doasmaster/article/details/112978529

激光条纹中心线提取算法FPGA实现方案

1 概述 激光条纹中心线提取是3D线激光测量领域一个较为基础且重要的算法。目前&#xff0c;激光条纹中心线提取已有多种成熟的算法&#xff0c;有很多相关的博客和论文。 激光条纹中心线提取的真实意义在于工程化和产品化的实际应用&#xff0c;而很多算法目前只能用于学术研究…

Days 34 ElfBoard 音频接口

音频接口介绍 音频模块采用了 NAU88C22 芯片&#xff0c;芯片数据信号使用 I2S 接口进行通讯&#xff0c;主要信号功能&#xff1a; SAI_MCLK&#xff1a;音频信号主时钟&#xff1b; SAI_BCLK&#xff1a;音频信号位时钟&#xff1b; SAI_SYNC&#xff1a;左右声道控制信号&am…

2024-2-18-IO作业

作业&#xff1a; 1> 要求: 源代码&#xff1a; #include "myhead.h" int main(int argc, char const *argv[]) {FILE *fpNULL;if ((fpfopen("./text.txt","r"))NULL){perror("fopen error");return -1;}char buf[64]{0};int lin…

GPT-5,奥特曼最新剧透

GPT-5的消息越来越藏不住了&#xff0c;连OpenAI CEO奥特曼都不再遮遮掩掩—— 开始在各种公开场合频繁造势&#xff0c;不断挑动科技圈的神经。 在达沃斯经济论坛&#xff0c;奥特曼一共参加了4-5场活动&#xff0c;透露的关键信息包括&#xff1a; 如果GPT-4目前解决了人类…

Linux第60步_“buildroot”构建根文件系统第2步_配置“buildroot下的busybox”并测试“buildroot”生成的根文件系统

1、查看“buildroot下的busybox”安装路径 打开终端 输入“ls回车” 输入“cd linux回车/”&#xff0c;切换到到“linux”目录 输入“ls回车”&#xff0c;查看“linux”目录下的文件和文件夹 输入“cd buildroot/回车”&#xff0c;切换到到“buildroot”目录 输入“ls…

PyCharm 调试过程中控制台 (Console) 窗口内运行命令 - 实时获取中间状态

PyCharm 调试过程中控制台 [Console] 窗口内运行命令 - 实时获取中间状态 1. yongqiang.py2. Debugger -> Console3. Show Python PromptReferences 1. yongqiang.py #!/usr/bin/env python # -*- coding: utf-8 -*- # yongqiang chengfrom __future__ import absolute_imp…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十四)(1)

实验十四&#xff1a;水塔水流量估计模型 练习一 1.海水温度随着深度的变化而变化,海面温度较高,随着深度的增加,海水温度越来越低.通过验观测得一组海水温度t与深度h的数据如下: h/m 0 1.5 2.5 4.6 8.2 12.5 16.5 26.5 t/℃ 23.5 22.9 20.1 19.1 15.4 11.5 …

阿里云服务器配置怎么选?CPU内存带宽配置多大?

阿里云服务器配置怎么选择&#xff1f;根据实际使用场景选择&#xff0c;个人搭建网站可选2核2G配置&#xff0c;访问量大的话可以选择2核4G配置&#xff0c;企业部署Java、Python等开发环境可以选择2核8G配置&#xff0c;企业数据库、Web应用或APP可以选择4核8G配置或4核16G配…

IDEA2023.3.4开启SpringBoot项目的热部署【简单明了4步操作】

添加devtools依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency>IDEA开启自动编译 …

Windows11(非WSL)安装Installing llama-cpp-python with GPU Support

直接安装&#xff0c;只支持CPU。想支持GPU&#xff0c;麻烦一些。 1. 安装CUDA Toolkit (NVIDIA CUDA Toolkit (available at https://developer.nvidia.com/cuda-downloads) 2. 安装如下物件&#xff1a; gitpythoncmakeVisual Studio Community (make sure you install t…

对尾递归的理解(有哪些应用场景)

文章目录 一、递归二、尾递归三、应用场景参考文献 一、递归 递归&#xff08;英语&#xff1a;Recursion&#xff09; 在数学与计算机科学中&#xff0c;是指在函数的定义中使用函数自身的方法 在函数内部&#xff0c;可以调用其他函数。如果一个函数在内部调用自身本身&am…

如何将OSGB格式的倾斜模型转换成3DTiles?

通过以下方法可以将OSGB转换成3DTiles。 方法/步骤 1、下载三维地图浏览器 http://www.geosaas.com/download/map3dbrowser.exe&#xff0c;安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“ 3、点击“倾斜模型”下拉菜单&#xff0c;…

C++职工管理系统

->需求分析以及案例展示、创建项目、创建职工管理类、菜单功能实现、退出系统功能实现、职工抽象类和普通员工类实现、经理类和老板类实现、添加职工功能实现、文件交互(->写文件、读文件1-文件未创建、读文件2-文件为空、读文件3-统计人数、读文件4-初始化完毕&#xff…