4种FPGA时钟分频 【附源码】:1.偶数分频;2.奇数分频(占空比50%);3.奇数分频(任意无占空比);4.小数分频;

news2024/12/23 17:02:47

题目来源于牛客网,完整工程源码:https://github.com/ningbo99128/verilog


目录

VL37 偶数分频

VL40 奇数分频(占空比50%)

VL42 奇数分频(任意无占空比)

VL41 任意小数分频


VL37 偶数分频

题目介绍

请使用D触发器设计一个同时输出2/4/8分频的50%占空比的时钟分频器;注意rst为低电平复位。

信号示意图:

波形示意图:

输入描述:

输入信号 clk_in、rst 
类型 wire

输出描述:

输出信号 clk_out2、clk_out4、clk_out8
类型  wire

思路分析

题目中说要使用D触发实现分频,我们在此基础上再写另一种实现方法。

1、d触发器实现

        信号clk_out2在时钟信号clk_in上升沿时进行状态翻转,从而实现二分频。那么四分频、八分频原理类似,输出信号分别在时钟信号clk_out2、clk_out4的上升沿时进行状态翻转。

2、计数器实现

        首先,定义一个3位宽的计数器信号cnt,然后使其在从clk_in上升沿时进行计数,计数范围为1-4。其次,二分频clk_out2、四分频clk_out4、八分频clk_out8等输出信号分别选择合适的计数值进行翻转,从而实现分频。例如,八分频clk_out8在cnt=1时进行翻转,四分频clk_out4在cnt=1和cnt=3时进行翻转,二分频clk_out2在cnt值为1、2、3、4时进行翻转。

代码实现

方法1:

//*************cnt实现***********//	
/*
reg [2:0] cnt;
reg clk_div2;
reg clk_div4;
reg clk_div8;

always @(posedge clk_in or negedge rst)begin
	if(!rst)
		cnt <= 3'b0;
	else if(cnt == 3'd4)
		cnt <= 3'b1;
	else	
		cnt <= cnt + 1'b1;
end

//可以合在一个always块里,也可以拆开写;
always @(posedge clk_in or negedge rst)begin
	
	//二分频
	if(!rst)
		clk_div2 <= 1'b0;
	else if(cnt == 3'd1 || cnt == 3'd2 || cnt == 3'd3 || cnt == 3'd4)
		clk_div2 <= ~clk_div2;
	else 
		clk_div2 <= clk_div2;

	//四分频
	if(!rst)
		clk_div4 <= 1'b0;
	else if(cnt == 3'd1 || cnt == 3'd3)
		clk_div4 <= ~clk_div4;
	else 
		clk_div4 <= clk_div4;

	//八分频
	if(!rst)
		clk_div8 <= 1'b0;
	else if(cnt == 3'd1)
		clk_div8 <= ~clk_div8;
	else 
		clk_div8 <= clk_div8;
end

assign clk_out2 = clk_div2;
assign clk_out4 = clk_div4;
assign clk_out8 = clk_div8;
*/
//*************cnt实现***********//	

方法2:

//*************D触发器实现***********//

reg clk_div2;
reg clk_div4;
reg clk_div8;

always @(posedge clk_in or negedge rst)begin
	if(!rst)
		clk_div2 <= 1'b0;
	else
		clk_div2 <= ~clk_div2;
end

always @(posedge clk_out2 or negedge rst)begin
	if(!rst)
		clk_div4 <= 1'b0;
	else
		clk_div4 <= ~clk_div4;
end

always @(posedge clk_out4 or negedge rst)begin
	if(!rst)
		clk_div8 <= 1'b0;
	else
		clk_div8 <= ~clk_div8;
end

assign clk_out2 = clk_div2;
assign clk_out4 = clk_div4;
assign clk_out8 = clk_div8;

//*************D触发器实现***********//

仿真文件

仿真图:

基于cnt计数法实现分频
基于D触发器(dff)实现分频

VL40 奇数分频(占空比50%)

题目介绍

设计一个同时输出7分频的时钟分频器,占空比要求为50%,注意rst为低电平复位;

信号示意图:

波形示意图:

输入描述:

输入信号 clk_in rst 
类型 wire

输出描述:

输出信号  clk_out7
类型  wire

思路分析

        实现7分频且占空比为50%,也就是高低电平分别为3.5个时钟周期。可以用2个7分频计数器(计数时钟沿一个是posedge,一个是negedge)来产生2个信号(高电平为3个clk、低电平为4个clk),然后 对2个相位差半个时钟周期的信号进行或运算实现占空比为50%的7分频输出信号。

代码实现

利用2个7分频计数器实现;一个是上升沿跳变,一个是下降沿跳变。

注:

问:关于为啥这两个计数器的技术状态是1、2、3、4、5、6、7;而不是0、1、2、3、4、5、6?

答:是因为复位时,计数器的初始状态为0,已经占据一个0状态。严格来说,不应该再用这个状态了。平时这两种用法都可以,但是牛客网的判定是0-6状态有错误,所以本文在这里用1-7状态。

module odo_div_or(
    input    wire  rst ,
    input    wire  clk_in,
    output   wire  clk_out7
  );

//*************code***********//	

reg [2:0] 	cnt_pose;
reg [2:0] 	cnt_nege;
reg 		div_pose3;
reg 		div_nege3;

//计数器
always @(posedge clk_in or negedge rst)begin
	if(!rst)
		cnt_pose <= 1'b0;
	else if(cnt_pose == 3'd7)
		cnt_pose <= 1'b1;
	else
		cnt_pose <= cnt_pose + 1'b1;
end

always @(negedge clk_in or negedge rst)begin
	if(!rst)
		cnt_nege <= 1'b0;
	else if(cnt_nege == 3'd7)
		cnt_nege <= 1'b1;
	else
		cnt_nege <= cnt_nege + 1'b1;
end

//3分频(上升沿跳变)
always @(posedge clk_in or negedge rst)begin
	if(!rst)
		div_pose3 <= 1'b0;
	else if(cnt_pose == 3'd3 || cnt_pose == 3'd6)
		div_pose3 <= ~div_pose3;
	else
		div_pose3 <= div_pose3;
end

//3分频(下降沿跳变)
always @(negedge clk_in or negedge rst)begin
	if(!rst)
		div_nege3 <= 1'b0;
	else if(cnt_nege == 3'd3 || cnt_nege == 3'd6)
		div_nege3 <= ~div_nege3;
	else
		div_nege3 <= div_nege3;
end

assign clk_out7 = div_pose3 | div_nege3;

//*************code***********//		
endmodule	

仿真文件

仿真图:

VL42 奇数分频(任意无占空比)

题目介绍

请设计一个同时输出5分频的时钟分频器,本题对占空比没有要求

注意rst为低电平复位

信号示意图:

波形示意图:图放的是50%占空比的。

输入描述:

输入信号 clk_in rst 
类型 wire

输出描述:

输出信号  clk_out5
类型  wire

思路分析

这道题比占空比50%的奇数分频要简单很多,而且答案并不唯一。不过Testbench只限定了一种分频结果,实测高3低2会出错。并且题目要求同时输出,也就是说输入拉高时输出也要拉高,思路是设置一个计数器cnt,计数范围0-4,每个clk_in周期加1。所以在计数器为0时就开始翻转,以及在2时也进行翻转

代码实现

reg [2:0] 	cnt_pose;
reg 		div_pose3;

//计数器
always @(posedge clk_in or negedge rst)begin
	if(!rst)
		cnt_pose <= 1'b0;
	else if(cnt_pose == 3'd4)
		cnt_pose <= 1'b0;
	else
		cnt_pose <= cnt_pose + 1'b1;
end


//高电平3个 低电平2个牛客网才判定正确,所以为了过关,只能这样了。
always @(posedge clk_in or negedge rst)begin
	if(!rst)
		div_pose3 <= 1'b0;
	else if(cnt_pose == 3'd2 || cnt_pose == 3'd0)
		div_pose3 <= ~div_pose3;
	else
		div_pose3 <= div_pose3;
end

assign clk_out5 = div_pose3;

仿真文件

VL41 任意小数分频

题目介绍

请设计一个可以实现任意小数分频的时钟分频器,比如说8.7分频的时钟信号;

注意rst为低电平复位

提示:其实本质上是一个简单的数学问题,即如何使用最小公倍数得到时钟周期的分别频比。设小数为nn,此处以8.7倍分频的时钟周期为例。首先,由于不能在硬件上进行小数的运算(比如2.1个时钟这种是不现实的,也不存在3.3个寄存器),小数分频不能做到分频后每个时钟周期都是源时钟的nn倍,也无法实现占空比为1/2,因此,考虑小数分频,其实现方式应当为53个clkout时钟周期是10个clkin时钟周期的8.7倍。

信号示意图:

波形示意图:

输入描述:

        输入信号 clk_in rst 
        类型 wire

输出描述:

        输出信号  clk_out
        类型  wire

思路分析

“Leonico”大佬写的很好,就直接引用了。牛客网的讲解链接:任意小数分频_牛客题霸_牛客网

代码实现

仿真文件

波形图:

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

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

相关文章

https的相关知识,为什么https更加安全,为什么要对称与非对称加密,非对称加密的算法

目录 https相比于http更加安全&#xff0c;三个优势&#xff1a; 下面是一些必须知道的问题 1.对称加密与非对称加密&#xff1a; 2.对称加密的密钥SK如何产生和传输&#xff1a; 3.https有两套非对称加密 4.https的哈希一共用于两个地方 5.https的整个流程 https相比于ht…

ElasticSearch数据实时性原理分析与持久化

问题复现 现在有这么一种业务场景&#xff0c;需要将海量的数据通过Hive进行数据清洗并统计&#xff0c;最后落库到ES中&#xff0c;因为需要支持大数据量的分词&#xff0c;模糊搜索&#xff0c;所以考虑用ES而不直接放到Mysql中&#xff0c;前端需要直接对数据进行交互&…

Redis的自增也能实现滑动窗口限流?

文章目录限流核心原理以及代码基于Spring切面实现的注解版本限流是大家开发之路上一定会遇到的需求。比如&#xff1a;限制一定时间内&#xff0c;接口请求请求频率&#xff1b;一定时间内用户发言、评论次数等等&#xff0c;类似于滑动窗口算法。这里分享一份拿来即用的代码&a…

buildroot构建hisi平台根文件系统和工具链

buildroot构建hisi平台根文件系统和工具链 前面使用了arm-hisiv300-linux 工具链来作为Buildroot的外部工具链进行编译&#xff0c;然后遇到了很多编译问题。 https://blog.csdn.net/duapple/article/details/128516133?spm1001.2014.3001.5501 这里不使用hisi的工具链&…

Seata简介

小结&#xff1a; nacos 【name server】&#xff1a;注册中心&#xff0c;解决服务的注册与发现 nacos【config】&#xff1a;配置中心&#xff0c;微服务配置文件的中心化管理&#xff0c;同时配置信息的动态刷新 Ribbon&#xff1a;客户端负载均衡器&#xff0c;解决微服务集…

C++之引用类型,深浅拷贝构造

引用类型&#xff1a;给内存段取别名。 int m 10; //引用&#xff0c;给内存段取别名&#xff0c;所以需要给他一段内存段&#xff0c;而不只是声明。 int& n m;//不是赋值的意思&#xff0c;是别名的意思 想要在被调函数中修改主调函数中定义的变量的值时&#xff0c;…

小程序用户头像昵称获取规则调整与之对应调式策略、新API接口的bug

目录 调整时间 调整背景 调整说明 开发者与之对应的debug策略 1.button里面包含一个image&#xff0c;这种包含关系 2.然后我们可以看到官方给出的是用button组件中的open-type属性并且给到了一个chooseAvatar值&#xff01; 3.我们会发现光放给我们了一个“配置好的”命…

CSAPP Cache Lab

CSAPP Cache Lab 本实验将帮助您了解缓存存储器对 C 语言性能的影响程式。实验室由两部分组成。 在第一部分中&#xff0c;您将编写一个小的 C 程序&#xff08;大约 200-300 行&#xff09;模拟高速缓存的行为。 在第二部分中&#xff0c;您将优化一个小型矩阵转置函数&#…

NoMachine出现 The session negotiation failed的解决方案及踩坑总结

问题情况&#xff1a;我A电脑输入用户名和密码可以远程B电脑&#xff0c;B电脑输入用户名密码就是登录不上A电脑。 B电脑上密码是用的账户密码&#xff08;就是图标是一把钥匙的那个&#xff09;。 A电脑上的密码是用的PIN密码&#xff08;Win11系统推荐的那个&#xff09;。 通…

ArcGIS基础实验操作100例--实验37线要素生成规则或随机采样点

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验37 线要素生成规则或随机采样点 目录 一、实验背景 二、实验数据 三、实验步骤 &…

小程序安全设置的经验分享

一、小程序框架概述 在第一部分小程序框架概述中,将介绍小程序抽象框架、小程序调用框架和小程序初始化流程。下面让大白来逐一介绍。 1、小程序抽象框架 1.1视图层 包含WXML、WXSS和页面视图组件。 WXML是一种类似XML格式的语言,支持数据绑定、条件渲染、列表渲染、自定…

零入门容器云网络-10:基于golang编程netlink包方式操作tun设备

已发表的技术专栏&#xff08;订阅即可观看所有专栏&#xff09; 0  grpc-go、protobuf、multus-cni 技术专栏 总入口 1  grpc-go 源码剖析与实战  文章目录 2  Protobuf介绍与实战 图文专栏  文章目录 3  multus-cni   文章目录(k8s多网络实现方案) 4  gr…

【Linux】静态库和共享库

目录 库是什么 静态库和共享库 库的链接 优缺点 查看使用的库 制作库 制作静态库 静态库的使用 制作共享库 共享库的使用 静态库和共享库的区别 库是什么 库就是预先编译好的方法的集合 .h中是库函数的声明&#xff0c;库函数的实现在库中&#xff0c;如&#xff…

ChatGPT上线了!我在2023年1月2日这一天用上了它!百问百答!我只能说(真NB)算法工程师可以不用百度/Google了!

目录:问答结果1、你有什么nlp算法&#xff1f;2、平台终端3、如何训练深度学习模型&#xff1f;4、如何压缩nlp模型&#xff1f;5、bert模型有哪些用途&#xff1f;6、你知道汽车座舱吗&#xff1f;7、知识图谱有什么用途&#xff1f;8、能给一个构建知识图谱的案例吗&#xff…

S32K144—基于MBD的BLDC六步换相算法

可以简单分为六个功能区域&#xff1a; 1、全局变量 全局变量的定义是建模过程中遇到的第一个难点&#xff0c;因为它涉及到我们软件开发中最基础的东西——数据类型定义&#xff08;Data Types Definition&#xff09;。 在 Simulink 中可以通过 Bus Editor 构建自定义数据类…

【 shell 编程 】第5篇 文本编辑三剑客

文本编辑三剑客 文章目录文本编辑三剑客一、正则表达式1.基本正则表达式元字符2.拓展正则表达式元字符二、grep1.grep2.egrep3.fgrep三、sed四、awk一、正则表达式 1、简介&#xff1a;正则表达式是对字符串&#xff08;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的…

点云算法-提取kitti路面点云

目录 一、ransac原理 二、ransac 地面分割原理 三、ransac常见应用 四、代码 五、截图 六、总结 一、ransac原理 RANSAC是“random sample consensus&#xff08;随机抽样一致&#xff09;”的缩写。它可以从一组包含“局外点”的观测数据集中&#xff0c;通过迭代方式估…

【408篇】C语言笔记-第二十一章(汇编语言)

文章目录第一节&#xff1a;汇编指令格式讲解1. 汇编指令格式2. 生成汇编方法第二节&#xff1a;汇编常用指令讲解1. 相关寄存器2. 常用指令3. 条件码第三节&#xff1a;各种变量赋值汇编实战1. 各种变量赋值汇编实战解析第四节&#xff1a;选择循环汇编实战1. 选择循环汇编实战…

基于ssm+mysql+jsp实现歇后语管理系统

基于ssmmysqljsp实现歇后语管理系统一、系统介绍二、系统展示1.歇后语大全2.歇后语排行榜3.歇后语管理4.用户管理三、其它系统四、获取源码一、系统介绍 本系统实现了 普通用户&#xff1a;歇后语大全、歇后语排行榜、歇后语管理 管理员用户&#xff1a;歇后语大全、歇后语排行…

一键替换Markdown文件的字体样式

功能说明 一键替换MD文件的字体样式&#xff1a;加粗字体—>橙色不加粗 也可以针对其它样式做切换&#xff0c;源码就一个demo类&#xff0c;修改正则匹配相关变量即可&#xff1b; 环境要求&#xff1a; windows jdk1.8 工具下载 百度网盘&#xff1a;提取码: ae16 …