奇数分频器电路设计

news2025/1/15 18:20:44

目录

奇数分频器电路设计

1、奇数分频器电路简介

2、实验任务

3、程序设计

3.1、7分频电路代码

3.2、仿真验证

3.2.1、编写 TB 文件

3.2.2、仿真验证

4、用状态机实现7分频电路设计

4.1、代码如下:

4.2、使用状态机的好处


奇数分频器电路设计

       前面一节我们学习了偶数分频器的设计方法,本节我们来学习下奇数分频器的设计方法。实现偶数分频可通过一个简单计数器实现,而如果需要三分频,五分频,七分频等奇数分频,一个计数器是不够的。奇数分频器的设计相对偶数分频器设计要复杂一点,我们来看下奇数分频设计方法。

1、奇数分频器电路简介

       在《偶数分频器电路设计》章节提到实现分频一般有两个方法,一个方法是直接使用 PLL 进行分频,比如 FPGA 或者 ASIC 设计中,都可以直接使用 PLL 进行分频。还有一种实现方法就是直接使用逻辑实现,即使用代码实现分频设计。我们本节介绍的是使用代码进行设计奇数分频器。本节我们先看下奇数分频设计。

  • 奇数分频设计的一般方法:
  • 假设为 N分频,需从0计数到 N-1(一共N/2个基准时钟),一直循环。
  • 设计一个对基准时钟上升沿敏感的信号,每当计数到(N-1)/2-1时,时钟翻转;计数到计数器最大值时再反转。
  • 设计一个对基准时钟下降沿敏感的信号,每当计数到(N-1)/2-1时,时钟翻转;计数到计数器最大值时再反转。
  • 将 上升沿敏感的信号和 下降沿敏感的信号相与(&&)即N分频电路。

2、实验任务

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

3、程序设计

3.1、7分频电路代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/15 10:58:02
// Design Name: 
// Module Name: divider_7
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

//奇数分频设计的一般方法:
//假设为 N分频,需从0计数到 N-1(一共N/2个基准时钟),一直循环.
//设计一个对基准时钟上升沿敏感的信号,每当计数到(N-1)/2-1时,时钟翻转;计数到计数器最大值时再反转.
//设计一个对基准时钟下降沿敏感的信号,每当计数到(N-1)/2-1时,时钟翻转;计数到计数器最大值时再反转.
//将 上升沿敏感的信号和 下降沿敏感的信号相与(&&)即N分频电路.


module divider_7(
    input          sys_clk,      //50MHz系统时钟(一个周期是20ns:1/50MHz=0.02us=20ns)
    input          sys_rst_n,    //复位信号,低电平有效
    
    output         clk_7         //输出7分频信号
    );
    
parameter  N = 7;

//reg  define
reg [2:0]    cnt;       //最大值为6,所以需要3位位宽
reg          cnt_pos;   //上升沿敏感信号
reg          cnt_neg;   //下降沿敏感信号

assign clk_7 = cnt_pos && cnt_neg;   //组合逻辑与

//计数模块,从0计数到6共计7个时钟周期
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        cnt <= 3'd0;         //复位清零
    else if(cnt == 3'd6)     //计满7个时钟周期,从0开始计数,所以需要-1
        cnt <= 3'd0;         //计满则清零
    else
        cnt <= cnt + 3'd1;    //没计满就一直计数
end

//cnt_pos:上升沿触发
//低电平维持三个基准时钟周期,高电平维持4个时钟周期
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        cnt_pos <= 1'b0;    //复位清零
    else if(cnt==3'd2)      //计满三个时钟周期,
        cnt_pos <= 1'b1;    //前三个时钟周期输出为0,满足条件则输出1
    else if(cnt==3'd6)      //计满7个时钟周期
        cnt_pos <= 1'b0;    //后四个时钟周期输出为1,满足条件则输出0
    else
        cnt_pos <= cnt_pos; //不满足条件就保持原来状态
end

//cnt_neg:下降沿触发
//低电平维持三个基准时钟周期,高电平维持四个时钟周期
always @(negedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        cnt_neg <= 1'b0;     //复位清零
    else if(cnt==3'd2)       //计满三个时钟周期
        cnt_neg <= 1'b1;     //前三个时钟周期输出为0,满足条件则输出为1.
    else if(cnt==3'd6)       //计满7个时钟周期
        cnt_neg <= 1'b0;     //后四个时钟周期输出为1,满足条件则输出0
    else
        cnt_neg <= cnt_neg;   //不满足条件就保持原来状态
end

endmodule

接下来我们使用 Vivado 的 RTL  ANALYSIS,来看一下我们编写代码的 RTL 视图。

3.2、仿真验证

3.2.1、编写 TB 文件

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

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/15 13:49:48
// Design Name: 
// Module Name: tb_divider_7
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_divider_7();  //仿真模块

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

//输出 wire 定义
wire        clk_7;

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

//always代表重复进行,#10代表每10个时间单位
//每10个时间单位反转时钟,即时钟周期为20个时间单位(20ns)
always #10 sys_clk = ~sys_clk;

//例化被测试模块
divider_7 divider_7_inst
(
    .sys_clk           (sys_clk       ),
    .sys_rst_n         (sys_rst_n     ),
    
    .clk_7             (clk_7         )
);

endmodule

3.2.2、仿真验证

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

       从波形图可以看到:10ns后停止复位,计数器cnt一直在从0计数到6;每当cnt计数到3的上升沿(L2),cnt_pos信号输出翻转,每当cnt计数清零(L4),cnt_pos信号输出翻转;每当cnt计数到3的下降沿(L1),cnt_neg信号输出翻转,每当cnt计数清零(L3),cnt_neg信号输出翻转;从L2到L3为7分频信号的半个时钟周期(高电平),从L2到L3为8分频信号的半个时钟周期(低电平);从L2到L6为7分频信号的1个完整的时钟周期,同时也是7个基准时钟周期。

4、用状态机实现7分频电路设计

三段式状态机的基本格式是:

  • 第一个 always 语句实现同步状态跳转;
  • 第二个 always 语句采用组合逻辑判断状态转移条件; 
  • 第三个 always 语句描述状态输出(可以用组合电路输出,也可以时序电路输出)。

在开始编写状态机代码之前,一般先画出状态跳转图,这样在编写代码时思路会比较清晰。

4.1、代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/06/20 16:16:39
// Design Name: 
// Module Name: divider7_fsm
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


//以一个 7 分频为例
module divider7_fsm(
     //系统时钟与复位
     input              sys_clk,
     input              sys_rst_n,
     
     //输出时钟
     output  reg       clk_divide_7
    );
//在编写状态机代码时首先要定义状态变量(代码中的参数 S0~S6)与状态寄存器(curr_st、next_st)
//parameter define
parameter S0 = 7'b0000001;    //独热码定义方式
parameter S1 = 7'b0000010;
parameter S2 = 7'b0000100;
parameter S3 = 7'b0001000;
parameter S4 = 7'b0010000;
parameter S5 = 7'b0100000;
parameter S6 = 7'b1000000;

//reg define
reg  [6:0]     curr_st;     //当前状态
reg  [6:0]     next_st;     //下一个状态

//*********************************************************
//**           main  code
//**********************************************************

//状态机的第一段采用同步时序描述状态转移
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
         curr_st <= S0;
    else
         curr_st <= next_st;
end

//状态机的第二段采用逻辑组合判断状态转移条件
always @(*) begin
    case (curr_st)
        S0:next_st = S1;
        S1:next_st = S2;
        S2:next_st = S3;
        S3:next_st = S4;
        S4:next_st = S5;
        S5:next_st = S6;
        S6:next_st = S0;
        default:next_st = S0;
    endcase
end

//状态机的第三段描述状态输出(这里采用时序电路输出)
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        clk_divide_7 <= 1'b0;
    else if ((curr_st == S0) | (curr_st == S1) | (curr_st == S2) | (curr_st == S3))
        clk_divide_7 <= 1'b0;
    else if ((curr_st == S4) | (curr_st == S5) | (curr_st == S6))
        clk_divide_7 <= 1'b1;
    else
        ;
end
  
endmodule

//采用这种描述方法虽然代码结构复杂了一些,
//但是这样做的好处是可以有效地滤去组合逻辑输出的毛刺,
//同时也可以更好的进行时序计算与约束,另外对于总线形式的输出信号来说,
//容易使总线数据对齐,减小总线数据间的偏移,从而降低接收端数据采样出错的频率。

4.2、使用状态机的好处

       采用这种描述方法虽然代码结构复杂了一些,但是这样做的好处是可以有效地滤去组合逻辑输出的毛刺,同时也可以更好的进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对齐,减小总线数据间的偏移,从而降低接收端数据采样出错的频率。

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

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

相关文章

前端JS限制绕过测试-业务安全测试实操(17)

前端JS限制绕过测试,请求重放测试 前端JS限制绕过测试 测试原理和方法 很多商品在限制用户购买数量时,服务器仅在页面通过JS脚本限制,未在服务器端校验用户提交的数量,通过抓取客户端发送的请求包修改JS端生成处理的交易数据,如将请求中的商品数量改为大于最大数限制的值…

Vue中使用分布式事务管理解决方案

文章目录 分布式事务管理是什么优点&#xff1a;缺点&#xff1a;弥补缺点的方法有&#xff1a; 解决方案 分布式事务管理是什么 分布式事务管理是指在分布式系统中对跨多个数据库或服务的操作进行协调和保证一致性的机制。在分布式环境下&#xff0c;由于涉及到多个独立的资源…

半年面试12家大厂,我总结出了这份2023版互联网大厂(Java岗)面试真题汇总

Java面试 现在互联网大环境不好&#xff0c;互联网公司纷纷裁员并缩减HC&#xff0c;更多程序员去竞争更少的就业岗位&#xff0c;整的IT行业越来越卷。身为Java程序员的我们就更不用说了&#xff0c;上班8小时需要做好本职工作&#xff0c;下班后还要不断提升技能、技术栈&am…

docker 命令解释 - nginx镜像制作

目录 Dockerfile 部分命令解释 1、ENTRYPOINT 而ENTRYPOINT 语言 CMD的区别 1、docker run 启动容器的时候&#xff0c;可以传递参数进入给ENTRYPOINT里面的命令&#xff08;-e&#xff09; 2、当2者都存在的时候&#xff0c;CMD里的内容会成为 ENTRYPOINT 里的参数&#x…

Pytest中断言的重要性

目录 前言 pytest断言 增加断言详细信息 异常断言 .type .value .traceback pytest常用断言 前言 在pytest中&#xff0c;断言是非常重要的一部分。断言可以帮助我们验证代码的正确性&#xff0c;检查函数返回的值是否符合要求&#xff0c;以及判断程序中预期行为是否发生。如…

MySQL数据库(二)

前言 本文是关于MySQL数据库的第二弹。 临时表不受原表数据类型的约束&#xff01;&#xff01; SQL语法不区分大小写。 一、列的使用 &#xff08;一&#xff09;列的增加 1、全列插入 insert into 表名 values (数据,数据); 也可以同时插入多条数据: insert into 表名 va…

小程序跳转多次返回首页

小程序跳转多次返回首页 小程序跳转多个页面后直接返回首页 问题 例&#xff1a; 跳转&#xff1a;A(首页) - > B -> C -> D 返回&#xff1a;D -> A(首页) 1、页面中按钮跳转 <!--D页面 WXML--> <view class"-btn"><button bindtap&q…

6月第3周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩)发布!

飞瓜轻数发布2023年6月12日-6月18日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

浅谈智能配电房的系统设计和技术方案

张心志acrelzxz 安科瑞电气股份有限公司 上海嘉定 201801 摘 要&#xff1a;为了进一步提升配网运维工作质量和效率&#xff0c;支撑配网技术发展向数字化、精益化、智能化转型。在大量的配电房现状问题分析以及新监测技术调研的基础上&#xff0c;文章提出了智能配电房…

WebGL/Threejs瀑布水流粒子效果

webgl瀑布效果 初始化场景 function init () {scene new THREE.Scene();camera new THREE.PerspectiveCamera (45, scr.w / scr.h, 0.1, 10000);renderer new THREE.WebGLRenderer ({ antialias: true });renderer.gammaInput true;renderer.gammaOutput true;renderer.…

盘点中国顶级黑客Top10,最后一位你猜是谁

第一名&#xff1a;袁仁广 别名&#xff1a;大兔子(datuzi)&#xff0c;人称袁哥。提起袁任广&#xff0c;知道的人或许并不多。但如果提起袁哥或者大兔子&#xff0c;在国内安全业界称得上尽人皆知。在国内&#xff0c;他的windows系统方面的造诣可谓首屈一指&#xff0c;早在…

centos系统socket5安装与使用

一、socket5安装 1、安装依赖 yum -y install gcc openldap-devel pam-devel openssl-devel 2、安装socket5 wget http://nchc.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gztar -xzvf ss5-3.8.9-8.tar.gzcd ss5-3.8.9./configuremakemake install 二、…

Android Jetpack Compose — Slider滑动条

在Android Jetpack Compose中&#xff0c;Slider(滑动条&#xff09;是一个常用的用户界面控件&#xff0c;它允许通过滑动条来选择一个范围或数值。Slider控件非常适用于调整音量、亮度、进度等需要连续调整的场景。 一、Slider的属性 Slider是Android Jetpack Compose中的一个…

html实现多种风格步骤条

文章目录 1.设计来源1.1 线性风步骤条1.2 进度风步骤条1.3 花式风步骤条1.4 格子风步骤条 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/131308246 html实现多种风格步骤…

Java版本+企业电子招投标系统源代码

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…

浅析景区慢直播的需求与基于视频技术的解决方案

一、行业背景 从春节到“五一”假期&#xff0c;旅游市场高开稳走&#xff0c;复苏持续提速。“慢直播”是一种特别的直播形式&#xff0c;没有主持人&#xff0c;也没有绚丽的镜头切换以及精美的后期制作&#xff0c;只用固定机位拍摄来更加真实地展现事件现场&#xff0c;以…

文件上传413状态码报错解决方案

目录 前言 解决办法 前言 我的前端Vue项目部署在Nginx上&#xff0c;当我上传一个3M多的图片时&#xff0c;发生413错误&#xff0c;刚开始我以为是数据库字段不对&#xff0c;但我看后确实是大数据类型&#xff08;text、blob&#xff09;&#xff0c;这种数据类型应对一张…

《后端存储实战课》课程学习笔记(三)

流量大、数据多的商品详情页系统该如何设计&#xff1f; 电商的商品系统主要功能就是增删改查商品信息&#xff0c;没有很复杂的业务逻辑&#xff0c;支撑的主要页面就是商品详情页。设计这个系统的存储&#xff0c;你仍然需要着重考虑两个方面的问题。 第一&#xff0c;要考虑…

First De-Trend then Attentd: Rethinking Attention for Time-Series Forecasting

论文题目&#xff1a;重新思考注意力在时间序列预测任务中应用 作者单位&#xff1a;亚马逊 访问学者、亚马逊云科技 摘要&#xff1a; 基于Transformer的一系列方法在长时间序列预测任务中很有效&#xff0c;除了在时域部分学习注意力外&#xff0c;最近的工作也在频域中探…

心中的TOP4编程语言❤

编程语言心动值排名&#xff1a; java&#xff1a;❤❤❤❤❤ python&#xff1a;❤❤❤❤ C&#xff1a;❤❤❤ C&#xff1a;❤❤❤❤ 一&#xff1a;关于编程语言优劣的评选标准 个人认为一门语言的优劣势标准评判主要是这门语言解决了哪一类问题&#xff0c;为人类创造了多…