Verilog 编程——奇偶分频(50%占空)

news2024/9/21 22:43:17



引言

最近准备一些笔试面试,想再把时钟奇偶分频的再整理一下。

我之前写过一个PWM产生的模块,里面有任意频率/占空比的时钟生成。可以参考:

基于FPGA的PWM发生器设计icon-default.png?t=N3I4https://blog.csdn.net/qq_43045275/article/details/128365705?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168362558616800227492685%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168362558616800227492685&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-128365705-null-null.blog_rank_default&utm_term=PWM&spm=1018.2226.3001.4450


偶数分频

以4分频为例,时序图:

假设时钟分频系数:P_DIV_EVEN

那么偶数分频是在,计数器的计数值 = P_DIV_EVEN / 2 - 1 时,输出时钟翻转即可


// ========================================================================
// 功能描述:-1- 偶数倍时钟分频,50%占空比
// 作者:Xu Y. B.
// 时间:2023-05-09
// ========================================================================

`timescale 1ns / 1ps
module clk_div_even #(
parameter P_DIV_EVEN = 4
)(
input				 clk,										
input				 rstn,										
output 		reg		 clk_div										
);

localparam N = (P_DIV_EVEN)/2;

reg [$clog2(P_DIV_EVEN)-1:0] r_cnt;

always @ (posedge clk)
begin
	if(~rstn)
	begin
		r_cnt <= 0;
		clk_div <= 0;
	end
	else if(r_cnt == (N-1))
	begin
		r_cnt <= 0;
		clk_div <= ~clk_div;
	end
	else
	begin
		r_cnt <= r_cnt + 1;
	end
end

endmodule

奇数分频

以5分频为例,时序图:

假设时钟分频系数:P_DIV_ODD

参数 N = (P_DIV_ODD - 1)/2

其中clk_div为最终输出时钟,clk1和clk2为辅助时钟生成。

计数器counter由0计数至(M-1)。

  • clk1在clk_in的上升延跳变,条件是r_cnt==(N-1)或(P_DIV_ODD-1)。

  • clk2在clk_in的下降延跳变,条件是r_cnt==(N-1)或(P_DIV_ODD-1)。

  • 之后 clk_div = clk1 & clk2 即可得到对应奇数分频的时钟。


// ========================================================================
// 功能描述:-1- 奇数倍时钟分频,50%占空比
// 作者:Xu Y. B.
// 时间:2023-05-09
// ========================================================================

`timescale 1ns / 1ps
module clk_div_odd #(
parameter P_DIV_ODD = 3
)(
input				 clk,										
input				 rstn,										
output 				 clk_div										
);

localparam N = (P_DIV_ODD-1)/2;

reg [$clog2(P_DIV_ODD)-1:0] r_cnt;

reg 						clk1;
reg 						clk2;

// 原始时钟计数
always @ (posedge clk)
begin
	if(~rstn)
	begin
		r_cnt <= 0;
	end
	else if(r_cnt == (P_DIV_ODD-1))
	begin
		r_cnt <= 0;
	end
	else
	begin
		r_cnt <= r_cnt + 1;
	end
end

// 上升沿触发
always @ (posedge clk)
begin
	if(~rstn)
	begin
		clk1 <= 0;
	end
	else if(r_cnt == (N-1))
	begin
		clk1 <= ~clk1;
	end
	else if(r_cnt == (P_DIV_ODD-1))
	begin
		clk1 <= ~clk1;
	end
end

// 下降沿触发
always @ (negedge clk)
begin
	if(~rstn)
	begin
		clk2 <= 0;
	end
	else if(r_cnt == (N-1))
	begin
		clk2 <= ~clk2;
	end
	else if(r_cnt == (P_DIV_ODD-1))
	begin
		clk2 <= ~clk2;
	end
end

assign clk_div = clk1&clk2;

endmodule

仿真代码


// ========================================================================
// 功能描述:-1- 仿真测试模块 clk_div_odd , clk_div_even 功能
// 作者:Xu Y. B.
// 时间:2023-05-09
// ========================================================================

`timescale 1ns / 1ps
module tb_clk_div();
parameter P_DIV_EVEN = 4;
parameter P_DIV_ODD = 5;
reg					 clk;										
reg					 rstn;										
wire 				 o_clk_div_odd;
wire 				 o_clk_div_even;

initial clk = 0;
always #5 clk = ~clk;

initial
begin
	rstn = 0;
	#1034;
	@(posedge clk)
	rstn <= 1;
	#2987;
	$stop;
end

clk_div_odd  #(.P_DIV_ODD(P_DIV_ODD)) INST_clk_div_odd (.clk(clk), .rstn(rstn), .clk_div(o_clk_div_odd));
clk_div_even #(.P_DIV_EVEN(P_DIV_EVEN)) INST_clk_div_even (.clk(clk), .rstn(rstn), .clk_div(o_clk_div_even));

endmodule

仿真结果:

 

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

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

相关文章

Scala学习(一)

1.什么是Scala Scala将面向对象和函数式编程结合成一种简洁的高级语言。Scala的静态类型有助于避免复杂应用程序中的错误。 1.1 为什么要学习Scala&#xff1f; Spark基于内存的大数据计算框架&#xff0c;而Spark就是Scala开发的。所以为了学习好Spark需要掌握Scala语言。 …

learn C++ NO.3 ——类和对象(1)

1.初步理解面向过程和面向对象 C语言是面向过程的高级编程语言&#xff0c;而C是面向对象的高级编程语言。那么两者有什么区别呢&#xff1f;且看下图分析。 面向过程语言就是逐步拆分并解决问题。其特点是过程化和模块化&#xff0c;数据和对数据的操作是分离的。 由于面向过…

《LeetCode》—— 哈希

今天刷题讲解的主要讲的是关于——哈希这个知识点的题目讲解。 目录 &#xff08;一&#xff09;缺失的第一个正整数 &#xff08;二&#xff09;数组中只出现一次的两个数字 1、直接法 2、哈希 &#xff08;三&#xff09;直线上最多的点数 &#xff08;一&#xff09;缺…

力扣题库刷题笔记735-行星碰撞

1、题目如下&#xff1a; 2、个人Python代码实现 个人代码思路&#xff0c;主要是新建一个列表stack&#xff0c;将原列表asteroids中的元素依次加入到stack中。以上代码可能会有两部分比较冗余的部分&#xff0c;一是两个标志位可以不用单独声明&#xff0c;二是当stack列表中…

解析内存中的高性能图结构

在进行各种图处理、图计算、图查询的时候&#xff0c;内存或是硬盘中如何存储图结构是一个影响性能的关键因素。本文主要分析了几种常见的内存图结构&#xff0c;及其时间、空间复杂度&#xff0c;希望对你有所启发。 通常来说&#xff0c;对于图结构的几种常见的基础操作&…

通过SSH隧道安全消费Kafka数据

一.背景 由于我们有个业务在阿里云部署了Kafka&#xff0c;但是想直接在本地IDC机房服务器直接通过公网消费Kafka进行业务处理。这个本来也不是什么难事&#xff0c;阿里云把9092默认端口打开运行访问即可&#xff0c;也不不值得再写这篇博客了。 这个事情让人特别关注的一个主…

【记录】ChatGPT|图片预览魔法咒语魔改,使用 ChatGPT 返回大量可以跳转的链接

很早的时候&#xff0c;我已经留意到 ChatGPT 会以返回图片的 markdown 格式来显示图片&#xff0c;很可能拥有一定的图片上传功能&#xff0c;但是它往往会显示得有些问题。一些代码图片之类的或者风景图什么的都不是很会。 但其实 ChatGPT 是可以直接返回图片类型的回复的&a…

C++初始化列表

1.初始化列表概述 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始值或表达式。 2.为什么使用初始化列表 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c…

个人电脑操作系统

UEFI&#xff08;Unified Extensible Firmware Interface&#xff0c;全称统一的可扩展固件接口&#xff09;是一种个人电脑系统规格&#xff0c;用来定义操作系统与系统固件之间的软件界面&#xff0c;作为BIOS的替代方案。其前身是Intel在1998年开始开发的Intel Boot Initiat…

【static_cast、reinterpret_cast、const_cast、dynamic_cast】C++类型转换

C类型转换 引入C语言中的类型转换 C的强制类型转换static_castreinterpret_catconst_castdynamic_cast向下转型的安全问题 explicit4种类型转换的应用场景 RTTI 引入 C语言中的类型转换 C语言和C都是强类型语言&#xff0c;如果赋值运算符左右两侧变量的类型不同&#xff0c;…

ChatGPT一键私有部署,全网可用,让访问、问答不再受限,且安全稳定!

前言 ChatGPT由于在访问上有一些限制&#xff0c;使用并不便利。目前国内可以直接访问的大部分是调用API返回结果&#xff0c;我们去使用时总会有次数限制&#xff0c;而且它们可能随便崩掉。 其实&#xff0c;目前我们访问过的大部分国内的网页包括UI&#xff0c;其实是套用了…

过滤器对前端请求参数进行解码URLDecoder,接口接收参数类型为map,解码无效问题

文章目录 一、前言二、设计思路三、代码实现四、启动测试五、过滤器解码无效六、源码跟踪七、解决方案八、再次重启测试九、总结 一、前言 最近做的一个公司项目&#xff0c;因为客户需要对特殊字符做搜索&#xff0c;但是前端的请求参数无法传递到后端&#xff0c;所以前端对…

VS2017中Qt项目数据库连接——包含报错比如QMYSQL driver not loaded(细心看到最后,一定能解决你想解决的问题)

我把爆的错误QMYSQL driver not loaded写在文章末尾了&#xff0c;大家看一看&#xff01;前面是配置数据库 一、测试 VS2017 中 Qt 项目数据库连接 打开 VS2017&#xff0c;文件——新建项目&#xff0c;右侧输入框输入 Qt 确定后点击下一步&#xff0c;勾选模块 基类也是默…

RSU路测单元,你知道多少?

一、什么是RSU路测单元&#xff1f; RSU路测单元是实现智慧的路、车路协同的关键设备&#xff0c;设置在路侧&#xff0c;与附近过往车辆进行双向通信、交互数据&#xff0c;是智能交通系统中的一种重要设备。RSU可以连接路面原有电子设备&#xff0c;比如信号灯和摄像头&…

一文解决Xshell无法连接vmware上的centos

问题描述 win10系统上安装VMware workstation16 pro&#xff0c;装好后安装centos虚拟机&#xff0c;在设置network & hostname时选择的NAT模式&#xff0c;即使用自定义的网关和IPv4地址&#xff0c;最后配置完成后centos主机地址信息如下&#xff0c;在虚拟机内部进行pi…

【一览无余】Vue框架下Cesium加载遥感地图使用GeoServer切割TIF大文件对外发布WMS服务进行地图绘制(科普篇2/2)

【一览无余】Vue框架下Cesium加载遥感地图使用GeoServer切割TIF大文件对外发布WMS服务进行地图绘制&#xff08;科普篇2/2&#xff09; 二、Cesium是弄啥嘞2.1 WebGL2.1.1 WebGL是什么2.1.2 WebGL优点 2.2 Cesium是什么2.3 Cesium能干什么2.4 Cesium相关工具有哪些2.5 相关案例…

Echarts 3D散点图

文章目录 以下是一个 html echarts的案例 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>ECharts 3D Scatter Plot Demo</title><!-- 引入 ECharts --><script src"https://cdnjs.cloudflare.com/…

急吗?光急可没用呀!满满干货,两小时速成,别搁那干瞪眼了!

全球产业链加速重构&#xff0c;各种不确定性加大&#xff01;数字经济规模不断提升&#xff0c;为企业转型与发展创造大量机会&#xff01;企业亟须以数字化为工具或手段&#xff0c;再造组织流程和业务流程&#xff0c;以数字化确定性应对外部环境变化的不确定性&#xff0c;…

中检集团:把数智化转型作为“1号工程”

2018年4月&#xff0c;中国检验认证集团&#xff08;以下简称“中检集团”&#xff09;启动信息化建设“1号工程”&#xff0c;5年时间&#xff0c;从“数字中检1.0”升级到“2.0”再到“2.1”“2.2”&#xff0c;中检集团在数智化转型过程中&#xff0c;可谓是打了一场攻坚战。…

智能ai文章伪原创工具-智能ai文章原创处理系统

智能AI文章伪原创工具 您好&#xff0c;智能AI文章伪原创工具是一种通过机器学习和自然语言处理技术&#xff0c;帮助用户生成“看起来像是”原创文章的人工智能工具。该工具的原理是将原始文章分解为各个句子和段落&#xff0c;然后对其中的一些单词、短语或句子进行修改或替…