手撕代码——任意奇数分频

news2024/11/25 4:35:52

手撕代码——任意奇数分频

一、奇数分频器原理与设计

  在上文《手撕代码——任意偶数分频》中,我们编写任意偶数分频的Verilog代码,对时钟进行偶数分频,只需要用到时钟的上升沿或者下降沿即可,而要进行N倍奇数分频,需要同时用到时钟的上升沿和下降沿。对上升沿和下降沿分别设计一个上升沿计数器posedge_cnt和一个下降沿计数器negedge_cnt,计数器的位宽为 l o g 2 N log_2N log2N

//上升沿计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        posedge_cnt <= 'd0;
    else if(posedge_cnt == DIV_PARAM-1)
        posedge_cnt <= 'd0;
    else
        posedge_cnt <= posedge_cnt + 1'b1;
end

//下降沿计数器
always @(negedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        negedge_cnt <= 'd0;
    else if(negedge_cnt == DIV_PARAM-1)
        negedge_cnt <= 'd0;
    else
        negedge_cnt <= negedge_cnt + 1'b1;
end

  同时根据上升沿计数器和下降沿计数器得到两个不同的时钟信号clk_1和clk_2,对这两个时钟信号clk_1和clk_2进行运算,得到目的分频时钟信号。在这里,可以通过或操作得到目的时钟信号。

//或操作
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        clk_1 <= 1'b0;
    else if(posedge_cnt > (DIV_PARAM>>1))
        clk_1 <= 1'b1;
    else
        clk_1 <= 1'b0;
end

always @(negedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        clk_2 <= 1'b0;
    else if(negedge_cnt > (DIV_PARAM>>1))
        clk_2 <= 1'b1;
    else
        clk_2 <= 1'b0;
end

assign clk_o = clk_1 || clk_2;

  同样的,也可以通过与操作得到目的分频时钟信号。

//与操作
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        clk_1 <= 1'b0;
    else if(posedge_cnt > (DIV_PARAM>>1)-1)
        clk_1 <= 1'b1;
    else
        clk_1 <= 1'b0;
end

always @(negedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        clk_2 <= 1'b0;
    else if(negedge_cnt > (DIV_PARAM>>1)-1)
        clk_2 <= 1'b1;
    else
        clk_2 <= 1'b0;
end

assign clk_o = clk_1 && clk_2;

  也可以通过异或操作得到目的分频时钟信号。

//异或操作
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        clk_1 <= 1'b0;
    else if(posedge_cnt == DIV_PARAM-1)
        clk_1 <= ~clk_1;
    else
        clk_1 <= clk_1;
end

always @(negedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        clk_2 <= 1'b0;
    else if(negedge_cnt == (DIV_PARAM>>1))
        clk_2 <= ~clk_2;
    else
        clk_2 <= clk_2;
end

assign clk_o = clk_1 ^ clk_2;

二、完整代码与仿真文件

  任意奇数分频器代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/22 11:37:51
// Design Name: 
// Module Name: clk_divide_odd
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module clk_divide_odd
#(
    parameter DIV_PARAM = 3 //分频系数(奇数)
)
(
    input   sys_clk  ,
    input   sys_rst_n,
    output  clk_o     
);

parameter   CNT_WIDTH = $clog2(DIV_PARAM); //计数器位宽

reg     [CNT_WIDTH-1:0]     posedge_cnt; //上升沿计数器
reg     [CNT_WIDTH-1:0]     negedge_cnt; //下降沿计数器
reg                         clk_1; //时钟1
reg                         clk_2; //时钟2

//上升沿计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        posedge_cnt <= 'd0;
    else if(posedge_cnt == DIV_PARAM-1)
        posedge_cnt <= 'd0;
    else
        posedge_cnt <= posedge_cnt + 1'b1;
end

//下降沿计数器
always @(negedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        negedge_cnt <= 'd0;
    else if(negedge_cnt == DIV_PARAM-1)
        negedge_cnt <= 'd0;
    else
        negedge_cnt <= negedge_cnt + 1'b1;
end

//---------------------------------------------------------//
//或操作
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        clk_1 <= 1'b0;
    else if(posedge_cnt > (DIV_PARAM>>1))
        clk_1 <= 1'b1;
    else
        clk_1 <= 1'b0;
end

always @(negedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        clk_2 <= 1'b0;
    else if(negedge_cnt > (DIV_PARAM>>1))
        clk_2 <= 1'b1;
    else
        clk_2 <= 1'b0;
end

assign clk_o = clk_1 || clk_2; 

endmodule

  仿真代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/22 14:13:28
// Design Name: 
// Module Name: tb_clk_divide_odd
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_clk_divide_odd();

parameter DIV_PARAM = 5; //分频系数(奇数)

reg   sys_clk  ;
reg   sys_rst_n;
wire  clk_o    ;

initial begin
    sys_clk = 1'b1;
    sys_rst_n <= 1'b0;
    #20
    sys_rst_n <= 1'b1;

end

always #5 sys_clk = ~sys_clk;

clk_divide_odd
#(
    .DIV_PARAM(DIV_PARAM) //分频系数(奇数)
)
clk_divide_odd
(
    .sys_clk  (sys_clk  ),
    .sys_rst_n(sys_rst_n),
    .clk_o    (clk_o    ) 
);

endmodule

三、仿真结果

  分别对使用或操作、与操作、异或操作的奇数分频器进行仿真。

(1)或操作奇数分频

在这里插入图片描述
(2)与操作奇数分频

在这里插入图片描述
(3)异或操作奇数分频

在这里插入图片描述
  仿真通过。

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

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

相关文章

修改Allure报告窗口标题,Overview的标题文案,环境配置,左上角LOGO

前言 如下图所示&#xff1a; 一、修改Allure报告窗口标题 Allure-html测试报告的窗口标题保存在&#xff1a;allure-html目录下的index.html文件 写个 set_windows_title 方法&#xff0c;并在 run.py 的执行文件去调用即可修改&#xff08; 在html报告生成后&#xff09…

研报精选230522

目录 【行业230522东亚前海证券】新能源行业深度报告&#xff1a;政策东风与海外需求共振&#xff0c;充电桩迎新一轮增长周期 【行业230522西南证券】人工智能专题研究&#xff1a;AIGC投资框架 【行业230522国信证券】传媒互联网行业周报&#xff1a;OpenAI推出移动版及网页端…

文献笔记——A brief introduction to distributed systems(分布式系统)

本文主要讨论了分布式系统。作者提供了关于分布式系统的概述&#xff0c;是一份很好的新手教程。 Fig.1 大纲 在论文的第一部分&#xff0c;作者简要回顾了计算机的演变&#xff0c;指出了分布式系统的两个技术基础&#xff1a;性能强大的微处理器的发展和高速计算机网络的发明…

OpenCV:CMake 产生 VS2019 项目和解决方案

CMake 是一个跨平台的自动化编译程序&#xff0c;它用于管理代码的构建过程。使用 CMake 可以简化跨平台项目的构建和移植&#xff0c;提供简单而强大的语法来描述构建过程&#xff0c;并生成多种不同的构建系统&#xff0c;如 GNU Make、Ninja 和 Visual Studio。因为 CMake 具…

8年测试总结,性能测试问题大全,这些问题你应该认清的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 响应时间VS吞吐量…

18-02 数据库设计核心要点

概念结构设计 通过对用户需求进行综合、归纳和抽象&#xff0c;形成独立于具体数据库管理系统的概念模型把需求分析阶段得到的应用需求&#xff0c;抽象成概念模型连接现实世界和信息世界的桥梁好的概念结构设计 能真实、充分的反映现实世界要易于理解要易于修改 基本概念 …

kubeadm部署k8s 1.26.0版本高可用集群

1.前言 本次搭建使用centos7.9系统&#xff0c;并且使用haproxykeepalived作为高可用架构软件&#xff0c;haproxy实现k8s集群管理节点apiserver服务的负载均衡以实现集群的高可用功能&#xff0c;keepalived保障了hapxoy的高可用&#xff0c;容器引擎使用docker&#xff0c;需…

迁移iceberg:一.查看所需要的资源。

一&#xff1a;内存&#xff0c;CPU&#xff0c;核数&#xff0c;线程&#xff0c;硬盘。 1. cpu&#xff0c;核素&#xff0c;线程。 cpu cpu就相当于人类的大脑&#xff0c;是处理数据的地方。 cpu由以下三个组成。 控制器。由控制单元、指令译码器、指令寄存器组成。运算…

戴尔 dell Inspiron3670电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板B360 处理器i5-9400已驱动 内存8GB已驱动 硬盘KBG40ZNS256G NVMe KIOXIA 256GB ST1000DM010 1TB已驱动 显卡UHD630(1.05GHZ)已驱动 声卡Realte…

Node模拟慢接口

为了快速搭建一个后台服务&#xff0c;并模拟慢接口&#xff0c;我们选择 Koa 这个轻量的 Node 框架。 快速开始 Koa 使用起来非常方便&#xff0c;只需要&#xff1a; 新建项目文件夹&#xff1a;mkdir koa-server创建 package.json&#xff1a;npm init -y安装 Koa&#x…

夏季门店做好这3点,销量翻一番!

现在正值5月末&#xff0c;天气开始炎热起来。在酷热的夏日&#xff0c;很多人都只想呆在家里吹空调刷手机&#xff0c;外出消费的人数开始变少。 面对越来越炎热的天气&#xff0c;我们这些做实体店生意的该如何应对呢&#xff1f;想要在夏季客流不减反增&#xff0c;销量翻倍…

【高分论文密码】大尺度空间模拟预测和数字制图技术和不确定性分析

目录 专题一 R语言空间数据介绍及数据挖掘关键技术 专题二 R语言空间数据高级处理技术 专题三 R语言多维时空数据处理技术、数据清洗整合和时间序列分析 专题四 R语言地统计与空间自相关、空间插值方法 专题五 R语言机器学习与空间模型预测及不确定性评估 专题六 R语言空…

【DRF配置管理】如何使用序列化:验证码、注册和登录

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 DRF应用和管理 【DRF配置管理】Django安装DRF框架并生成openapi风格文档 【DRF配置管理】如何实现JWT身份验证 【DRF配置管理】如何使用序列化:验证码…

如何设计正确的SpringBoot接口访问频率?

最近在基于SpringBoot做一个面向普通用户的系统&#xff0c;为了保证系统的稳定性&#xff0c;防止被恶意攻击&#xff0c;我想控制用户访问每个接口的频率。为了实现这个功能&#xff0c;可以设计一个annotation&#xff0c;然后借助AOP在调用方法之前检查当前ip的访问频率&am…

SpringBoot——对于属性中的时间和文件的单位进行设置

简单介绍&#xff1a; 在之前我们编写配置文件的时候&#xff0c;有时候多种技术的配置的属性值的默认属性的单位不同&#xff0c;比如在Tomcat中&#xff0c;对于最大连接时间就是以毫秒为单位&#xff0c;但是对于session的过期时间就是以分钟为单位&#xff0c;像这种单位不…

java线程池ThreadPoolExecutor使用

文章目录 一、简介1. 背景2. Executor接口介绍 二、使用Executors工厂创建线程池1. 简介2. 使用newCachedThreadPool()方法创建无界线程池3. 验证newCachedThreadPool()方法创建的线程池和线程复用特性4. 使用newCachedThreadPool(ThreadFactory)定制线程工厂5. 使用newCachedT…

怎么把音乐的伴奏提取出来?分享几个音乐伴奏提取的方法!

在这个数字时代&#xff0c;人人都有机会成为视频创作者。如果你也想发布自己剪辑的短视频&#xff0c;就需要了解视频编辑的相关操作。其中一个重要的操作是提取人声&#xff0c;将音频中人物的声音从杂音中分离出来&#xff0c;使声音更加清晰。那么&#xff0c;如何从音频中…

GPT时代,最令人担心的其实是“塔斯马尼亚效应”

目录 教育到底教什么&#xff1f; 过度依赖GPT可能导致文明退化 GPT可以帮助人类破解“学海无涯极限”悖论 春季学期伊始&#xff0c;全球各地的老师们如临大敌&#xff0c;因为学生们带着ChatGPT杀过来了。Study.com的调研显示&#xff0c;每10个学生中就有超过9个知道Chat…

基于FPGA的超声波测距——数码管显示

文章目录 前言一、超声波模块介绍1、产品特点2、超声波模块的时序图 二、系统设计1、系统框图2、源码3、RTL视图4、效果 三、总结四、参考资料 前言 环境&#xff1a; 1、Quartus18.1 2、vscode 3、板子型号&#xff1a;EP4CE6F17C8N 4、超声波模块&#xff1a;HC_SR04 要求&am…

【持续集成CI/持续部署CD】二、Docker安装Maven私服Nexus

本文是关于通过 Docker 进行安装部署 Nexus3 私服的快速入门和简单使用案例。 一、安装 1. 通过 docker 获取最新版本的 nexus3 镜像 docker pull sonatype/nexus3创建 docker 镜像到宿主机的磁盘映射目录Linux:mkdir -p /home/nexus/datachmod 777 -R /home/nexus/dataWind…