任意分频器电路设计

news2024/11/26 4:52:49

目录

任意分频器电路设计

1、任意偶数分频器电路设计

1.2、实验任务

1.3、程序设计

1.3.1、代码如下:

1.3.2、编写仿真 TB 文件

2、任意奇数分频器电路设计

2.1、实验任务

2.2、程序设计

2.2.1、奇数分频电路代码

2.2.2、编写仿真 TB 文件

2.2.3、仿真验证


任意分频器电路设计

1、任意偶数分频器电路设计

       偶数分频实现比较简单,假设为 N(偶数)分频,只需计数到 N/2-1,然后时钟翻转、计数器清零,如此循环就可以得到 N(偶)分频。举个例子,比如晶振时钟是 100Mhz 时钟,想得到一个 25Mhz 的时钟, 那么这个是一个 100/25=4 的四分频设计,那么按照我们刚说的计数到 4/2-1=1,然后时钟翻转、计数器清零, 就可以得到一个 24Mhz 的时钟。

1.2、实验任务

使用 Verilog 语言设计一个任意偶数分频电路,默认进行 4 分频。

1.3、程序设计

       根据简介介绍的分频电路设计思路,假设为 N(偶数)分频,只需计数到 N/2-1,然后时钟翻转、计数清零,如此循环就可以得到 N(偶)分频,可以通过改变参量 N 的值和计数变量 cnt 的位宽实现任意偶分频,由于默认为 4 分频,因此 N 初始值为 4。我们由此可以写出如下代码。

1.3.1、代码如下:

//********************************************
module divide_2 
( 
    input        clk , // system clock 50Mhz on board
    input        rst_n, // system rst, low active 
    output reg   out_clk // output signal
);

parameter N = 4 ;

reg [N/2-1:0] cnt ;

//===============================================================
// ------------------------- MAIN CODE -------------------------
//===============================================================
always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt <= 0;
        out_clk <= 0;
    end
    else begin
        if(cnt==N/2-1) begin
        out_clk <= ~out_clk;
        cnt <= 0;
    end
    else
        cnt <= cnt + 1;
    end
end

endmodule

1.3.2、编写仿真 TB 文件

      只需要对时钟以及复位信号进行激励,代码编写如下:

//*************TB****************
`timescale 1ns / 1ps

module TB();

reg       sys_clk ;
reg       sys_rst_n;
wire      out_clk ;

initial begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    #200
    sys_rst_n = 1'b1;
end

always #10 sys_clk = ~sys_clk;

divide_2 u_divide_2(
    .clk       (sys_clk   ),
    .rst_n     (sys_rst_n ),
    .out_clk   (out_clk   )
);

endmodule

运行后的波形如下显示:

      可以看出,N 初始为 4,当复位撤销(复位信号低有效)之后,cnt 即开始计数,在计数器计到 1 的时候,out_clk 进行取反操作,即得到一个四分频时钟,大家可以改变 N 参数看下,看下 N 参数不一样,最终分频的时钟是多少。

2、任意奇数分频器电路设计

       有偶数分频就有奇数分频,仅实现分频功能来讲其中的差别和实现方式还是很大的,奇数分频相对于偶数分频要复杂一些,并不是简单的用计数器计数就可以实现的。

       奇数分频,顾名思义,是说分频后的频率和分频前的频率比例是奇数,比如 100Mhz 时钟,进行三分频后,就是 33.33Mhz。

       实现奇数分频原理是分别用上升沿计数到 N/2+1,分频后输出时钟进行翻转,再计数到 N/2 输出 out_clk1,再用下降沿计数到 N/2+1,分频后输出时钟再进行翻转,再计数到 N/2 输出out_clk2,将 out_clk1 和 out_clk2 相或即可。我们可以通过修改 N 的值和计数器的位宽来实现其他奇数分频。 其实 out_clk1 和 out_clk2 都已经是奇数分频的时钟,只不过占空比不是 50%。

      下面在进行奇数分频设计之前,我们先来了解下占空比的概念。占空比指的是时钟信号在一个周期内高电平和低电平的比例。如下是一个 50%占空比的一个时钟波形。

如下是一个 30%占空比的一个时钟波形。

       一般高质量的时钟信号都是要求有 50%占空比的,50%占空比的时钟信号对时序分析是非常有好处的。

2.1、实验任务

使用 Verilog 语言设计一个任意奇数分频电路,默认进行 3 分频,要求输出时钟的占空比是50%。

2.2、程序设计

       根据简介介绍的奇数分频电路设计思路,我们需要新增两个计数器,cnt_1 和 cnt_2。初始化 cnt_1 和 cnt_2 为 1,out_clk1 为 0,out_clk2 为 0。

       当 out_clk1 0 时,cnt_1 在 clk 时钟上升沿进行计数,当计数到 N/2+1 out_clk1 进行翻转,同时 cnt_1 赋值为初始值 1out_clk1 1 时,cnt_1 在 clk 时钟上升沿进行计数,当计数到 N/2 时 out_clk1 进行翻转,同时 cnt_1 赋值为初始值 1。

       当 out_clk2 0 时,cnt_2 在 clk 时钟下降沿进行计数,当计数到 N/2+1 out_clk2 进行翻转,同时 cnt_2 赋值为初始值 1out_clk2 1 时,cnt_2 在 clk 时钟下降沿进行计数,当计数到 N/2 时 out_clk2 进行翻转,同时 cnt_2 赋值为初始值 1。

       这样 N(奇数)分频就可以通过改变参量 N 的值和计数变量 cnt 的位宽实现任意奇数分频,由于默认为 3 分频,因此 N 初始值为 3。3 分频的 cnt_1 和 cnt_2 计数到 N/2+1 是计数到 2,小数舍弃掉, cnt_1 和 cnt_2 计数到 N/2 是计数到 1

我们由此可以写出如下代码。

2.2.1、奇数分频电路代码


//**********任意奇数分频*******START***************************
module divide_3 
( 
    input     clk,    // system clock 50Mhz on board
    input     rst_n,  // system rst, low active 
    output    out_clk // output signal
);

parameter N = 3 ;

reg [N/2 :0]   cnt_1;
reg [N/2 :0]   cnt_2;

reg out_clk1;
reg out_clk2;

//=====================================================================
// ------------------------- MAIN CODE -------------------------------
//=====================================================================
always @(posedge clk or negedge rst_n) begin //上升沿输出 out_clk1
    if(!rst_n) begin
        out_clk1 <= 0;
        cnt_1 <= 1; //这里计数器从 1 开始
    end
    else begin
        if(out_clk1 == 0) begin
            if(cnt_1 == N/2+1) begin
                out_clk1 <= ~out_clk1;
                cnt_1 <= 1;
            end
            else
                cnt_1 <= cnt_1+1;
        end
        else if(cnt_1 == N/2) begin
            out_clk1 <= ~out_clk1;
            cnt_1 <= 1;
        end
        else
            cnt_1 <= cnt_1+1;
    end
end

always @(negedge clk or negedge rst_n) begin //下降沿输出 out_clk2
    if(!rst_n) begin
        out_clk2 <= 0;
        cnt_2 <= 1; //这里计数器从 1 开始
    end
    else begin
        if(out_clk2 == 0) begin
            if(cnt_2 == N/2+1) begin
                out_clk2 <= ~out_clk2;
                cnt_2 <= 1;
            end
            else
                cnt_2 <= cnt_2+1;
            end
        else if(cnt_2 == N/2) begin
            out_clk2 <= ~out_clk2;
            cnt_2 <= 1;
        end
        else
        cnt_2 <= cnt_2+1;
    end
end

assign out_clk = out_clk1 | out_clk2;

endmodule

     使用 Vivado 综合后也可以看到电路结构,在 RTL ANALYSIS 的 Schematic 中来看下综合的电路结构。

       可以看出,cnt_1 和 cnt_2 是一个 3bit 的计数器,out_clk1 和 out_clk2 的电路结构基本是完全相同的,只是 cnt_1 和 cnt_2 计数器变化的时钟沿不一样,大家可以看出 cnt_2 的寄存器的 clk 前面有一个取反的标记,表示 cnt_2 是在时钟下降沿进行变化,然后 out_clk1 和 out_clk2 进行或操作,即得到一个 50%占空比的奇数 3 分频时钟。

2.2.2、编写仿真 TB 文件

      只需要对时钟以及复位信号进行激励,代码编写如下:

`timescale 1ns / 1ps
//


module tb_divider_3();  //仿真模块

//输入 reg 定义
reg         sys_clk;
reg         sys_rst_n;

//输出 wire 定义
wire        out_clk;

//设置初始化条件
initial begin
    sys_clk = 1'b0;     //初始化时钟为0
    sys_rst_n <= 1'b0;  //初始复位
    #200                //200个时间单位后
    sys_rst_n <= 1'b1;  //拉高复位
end

always #10 sys_clk = ~sys_clk;


//例化被测试模块
divider_3 u_divider_3
(
    .sys_clk           (sys_clk       ),
    .sys_rst_n         (sys_rst_n     ),
    
    .out_clk           (out_clk       )
);

endmodule

2.2.3、仿真验证

       测试程序在 Xilinx 的 Vivado 软件 或者其他仿真工具运行后的波形如下显示:

        可以看出,N 初始为 3,当复位撤销(复位信号低有效)之后,cnt_1 cnt_2 即开始计数, 当 out_clk1 0 时,在 cnt_1 计数器计到 2 的时候,out_clk1 进行取反操作,当 out_clk1 1 时,在 cnt_1 计数器计到 1 的时候,out_clk1 进行取反操作。

       当 out_clk2 0 时,在 cnt_2 计数器计到 2 的时候,out_clk2 进行取反操作,当 out_clk2 1 时,在 cnt_2 计数器计到 1 的时候,out_clk2 进行取反操作。

       我们可以看出 out_clk1 和 out_clk2 都不是 50%占空比的时钟,大概是 30%占空比。然后 out_clk1 和 out_clk2 进行或操作,即得到一个 50%占空比的奇数 3 分频时钟。

大家可以改变 N 参数看下,看下 N 参数不一样,最终分频的时钟是多少。

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

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

相关文章

关于前端项目安全问题的一些思考

1.路由守卫&#xff0c;本地路径与本地存储加密后的该用户所有能访问的的路径列表对比&#xff0c;是否有权限&#xff0c;这个要搞个一级页面-二级页面三级页面这种记录下来&#xff0c;后台管理员开启后赋予用户访问某些页面的权限&#xff0c;即能打开相关菜单的权限&#x…

【吴恩达老师《机器学习》】课后习题2之【逻辑回归(logistic_regression)】

逻辑回归-线性可分 用于解决输出标签y为0或1的二元分类问题 判断邮件是否属于垃圾邮件&#xff1f;银行卡交易是否属于诈骗&#xff1f;肿瘤是否为良性&#xff1f;等等。 案例:根据学生的两门学生成绩&#xff0c;建立一个逻辑回归模型&#xff0c;预测该学生是否会被大学录…

卷积码编码器的结构与表示

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 卷积码基础卷积码的…

Oracle数据库startup mount时的报错处理(ORA-01078LRM-00109)

安装监听 Disconnected [oraclerac1 ~]$ netcaOracle Net Services Configuration:[oraclerac1 ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Tue Jun 20 22:50:36 2023Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to an idle …

学习adaboost(三,第二次迭代,c#实现)

我们改进了第一次迭代&#xff1a;第二次迭代如下&#xff1a;因为三个弱分类器都是犯了3次错误&#xff0c;我们故意选了y>6.5,标签1&#xff0c;else&#xff0c;标签-1&#xff1b;第一个弱分类器已经选了&#xff0c;再选一次没意义&#xff0c;不会有任何进展&#xff…

搞钱!如何拿下奖金534万的全国人工智能大赛?

嗨咯&#xff0c;大家好&#xff0c;我是K同学啊&#xff01; 介于最近训练营中经常有同学问我&#xff0c;有哪些比较好的知识变现渠道&#xff0c;这几天整理出了一个个人认为还不错的关于深度学习方面的大赛&#xff08;就奖金比较多而已&#xff09;分享给大家。 攻略 | …

prisma 结合 mongodb 查询地理空间坐标,实现 “附近的人”功能

前言&#xff1a;我们创建一个集合&#xff0c;添加测试数据&#xff0c;并执行 mongodb 的地理空间查询&#xff0c;返回需要的数据。 1、通过schema.prisma, 创建 store 集合 2、通过 prisma/client &#xff0c;插入 几条测试数据 // 构造测试数据createList: async () >…

CMIP6数据处理方法与典型案例分析

气候变化关系到农业、生态系统、社会经济和人类生存与发展&#xff0c;是当今世界关注的重点问题之一。IPCC&#xff08;Intergovernmental Panel on Climate Change&#xff09;第6次评估报告指出&#xff0c;自 20 世纪 50 年代以来&#xff0c;从全球平均气温和海温升高、大…

Seata TCC 模式下解决幂等、悬挂、空回滚问题 | Spring Cloud56

一、前言 通过以下系列章节&#xff1a; docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

antd-vue - - - - - date-picker组件在非本地不好使?无法切换日期?

date-picker组件在非本地不好使&#xff1f;无法切换日期&#xff1f; 1.问题描述2.问题原因 & 解决办法 离离原上谱&#xff0c;真的是离了大谱 记录一个深深的踩坑记录&#xff01;&#xff01;&#xff01; 选择日期&#xff0c;肯定要选择ui组件的date-picker&#xf…

tensorflow基础知识

计算图的理解 ref: https://zhuanlan.zhihu.com/p/344846077 计算图模型由节点&#xff08;nodes&#xff09;和线&#xff08;edges&#xff09;组成&#xff0c;节点表示操作符/算子Operator&#xff0c;线表示计算间的依赖。实线表示有数据传递的依赖&#xff0c;传递的数…

【LeetCode】HOT 100(17)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

three.js中通过gsap动画库实现物体的动画

一、什么是gsap GSAP&#xff08;GreenSock Animation Platform&#xff09;是一个JavaScript动画库&#xff0c;由GreenSock公司开发&#xff0c;用于在Web应用程序中创建高性能动画。 使用GSAP可以通过一些简单的动画操作来实现复杂的动画效果&#xff0c;例如TweenLite、T…

临期商品app小程序软件开发

临期商品APP小程序是一种专门销售或推广临近保质期商品的应用程序&#xff0c;以下是可能有助于临期商品APP小程序软件开发的功能&#xff1a; 商品展示&#xff1a;允许用户查看和浏览不同种类的临期商品&#xff0c;包括产品图片、描述、价格等信息。 用户登录和注册…

笔记:WebRTC 网络技术理论与实战(二)

WebRTC技术笔记 笔记&#xff1a;WebRTC 网络技术理论与实战&#xff08;一&#xff09; 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.n…

【Flutter——复选框实例代码超详细讲解!】

Flutter——复选框实例代码超详细讲解&#xff01; 文章目录 Flutter——复选框实例代码超详细讲解&#xff01;代码实现效果代码实例代码结构总结 代码实现效果 代码实例 import package:flutter/material.dart; // 导入 Flutter 的核心库void main() {runApp(const MyApp())…

linux-2.6.22.6内核poll总结

1.为什么需要poll&#xff0c;其原因是当进行某些操作时&#xff0c;该操作会一直消耗cpu&#xff0c;浪费资源&#xff0c;所以引入poll可以让该进程在指定时间内如果没有结果产生&#xff08;可以是某个操作或者获取数据&#xff09;则进行休眠&#xff0c;这样就会释放cpu。…

【MySQL】数据库基础 ②

✍LIKE 子句 说明&#xff1a; 使用 SELECT 来查询数据&#xff0c; 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。 WHERE 子句中可以使用等号 来设定获取数据的条件&#xff0c;如 "字段(text_title) 值()"。 但是有时候我们需要获取 text_…

Android 神奇的 SpannableStringBuilder

文章目录 前言一、SpannableStringBuilder 是什么&#xff1f;二、使用步骤1.示例代码2.参数对应start&#xff1a;样式生效的开始位置&#xff0c;包括该位置end&#xff1a; 样式结束的位置&#xff0c;不包括该位置flags&#xff1a;取值有如下四个Spannable.SPAN_EXCLUSIVE…

wandb快速上手、使用心得(超好用的Tensorboard高替品)

这里写目录标题 1 wandb介绍2 快速上手3 使用心得3.1 一张图展示两条线3.2 想要科学上网和wandb一起使用&#xff08;离线使用&#xff09;3.3 未完待续 1 wandb介绍 wandb地址&#xff1a;wandb Wandb&#xff08;Weights & Biases&#xff09;是一个用于机器学习实验跟踪…