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

news2024/9/21 4:32:04

题目来源于牛客网,完整工程源码: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/134947.html

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

相关文章

【阶段二】Python数据分析NumPy工具使用04篇:数组常用分析函数、数组广播与数组和矩阵的点积运算

本篇的思维导图: 数组常用分析函数 基本数学函数 函数 描述 abs 求取每个元素的绝对值

1-计算机系统概述

文章目录一.操作系统的基本概念&#xff08;一&#xff09;操作系统的特征&#xff08;二&#xff09;操作系统的目标和功能二.操作系统的发展与分类&#xff08;一&#xff09;手工操作阶段&#xff08;二&#xff09;批处理阶段&#xff08;三&#xff09;分时操作系统&#…

verilog学习笔记- 1)Quartus软件的使用

目录 新建工程&#xff1a; 设计输入&#xff1a; 配置工程&#xff1a; 编译 &#xff1a; 分配引脚&#xff1a; 编译工程&#xff1a; 下载程序&#xff1a; 固化程序 &#xff1a; 在开始使用 Quartus 软件之前&#xff0c;我们先来了解一下 Quartus 软件的使用流程…

Windows10 下的docker和Kubernetes安装

Docker官网Docker Desktop 安装 Docker官网 进入docker官网&#xff0c;下载windows版 docker desktop建议使用win10专业版在任务管理器查看是否开启了windows虚拟化如果没有开启&#xff0c;则在控制面板&#xff0c;启用或关闭windows功能&#xff0c;勾选Hyper-v&#xff…

面向对象1(类的成员变量的默认值规则、private、this、构造方法、基本数据类型和引用数据类型)

1、定义类的注意事项 类的成员变量的默认值规则 2、private 3、this关键字 语法是this. 4、构造方法 先Constructor生成构造方法&#xff0c;select无参构造&#xff0c;Ctrla全参构造 再Getter and Setter生成每个成员变量的getter 和 setter方法 也可以使用插件右键Ptg To …

java开发的美食菜谱网

简介 Java开发美食菜谱分享网站&#xff0c;健康专题分享&#xff0c;菜谱网源码。用户可以发布菜谱&#xff0c;可以评论&#xff0c;可以发布关于健康饮食的文章&#xff0c;还可以查看自己的主页。管理员可以管理所有的数据&#xff0c;审核数据。 演示视频 https://www.b…

ROS机器人底盘坐标像素变换

对于ROS小车底盘地图数据需要知道的点 1.整幅地图处于第三象限 2.坐标值代表距离&#xff0c;单位米。 3.分辨率单位&#xff08;米/像素&#xff09; 因此通过地图坐标得到像素坐标的办法&#xff1a; 像素坐标(实时坐标-初始坐标)/分辨率 实时坐标的获取&#xff1a; 触发条…

20230102单独编译Toybrick的TB-RK3588X开发板的Android12的内核【失败】

20230102单独编译Toybrick的TB-RK3588X开发板的Android12的内核【失败】 现阶段已经验证通过的编译指令&#xff1a; 直接使用build.sh编译了。 rootrootrootroot-adol-ADOLBOOK-I421UAY-ADOL14UA:~/toybrick3588_discrete$ source build/envsetup.sh rootrootrootroot-adol-A…

windows下编译opencv_contrib

文章目录基本环境二. 准备1. 下载所需各软件的安装文件2. 安装所需软件三.编译opencv步骤基本环境 cmaker&#xff1a;3.22.0vs2019&#xff1a;16.11.10CUDA&#xff1a;11.4.1cudnn&#xff1a;8.2.4opencv_source&#xff1a;4.5.4opencv_contrib&#xff1a;4.5.4python&a…

给程序员友人,2022投资总结的6000字评论

程序员友人的2022投资总结 以下是我的评论、回复。 友情提示&#xff1a;不好意思&#xff0c;长篇大论了&#xff0c;先长篇铺垫&#xff0c;再到正题。 下午说道&#xff1a;以我的最新投资原则方法&#xff0c;对你的持股情况&#xff0c;略显忧虑。 “一直放心不下”&#…

Ubuntu 18.04使用CMake编译可执行文件、动态链接库

目录准备新建文件编辑源文件编译生成可执行文件编译生成动态链接库准备 新建文件 在开始之前&#xff0c;我们先准备一个项目所需要的基本结构。 新建一个项目的文件夹test_so在项目文件夹中新建一个src文件夹存放源代码&#xff08;并新建一个test.cpp文件&#xff09;&…

基于 Prometheus 的监控平台简介

1. Prometheus 体系架构简介 Prometheus 是 CNCF 基金会的一款开源产品&#xff0c;主要用做监控系统&#xff0c;通常用来和 Zabbix 等监控系统做比较&#xff0c;以其简单易用、架构灵活著称。整个 Prometheus 的架构如上&#xff0c;分为几个重要的部分&#xff1a; 指标收…

Kubernetes:Ingress

文章目录1、安装 Ingress 控制器2、Ingress 扇出3、基于名称的虚拟托管4、Ingress TLSIngress 是一组路由规则&#xff0c;公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 Ingress 控制器是一组 pod&#xff0c;负责通过负载均衡器来解析 Ingress 路由规则&#xff0c;将请…

序列到序列学习(seq2seq,BLEU)

根据“编码器-解码器”架构的设计&#xff0c; 我们可以使用两个循环神经网络来设计一个序列到序列学习的模型。 在实现编码器和解码器时&#xff0c;我们可以使用多层循环神经网络。 我们可以使用遮蔽来过滤不相关的计算&#xff0c;例如在计算损失时。 在“编码器&#xf…

crackme01——Acid_burn

最近对逆向稍微有点兴趣&#xff0c;自学了一点。写这个文章主要用于记录学习的过程。 首先看一下这个程序&#xff0c;其实就是个简单的比对程序&#xff0c;主界面按左侧按钮进入Name Serial界面&#xff0c;点击【Check it Baby】&#xff0c;则弹出窗口【Sorry, The seria…

[Java]JDBC学习笔记(尚硅谷康师傅JDBC)

文章目录&#x1f97d; 视频链接及资源下载&#x1f97d; JDBC简介&#x1f97d; JDBC程序访问数据库步骤&#x1f97d; 获取数据库连接&#x1f30a; 导入jar包&#x1f30a; Driver 接口&#x1f30a; JDBC URL&#x1f30a; 方式1&#xff1a;&#x1f30a; 方式2&#xff1…

educoder数据结构与算法 线性表 第2关:实现一个链接存储的线性表

本文已收录于专栏 &#x1f332;《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》&#x1f332; 目录 本文已收录于专栏 &#x1f332;《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》&#x1f332; &#x1f350;任务描述&#x1f350; &#x1f350;相关知识…

Java基础学习笔记(九)—— 常用API(2)

常用API1 Math类2 system类3 Object类3.1 概述3.2 常用方法3.3 常见面试题4 Objects类5 BigDecimal类5.1 构造方法5.2 常用方法6 时间日期类6.1 Date类6.2 SimpleDateFormat类6.3 JDK8新增日期类1 Math类 Math 包含执行基本数字运算的方法 Math中方法的调用方式&#xff1a;M…

Markdown 使用语法(详细)

想要学习Markdown&#xff0c;这篇文章就够了。 Markdow简介 Markdown 是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;John Gruber&#xff09;。 它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者HTML&…

IEEE期刊投稿流程

一、注册过程 1.1、确定期刊。 首先可以通过IEEE搜索需要投稿的期刊(以TMC为例)&#xff0c;然后点击Submit Manuscript ,进入ScholarOne主页 1.2、账号注册。 进入到ScholarOne之后&#xff0c;若没有注册过需要先注册一个账号。 1.3、创建账户。 点击Create an Account&a…