时钟分频器

文章目录

  • 一、8分频
  • 二、n倍时钟分频器

一、8分频

8倍时钟分频器是一种电路或设备,用于将输入时钟信号的频率分成原来的1/8。它可以在数字电子系统中用于将高频时钟信号降低到较低的频率,以满足特定的系统需求。
在这个电路中,CLK是输入的时钟信号,CLK_OUT是输出的时钟信号。通过适当的电路设计,8倍时钟分频器将输入时钟信号的频率除以8,得到的输出时钟信号频率为输入时钟频率的1/8。
具体实现时,可以使用计数器、分频器、频率除法等技术来设计8倍时钟分频器。常见的方法是通过基于触发器(如D触发器)的计数器电路实现分频功能。每经过8个输入时钟脉冲,计数器输出一个脉冲,从而生成1/8倍的输出时钟信号。
8分频时钟设计:时钟周期为160ns,及计数4次对信号进行反转。
代码实现:

/*
 * @Description: 8分频
 * @Author: Fu Yu
 * @Date: 2023-07-21 15:00:40
 * @LastEditTime: 2023-07-21 15:23:59
 * @LastEditors: Fu Yu
 */


module time_clk (
    input       wire        clk         ,
    input       wire        rst_n       ,
    output      wire        clk_4   
);

parameter MAX_NUM = 2'd3;//计数最大值4

reg [1:0] cnt;
reg clk_4_r;

wire add_cnt;//开始计数信号
wire end_cnt;//结束计数信号

//计数器
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin//初始化
        cnt <= 2'd0;
    end
    else if(add_cnt) begin
        if(end_cnt) begin//计满4个周期,计数器清零
            cnt <= 2'd0;
        end
        else begin
            cnt <= cnt + 1'd1;
        end
    end
    else begin
        cnt <= cnt;
    end
end

assign add_cnt = 1'b1;
assign end_cnt = add_cnt && cnt == MAX_NUM;

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin//初始化
        clk_4_r <= 1'b1;
    end
    else if(end_cnt) begin//计满四次输出信号进行一次反转
        clk_4_r <= ~clk_4_r;
    end
    else begin
        clk_4_r <= clk_4_r;
    end
end

assign clk_4 = clk_4_r;


endmodule //time_clk

测试文件:

/*
 * @Description: 8分频仿真验证
 * @Author: Fu Yu
 * @Date: 2023-07-21 15:38:35
 * @LastEditTime: 2023-07-21 15:49:01
 * @LastEditors: Fu Yu
 */

`timescale 1ns/1ns
module time_clk_tb();
    //激励信号定义
    reg tb_clk;
    reg tb_rst_n;
 
    //输出信号定义
    wire tb_clk_4;

    parameter CYCLE = 20;

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

    initial begin
        tb_clk = 0;
        tb_rst_n = 0;//开始复位
        #(CYCLE/2);
        tb_rst_n = 1;//结束复位
        #(CYCLE*16);
        $stop;
    end

    time_clk u_time_clk(
    .        clk      (tb_clk)   ,
    .        rst_n    (tb_rst_n)   ,
    .        clk_4     (tb_clk_4)
);

 endmodule

在这里插入图片描述

二、n倍时钟分频器

代码实现:

/*
 * @Description: 设计一个可配置的时钟分频器模块,能够将输入时钟信号按照给定的任意分频比例进行分频,并输出分频后的时钟信号。
 * @Author: Fu Yu
 * @Date: 2023-07-22 10:11:22
 * @LastEditTime: 2023-07-22 10:23:12
 * @LastEditors: Fu Yu
 */

module CLOCK_N #(parameter N = 8)(
    input       wire        clk         ,//时钟输入
    input       wire        rst_n       ,//复位信号

    output      wire        clk_n        //分频后的信号输出
);

reg  [N:0]  cnt;//用于记数
reg  clk_n_r;//存储当前分频信号的值

wire add_cnt;//开始计数信号
wire end_cnt;//结束计数信号

//计数器
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt <= 26'd0;
    end
    else if(add_cnt)begin
        if(end_cnt)begin
            cnt <= 26'd0;
        end
        else begin
            cnt <= cnt + 1'd1;
        end
    end
    else begin
        cnt <= cnt;
    end
end

assign add_cnt = 1'b1;
assign end_cnt = add_cnt && (cnt == (N-1)/2);//记数到半个时钟周期

//时钟分频
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        clk_n_r <= 1'b1;
    end
    else if(end_cnt) begin//每到半个时钟周期,将分频信号进行反转
        clk_n_r <= ~clk_n_r;
    end
    else begin
        clk_n_r <= clk_n_r;
    end
end

assign clk_n = clk_n_r;

endmodule

测试文件:

/*
 * @Description: n倍分频器仿真测试文件
 * @Author: Fu Yu
 * @Date: 2023-07-22 10:24:59
 * @LastEditTime: 2023-07-22 10:43:28
 * @LastEditors: Fu Yu
 */

`timescale 1ns/1ns
module clock_n_tb();
    
    parameter CYCLE = 20;//定义时钟周期
    parameter N = 10;//任意分频倍数

    //定义激励信号
    reg tb_clk;
    reg tb_rst_n;

    //定义输出信号
    wire tb_clk_n;

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

    initial begin
        tb_clk = 0;
        tb_rst_n = 0;//开始复位
        #(CYCLE/2);
        tb_rst_n = 1;//结束复位
        #(CYCLE*20);
        $stop;
    end

    //实例化
    CLOCK_N #(.N(N)) u_CLOCK_N(
        .   clk     (tb_clk)    ,
        .   rst_n   (tb_rst_n)  ,

        .   clk_n   (tb_clk_n)

    );



endmodule

在这里插入图片描述
改进:
博主发现以上方法对偶数倍分频效果很好,但对奇数倍分频效果很差,所以博主对n倍分频器做了以下改动:

/*
 * @Description: 设计一个可配置的时钟分频器模块,能够将输入时钟信号按照给定的任意分频比例进行分频,
                并输出分频后的时钟信号。奇偶倍数均可实现
 * @Author: Fu Yu
 * @Date: 2023-07-24 16:49:26
 * @LastEditTime: 2023-07-24 19:51:02
 * @LastEditors: Fu Yu
 */

 module divede_clk #(parameter N = 8)(
    input       wire            clk         ,//系统时钟
    input       wire            rst_n       ,//复位信号

    output      wire            clk_out      //分频后的信号 
 );

 reg [N:0] cnt_pos;//检测时钟上升沿计数
 reg [N:0] cnt_neg;//检测时钟下降沿计数

 reg clk1;
 reg clk2;

 wire add_cnt_pos;//开始计数标志
 wire end_cnt_pos;//结束计数标志
 wire add_cnt_neg;//开始计数标志
 wire end_cnt_neg;//结束计数标志

 //时钟上升沿计数器
 always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_pos <= 'd0;
    end
    else if(add_cnt_pos) begin
        if(end_cnt_pos) begin
            cnt_pos <= 'd0;
        end
        else begin
            cnt_pos <= cnt_pos + 1'd1;
        end
    end
    else begin
        cnt_pos <= cnt_pos;
    end
 end

assign add_cnt_pos = 1'b1;
assign end_cnt_pos = add_cnt_pos && cnt_pos == (N - 1);

//对clk1进行赋值
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        clk1 <= 1'b0;
    end
    else if(cnt_pos <= (N-1)/2) begin
        clk1 <= 1'b1;
    end
    else begin
        clk1 <= 1'b0;
    end
end

//时钟下降沿计数器
 always @(negedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_neg <= 'd0;
    end
    else if(add_cnt_neg) begin
        if(end_cnt_neg) begin
            cnt_neg <= 'd0;
        end
        else begin
            cnt_neg <= cnt_neg + 1'd1;
        end
    end
    else begin
        cnt_neg <= cnt_neg;
    end
 end

assign add_cnt_neg = 1'b1;
assign end_cnt_neg = add_cnt_neg && cnt_neg == (N - 1);

//对clk1进行赋值
always @(negedge clk or negedge rst_n) begin
    if(!rst_n) begin
        clk2 <= 1'b0;
    end
    else if(cnt_neg <= N/2) begin
        clk2 <= 1'b1;
    end
    else begin
        clk2 <= 1'b0;
    end
end

assign clk_out = (N == 1) ? clk : N[0] ? (clk1&clk2) : clk1;
 
 endmodule //divede_clk

此次改动后奇数倍和偶数倍的分频器都能实现,用两个信号一个对于时钟上升沿检测,一个对于时钟下降沿检测。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【wxWidgets】剪贴板和拖放操作

【wxWidgets】剪贴板和拖放操作 使用剪贴板传输数据时应用程序间的一种交互方式 剪贴板和拖放操作在wxWidgets中共享了一些类来实现数据的传输 数据对象 wxDataObject类时剪贴板操作和拖放操作的核心&#xff0c;该类实例代表了拖放操作中鼠标拖拽的事物和剪贴板中拷贝和粘贴…

10分钟搭建链路追踪平台

随着项目越来越多&#xff0c;相互调用越来越复杂&#xff0c;搭建一个可视化的链路追踪平台显得尤为重要&#xff0c;今天给大家介绍的是zipkin&#xff0c;一个轻量级的零侵入的链路追踪平台&#xff0c;看我怎么10分钟给大家搭建出来。 1&#xff0c;介绍 zipkin官网&…

机器人制作开源方案 | 智能垃圾桶

1. 功能说明 智能垃圾桶是一种利用物联网技术和智能感知能力的智能设备&#xff0c;旨在提高垃圾分类和处理的效率。通常具备以下特点和功能&#xff1a; ① 智能感知&#xff1a;智能垃圾桶配备各种传感器&#xff0c;如压力传感器、红外线传感器等&#xff0c;可以实时感知…

FPGA开发:按键消抖

按键是FPGA开发板上的重要交互元件&#xff0c;因为按键的内部的结构设计&#xff0c;在按下和松开按键时&#xff0c;按键会无法避免地产生机械抖动&#xff0c;因此要对按键输入进行特殊处理&#xff0c;否则可能会因为机械抖动产生意外的重复触发。 按键消抖有很多方法&…

超详细,自动化测试allure测试报告实战(总结)

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

python机器学习(四)线性代数回顾、多元线性回归、多项式回归、标准方程法求解、线性回归案例

回顾线性代数 矩阵 矩阵可以理解为二维数组的另一种表现形式。A矩阵为三行两列的矩阵&#xff0c;B矩阵为两行三列的矩阵&#xff0c;可以通过下标来获取矩阵的元素&#xff0c;下标默认都是从0开始的。 A i j : A_{ij}: Aij​:表示第 i i i行&#xff0c;第 j j j列的元素。…

记录--关于前端的音频可视化-Web Audio

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 背景 最近听音乐的时候&#xff0c;看到各种动效&#xff0c;突然好奇这些音频数据是如何获取并展示出来的&#xff0c;于是花了几天功夫去研究相关的内容&#xff0c;这里只是给大家一些代码实例&…

数字孪生:未来科技的新前沿

数字孪生作为一项新兴的研究方向&#xff0c;正逐渐成为科技界的焦点。它是将现实世界中的实体、系统或过程通过数字化手段进行建模、仿真和分析&#xff0c;形成与实体相对应的数字化副本。数字孪生的发展为我们带来了无限的想象空间&#xff0c;以及解决现实问题的新途径。 在…

如何有效跟踪你的计费时间?

对于自由职业者、小型企业和远程团队来说&#xff0c;时间跟踪是必需的。了解自己在单个项目或任务上投入了多少时间&#xff0c;可以帮助他们有效管理资源和优化工作流程。 然而&#xff0c;在向客户收费时&#xff0c;时间跟踪多了一层复杂性&#xff1a;不仅需要跟踪所花费…

在Win11的WSL子系统Ubuntu上安装Gnome桌面环境

目录 1. 使用 WSL 在 Win11 上安装 Linux 2. 安装Ubuntu 22.04默认Gnome桌面环境 2.1更新Ubuntu 22.04软件包 2.2 安装Ubuntu桌面环境 2.3 重启服务 2.4 重启Ubuntu 22.04系统 2.5 登录Gnome桌面环境 在Win11上安装ubuntu版linux系统并实现默认Gnome桌面环境&#xff08…

Vue中TodoList案例_总结

完整项目&#xff1a; App.vue <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"addTodo"/><MyList :todos"todos" :checkTodo"che…

2023年一建学霸笔记

考点:单方取消或辞去委托承担的民事责任女《民法典》规定&#xff0c;因解除合同造成对方损失的&#xff0c;除不可归责于该当事人的事由外&#xff0c;无偿委托合同的解除方应当赔偿因解除时间不当造成的直接损失&#xff0c;有偿委托合同的解除方应当赔偿对方的直接损失和合同…

热备盘激活失败导致raid5阵列崩溃的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台Linux Redhat操作系统服务器上有一组由5块硬盘组建的raid5阵列&#xff0c;包含一块热备盘。上层部署一个OA系统和Oracle数据库。 服务器故障&#xff1a; raid5阵列中的1块磁盘离线&#xff0c;硬盘离线却没有激活热备盘&#xff0c;直到…

QT构建套件(Kit)黄色感叹号问题解决

构建套件&#xff08;Kit&#xff09;黄色感叹号问题 1:看下面的图出现了黄色警告&#xff0c;此时这个构建套件 就是不允许使用的 2&#xff1a;查看一下MSVC的dedbug调试器(cdb.exe) 如果没有&#xff0c;我们需要下载cdb.exe cdb.exe下载方法 2.1首先我们可以打开我们系…

STM32CUBUMX配置FLASH(W25Q128)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…

使用JMeter进行接口测试教程

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Ch…

【中创】区块链技术登上太空!全球首颗在轨可视化区块链卫星成功发射

作为一项突破性技术&#xff0c;区块链激发了许多技术创新者&#xff0c;区块链具备高安全、不可篡改和去中心化特征&#xff0c;能降低维护成本&#xff0c;提高可用性&#xff0c;可以为航空航天业提供更加灵活、可靠和高效的解决方案。 01航天科技之卫星导航 7月22日&#x…

(Chrome Ext)谷歌扩展程序-谷歌插件渗透测试方法记录

文章目录 前言一、本地获取谷歌插件/扩展程序源码二、工具化信息收集总结 前言 在工作岗位变更之后&#xff0c;越来越多“奇奇怪怪”的东西要去渗透和测试&#xff0c;在我之前干安服的时候&#xff0c;最多的就是测一下web&#xff0c;极少情况下测测app&#xff0c;但是现在…

【node】使用express+gitee搭建图床,并解决防盗链问题

首先创建一个gitee的项目&#xff0c;详细步骤我就不一一说明 注解&#xff1a;大家记得将这个项目开源&#xff0c;还有记得获取自己的私钥&#xff0c;私钥操作如下&#xff1a; node依赖下载&#xff1a; "axios": "cors": "express"…

opencv-16 图像去水印示例

常用的去水印方法&#xff1a; 克隆修复工具&#xff1a;使用图像处理软件&#xff08;如Photoshop&#xff09;中的克隆修复工具可以选择一个样本区域&#xff0c;然后将其复制到水印区域&#xff0c;以覆盖水印。这种方法在简单的水印上可能效果不错&#xff0c;但复杂的水印…