第一次编程测试(分频器)

news2024/10/11 2:18:20

一,分频器

  1. 定义
    分频器(Divider)是一种电子电路或设备,用于将输入信号的频率降低到较低的频率。它常用于数字系统、通信系统和计时应用中。
  2. 原理
    整数分频器使用计数器来实现频率的降低。计数器根据输入信号的边沿触发进行计数,当计数值达到预设的分频比时,输出一个脉冲,并将计数器清零重新开始计数。例如,一个2分频器会在每两个输入信号边沿之间输出一个脉冲,将输入信号的频率降低为一半。
  3. verilog代码实现
    在这里所了解的分频器主要是整数分频器,其主要的实现分为奇数分频和偶数分频:
    1.偶数分频:即在每个时钟上升沿使计数器+1,当计数器小于N/2-1时使得输出时钟为低,当大于等于N/2-1小于N-1时使输出时钟为高
    2.奇数分频:奇数分频的方法有许多种这种展示一下我所理解的跟同学所理解的方法
    (1)如果想要计数分频但是寄存器不可以计数分数所以我们可以使用两个中间输出时钟
    一个对上升沿敏感。一个对下降沿敏感,分别计数,当分得的时钟高电平比低电平多一个周期时将两个中间时钟相与(即低电平向高电平借用0.5周期),当分得的时钟低电平比高电平多一个周期时将两个中间时钟相或(即高电平向低电平借用0.5周期)
//第一种方法
module pre_N #(parameter N = 8) (
    input       wire        clk,    //系统时钟
    input       wire        rst_n,  //系统复位
    output      wire        clk_out //调频后信号
);

reg     clk_out_r;//调频后的时钟
wire    add_cnt;//计数开始使能
wire    end_cnt;//计数结束使能
wire    add_cnt1;//判断奇偶
reg     [5:0] cnt;//计数寄存器
reg     clk_out_a;
reg     clk_out_b;
reg     [5:0] cnt_a;
reg     [5:0] cnt_b;
wire     clk_out_ab;

assign add_cnt1 = (N%2==0)?1:0;
//计数模块
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        cnt <= 6'b0;
    end
    else if (add_cnt) begin
        if (end_cnt) begin
            cnt <= 6'b0;
        end
        else begin
            cnt <= cnt + 1'b1;
        end
    end
    else begin
        cnt <= cnt;
    end
end

assign add_cnt = 1;
assign end_cnt = add_cnt&&(cnt == N/2-1);

//时钟分频模块
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        clk_out_r <= 1'b0;
    end
    else if (end_cnt) begin
        clk_out_r <= ~clk_out_r;
    end
    else begin
        clk_out_r <= clk_out_r;
    end
end

//上升沿分频模块
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        clk_out_a <= 1'b0;
        cnt_a <= 1'b0;
    end
    else begin
        if (cnt_a <N-1) begin
            if (cnt_a < (N-1)/2) begin
                clk_out_a <= 1'b0;
            end
            else if (cnt_a >=(N-1)/2) begin
                clk_out_a <= 1'b1;
            end
            else begin
                clk_out_a <= clk_out_a;
            end
            cnt_a <= cnt_a + 1;
        end
        else begin
            clk_out_a <= 1'b0;
            cnt_a <= 1'b0;
        end
    end
end

always @(negedge clk or negedge rst_n) begin
    if (!rst_n) begin
        clk_out_b <= 1'b0;
        cnt_b <= 1'b0;
    end
    else begin
        if (cnt_b <N-1) begin
            if (cnt_b < (N-1)/2) begin
                clk_out_b <= 1'b0;
            end
            else if (cnt_b >=(N-1)/2) begin
                clk_out_b <= 1'b1;
            end
            else begin
                clk_out_b <= clk_out_b;
            end
            cnt_b <= cnt_b + 1;
        end
        else begin
            clk_out_b <= 1'b0;
            cnt_b <= 1'b0;
        end
    end
end
assign clk_out_ab = clk_out_a|clk_out_b;
assign clk_out = (N%2==0)?clk_out_r:clk_out_ab;
endmodule

(2)使用组合逻辑对电频敏感,每次电频转换都使计数器+1,当计数器加到N-1时使输出电频翻转

module pre_N_2 #(parameter N = 7)(
    input   wire        clk     ,
    input   wire        rst_n   ,
    output  wire        clk_out        
);

reg			[5:0]	cnt	   	;
wire				add_cnt	;
wire				end_cnt	;
reg                clk_out_r;

always @(clk)begin //对于上升沿下降沿都进行计数
   if(!rst_n)begin
        cnt <= 'd0;
    end 
    else if(add_cnt)begin 
        if(end_cnt)begin 
            cnt <= 'd0;
        end
        else begin 
            cnt <= cnt + 1'b1;
        end 
    end
end 

assign add_cnt = 1;
assign end_cnt = add_cnt && cnt == N-1;

always @(clk)begin 
    if(!rst_n)begin
        clk_out_r <= 'd0;
    end 
    else if(end_cnt)begin 
        clk_out_r <= ~clk_out_r;//计满翻转
    end 
    else begin 
        clk_out_r <= clk_out_r;//未计满保持
    end 
end

assign clk_out = clk_out_r;
endmodule
  1. tb文件
`timescale 1ns/1ns

module pre_N_tb ();

reg clk;
reg rst_n;
wire    clk_out;

parameter CYCLE = 20;
parameter N     = 5;

always #(CYCLE/2) clk = ~clk;

initial begin
    clk = 1'b0;
    rst_n = 1'b0;
    #(20)
    rst_n = 1'b1;
    #(1000)
    $stop;
end


pre_N #(.N(N)) pre_N_inst(
        .clk        (clk),
        .rst_n      (rst_n),
        .clk_out    (clk_out)
);
endmodule
`timescale 1ns/1ns

module pre_N_2_tb ();

reg clk;
reg rst_n;
wire    clk_out;

parameter CYCLE = 20;
parameter N     = 5;

always #(CYCLE/2) clk = ~clk;

initial begin
    clk = 1'b0;
    rst_n = 1'b0;
    #(20)
    rst_n = 1'b1;
    #(1000)
    $stop;
end


pre_N_2 #(.N(N)) pre_N_2_inst(
        .clk        (clk),
        .rst_n      (rst_n),
        .clk_out    (clk_out)
);
endmodule
  1. 仿真波形
    在此只展示一个
    在这里插入图片描述

二.总结

对于分频器主要需要注意的是整数分频有奇数分频跟偶数分频,分频器主要是对时序逻辑电路中时钟理解的考察,其中的难点主要是奇数分频,只要掌握其中的方法还是比较好做,只要掌握时序逻辑电路的时钟信号的理解分频器还是很简单得。

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

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

相关文章

STM32MP157驱动开发——按键驱动(中断)

文章目录 编写使用中断的按键驱动程序编程思路设备树相关驱动代码相关 代码修改设备树文件gpio_key_drv.cMakefile编译测试 编写使用中断的按键驱动程序 对于使用中断的按键驱动&#xff0c;内核自带的驱动程序 drivers/input/keyboard/gpio_keys.c 就可以&#xff0c;需要做的…

❛‿˂̵✧ THU数据结构(上)(2023spring) 完成啦(⑅˃◡˂⑅)

实际上来讲&#xff0c;是课程截止到今天晚上( ◔︎ ‸◔︎) 总结一下&#xff0c;放假十来天&#xff0c;边敲边听。后期有些地方应该再复习复习。 接下来的关于数据结构的目标 〇 把&#xff08;上&#xff09;中没敲完的结构敲完 〇 ZJU的配套题目写完 〇 学习&#xff…

linux系统GHOST备份方案

linux系统GHOST备份方案 Windows系统备份可以用ghost工具软件完成&#xff0c;Linux系统不能完全依赖于ghost工具&#xff0c;一则是ghost本身是有版权的软件&#xff0c;二则ghost只支持ext2、ext3文件系统的Linux分区&#xff0c;不支持reiserfs、xfs等比较高级的文件系统&a…

9.python设计模式【外观模式】

内容&#xff1a;为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式定义了一个高层接口&#xff0c;这个接口使得这一个子系统更加容易使用。 角色&#xff1a; 外观&#xff08;facade&#xff09;子类系统&#xff08;subsystem classes&#xff09; UML图 举…

拉密

拉密&#xff0c;又称以色列麻将。 游戏人数为2-4人。 和扑克牌一样&#xff0c;一套是52张&#xff0c;4个花色&#xff0c;每个花色1到13。 拉密数字牌由106张塑料牌组成&#xff0c;包含2套牌和2张万能牌。 一张是可以指定成暖色任意牌&#xff0c;一张可以指定成冷色任意…

草稿#systemverilog# 说说《队列》 那些事儿

最近不断使用到systemverilog 语言编程中的队列语法。今天抽时间,尽肯能全的整理一下队列的相关用法,一是加固基础打牢,而是在代码编写过程中,提高代码水平。 队列是一种复合数据结构,可以用来存储多个数据的容器,但同时又拥有自己的优势特性。正如绿皮书所言,队列的引…

1-2 AUTOSAR分层架构

目录 一、简介 二、基础软件层 BSW 2.1 微控制器抽象层 2.2 ECU抽象层 2.3 复杂的驱动程序 2.4 服务层 三、运行时环境 RTE 四、应用软件层 SWC 一、简介 AUTOSAR架构在最高的抽象级别上区分了三个软件层&#xff1a; 应用程序层&#xff08;APPL&#xff09;运行时环…

macOS Monterey 12.6.8 (21G725) Boot ISO 原版可引导镜像

macOS Monterey 12.6.8 (21G725) Boot ISO 原版可引导镜像 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Lin…

我的个人项目

项目介绍&#xff1a; 项目主要是使用vue3开发&#xff0c;利用前端技术&#xff0c;实现一些功能和游戏&#xff0c;并不是真正意义上的项目 功能概况介绍&#xff1a; 1. 记账&#xff08;app端页面记录日常消费和收入&#xff09; 2. 常用网站的管理 3. 文本内容检索 4. …

iptables安全技术和防火墙

防火墙&#xff1a;隔离功能 位置&#xff1a;部署在网络边缘或主机边缘&#xff0c;在工作中&#xff0c;防火墙的主要作用是决定哪些数据可以被外网访问以及哪些数据可以进入内网访问&#xff0c;主要在网络层工作 其他类型的安全技术&#xff1a;1、入侵检测系统 2、入侵…

vue2生命周期图

生命周期全过程如下&#x1f447;详解 一:生命周期之创建阶段 1.创建一个Vue实例【new Vue()】 2.初始化Vue实例,第一次初始化,初始化Vue当中的事件和生命周期方法【Init Events Lifecycle】 ☆☆☆调用生命周期方法当中的beforCreate,调用这个方法的时候有一个特点,就是在调…

自动化运维工具--saltstack部署及使用

目录 一、saltstack简介 1、介绍 2、Salt的核心功能 3、saltstack通信机制 二、saltstack部署 1、部署环境 2、配置yum源 3、安装master与minion 4、连接认证master和minion 三、salt运行 1、执行格式 2、实操演示 一、saltstack简介 1、介绍 saltstack是一个配置管…

[护网杯 2018]easy_tornado1

进入环境后有三个路径链接 访问/flag提示会说flag在/fllllllllllag里 值得注意的是访问后网页url发生的变化&#xff0c;这里居然有两个参数 替换掉filename的值后页面url再次发生变化&#xff0c;网页只有一个msg传参的数据 访问welcome.txt&#xff0c;只是回显了一个render…

一个灵活、现代的Android应用架构

一个灵活、现代的Android应用架构 学习Android架构的原则&#xff1a;学习原则&#xff0c;不要盲目遵循规则。 本文旨在通过示例演示实际应用&#xff1a;通过示范Android架构来进行教学。最重要的是&#xff0c;这意味着展示出如何做出各种架构决策。在某些情况下&#xff0…

qt登录框

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口的设置this->setFixedSize(500, 400); //设置固定大小this->setWindowOpacity(0.95); //设置透明度this->setWindowTitle("鹏哥快聊"); // this->setWin…

【node-1】node validation exception. bootstrap checks failed

记录ElasticSearch 内存分配不足报错 背景做出的改变说在最后&#xff1a;最后访问es&#xff1a; 背景 从报错信息中看到&#xff0c;文件&#xff0c;虚拟内存的最大值太低&#xff0c;我们需要调整设置虚拟内存大小&#xff0c;以满足ElasticSearch 运行需求。 做出的改变 …

WPF icon的设置

想给控件设置个圆形图片&#xff0c;代码如下&#xff1a; ​<Setter Property"Icon"><Setter.Value><Image Source"/WpfApp1;component/Resource/1.ico" Width"16" Height"16"/></Setter.Value></Setter&…

面向对象编程:从创建类到封装与构造方法的探索

1. 代码如何创建类&#xff1f; 在面向对象编程中&#xff0c;类是对一类事物的抽象&#xff0c;包含了静态的属性&#xff08;成员变量&#xff09;和动态的行为&#xff08;成员方法&#xff09;。在Java中&#xff0c;创建类的格式如下&#xff1a; 修饰词 class 类名 {//…

react实现页面动态表单设计器(自定义推拽表单)

react实现页面动态表单设计器&#xff08;自定义推拽表单&#xff09; 实现效果安装插件使用组件介绍基本设置&#xff0c;可设置控件标签&#xff0c;是否必填&#xff0c;校验规则校验规则有如下几种多选&#xff0c;下拉&#xff0c;单选可动态设置每个选择的label以及值 实…

ROS Neotic(Ubuntu 20.04)如何正确安装OpenCV

自定义OpenCV版本 一、ROS的安装二、OpenCV编译安装三、cv_bridge编译安装四、温馨提示 一、ROS的安装 鱼香ROS提供了一个全面且方便的脚本&#xff0c;可以直接运行来安装系统对应版本的ROS&#xff0c;同时也可以使用该命令来安装许多有趣的东西 wget http://fishros.com/i…