【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL76

ops/2024/10/22 11:42:39/

任意奇数倍时钟分频

描述

编写一个模块,对输入的时钟信号clk_in,实现任意奇数分频,要求分频之后的时钟信号占空比为50%。模块应包含一个参数,用于指定分频的倍数。

       模块的接口信号图如下:

       要求:使用Verilog HDL语言实现,并编写testbench验证模块的功能。

输入描述:

clk_in:输入时钟信号

rst_n:复位信号,低电平有效

输出描述:

clk_out:分频之后的时钟信号

解题思路

理解题意

根据题目要求,将输入的时钟信号进行任意奇数分频,并要求占空比为50%;以5分频为例:

由上图所示,clk_in为原始时钟,clk_out为五分频后的输出时钟。其中,clk_out与clk_in经过同一个时钟上升沿,在clk_in经过2.5周期时clk_out触发下降沿;clk_out的一个完整的时钟周期长度等于clk_in五个时钟周期的长度

解题思路

①设置计数器,计数0~4

代码如下:

//时钟上升沿采样计数
always @(posedge clk_in or negedge rst_n) beginif (!rst_n) cnt <= 'b0;else if (cnt == dividor-1) cnt <= 'b0;else cnt <= cnt + 'd1;
end
 ②设置两个电平信号edge_rise和edge_fall;

其中,edge_rise为时钟上升沿触发,edge_fall为时钟下降沿触发,其中电平信号edge_rise和edge_fall将原时钟clk_in的5个时钟周期分为两个部分(即先经过2个时钟周期(第2个时钟周期)发生电平切换,再经过2个时钟周期(第4个时钟周期)再发生一次电平切换);其波形如下所示:

由波形图可以发现,将edge_rise的波形图向右平移半个时钟周期就可得到edge_fall的波形图

edge_rise波形与edge_fall波形进行异或就可得到原始时钟的五分频电路;

代码如下:

//电平信号edge_rise
always @(posedge clk_in or negedge rst_n) beginif (!rst_n) egde_rise <= 'b0;else if (cnt == (dividor-1>>1))		egde_rise <= ~egde_rise; //(dividor-1)/2 = 2else if (cnt == dividor-1)	egde_rise <= ~egde_rise; //dividor-1 = 4else egde_rise <= egde_rise;
end
//电平信号edge_fall
always @(negedge clk_in or negedge rst_n) beginif (!rst_n) egde_fall <= 'b0;else if (cnt == (dividor-1>>1))		egde_fall <= ~egde_fall; //(dividor-1)/2 = 2else if (cnt == dividor-1)	egde_fall <= ~egde_fall; //dividor-1 = 4else egde_fall <= egde_fall;
endassign clk_out = egde_rise | egde_fall; 

PS:对于任意奇数N倍时钟分频,则电平信号edge_rise和edge_fall将原时钟clk_in的N个时钟周期先经过(N-1)/2时钟周期(第(N-1)/2个时钟周期)发生电平切换,再经过(N-1)/2个时钟周期(第N-1个时钟周期)发生电平切换;

③完整代码如下;
`timescale 1ns/1nsmodule clk_divider#(parameter dividor = 5)
( 	input clk_in,input rst_n,output clk_out
);
parameter cnt_width = $clog2(dividor); //$clog2()为取对数操作
reg [cnt_width:0] cnt;
reg egde_rise, egde_fall;//时钟上升沿采样计数
always @(posedge clk_in or negedge rst_n) beginif (!rst_n) cnt <= 'b0;else if (cnt == dividor-1) cnt <= 'b0;else cnt <= cnt + 'd1;
endalways @(posedge clk_in or negedge rst_n) beginif (!rst_n) egde_rise <= 'b0;else if (cnt == (dividor-1>>1))		egde_rise <= ~egde_rise; //(dividor-1)/2 = 2else if (cnt == dividor-1)	egde_rise <= ~egde_rise; //dividor-1 = 4else egde_rise <= egde_rise;
endalways @(negedge clk_in or negedge rst_n) beginif (!rst_n) egde_fall <= 'b0;else if (cnt == (dividor-1>>1))		egde_fall <= ~egde_fall; //(dividor-1)/2 = 2else if (cnt == dividor-1)	egde_fall <= ~egde_fall; //dividor-1 = 4else egde_fall <= egde_fall;
endassign clk_out = egde_rise | egde_fall; endmodule

 


http://www.ppmy.cn/ops/124170.html

相关文章

ChatGPT相关参数示例

max_token 用于控制最大输出长度&#xff0c;若ChatGPT的回复大于max_tokens&#xff0c;则对输出结果进行截断。 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" ) response client.chat.completions.create(model"…

【含开题报告+文档+PPT+源码】基于过滤协同算法的旅游推荐管理系统设计与实现

开题报告 旅游业作为一种重要的经济活动&#xff0c;对于一个地区的经济发展和文化传承具有重要意义。泉州作为中国华东地区的重要城市&#xff0c;拥有丰富的自然资源和独特的文化底蕴&#xff0c;吸引了大量的游客。然而&#xff0c;随着旅游业的快速发展&#xff0c;游客数…

HCIP--以太网交换安全(三)MAC地址漂移防止与检测

MAC地址漂移防止与检测 一、MAC地址漂移防止与检测知识点 1.1MAC地址漂移的概述 MAC地址漂移是指交换机上一个vlan内有两个端口学习到同一个MAC地址&#xff0c;后学习到的MAC地址表项覆盖原MAC地址表项的现象。 1.2.MAC地址漂移的防止方法 &#xff08;1&#xff09;配置…

jmeter输出性能测试报告(常见问题处理与处理)

问题1&#xff1a;报错 WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows R 意思是&#xff1a;报没有权限 处理&#xff1a; 操作非gui生成测试报告的方法 cmd界面进入到 jmeter的bin目录 jmeter –n –t -l -e –o …

状态设计模式

简介 状态模式&#xff08;State Pattern&#xff09;也叫作状态机模式&#xff08;State Machine Pattern&#xff09;&#xff0c;允许对象在内部状态发生改变时改变它的行为&#xff0c;对象看起来好像修改了它的类&#xff0c;属于行为型设计模式。 通用模板 创建环境类角…

TON(三)空合约Func汇编为fift的底层(1)——PROC指令

系列文章目录 TON&#xff08;二&#xff09; TON&#xff08;一&#xff09; 文章目录 系列文章目录前言一、func编译到fift二、详细分析fift文件1. PROC指令定义 PROC 词定义 def-proc 词3. 定义 adj-long-proc 词4. 定义 sbits 词5 s>c 词的解释6. 定义 procdictkeyle…

【ArcGIS风暴】ArcGIS字段计算器公式汇总

在GIS数据处理中,ArcGIS的字段计算器是一个强大的工具,它可以帮助我们进行各种数值计算、文本处理和逻辑判断。本文将为您整合和分类介绍ArcGIS字段计算器中的常用公式,并通过实例说明它们的应用。 文章目录 一、数值计算类二、文本处理类三、日期和时间类四、逻辑判断类五、…

说说你对es6中promise的理解?

ES6中的Promise是一个非常重要的特性&#xff0c;它为异步编程提供了一种更优雅、更简洁的解决方案。以下是我对ES6中Promise的理解&#xff1a; 一、Promise的基本概念 Promise是异步编程的一种解决方案&#xff0c;它代表了一个异步操作的最终完成&#xff08;或失败&#…