时钟分频器

这篇具有很好参考价值的文章主要介绍了时钟分频器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、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

时钟分频器,fpga开发

二、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

时钟分频器,fpga开发
改进:
博主发现以上方法对偶数倍分频效果很好,但对奇数倍分频效果很差,所以博主对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

此次改动后奇数倍和偶数倍的分频器都能实现,用两个信号一个对于时钟上升沿检测,一个对于时钟下降沿检测。文章来源地址https://www.toymoban.com/news/detail-604477.html

到了这里,关于时钟分频器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • FPGA 多路分频器实验

    FPGA 多路分频器实验

    1 概述         在 FPGA 中,时钟分频是经常用到的。本节课讲解 2 分频、3 分频、4 分频和 8 分频的 Verilog 实现并且学习 generate 语法功能的应。 2 程序设计思路         1)整数倍分频,为 2、4、8,这种 2^n 次方倍数倍数关系的分频最容易实现,所以我们可以把这 3 种分

    2024年01月19日
    浏览(13)
  • FPGA【Verilog分频器】

    FPGA【Verilog分频器】

            在数字系统的设计中经常会碰到需要使用多个时钟的情况。时钟信号的产生通常具有两种方法,一种是使用PLL(Phase Locked Loop,锁相环),可生成倍频、分频信号;另一种则是使用硬件描述语言构建一个分频电路。         分频器的设计通常分为以下三类:奇

    2024年02月20日
    浏览(17)
  • 【FPGA & Verilog】奇数分频器 (50%)

    【FPGA & Verilog】奇数分频器 (50%)

    2.1 设计输⼊ 1. 模块名称:FrequencyDivider 2. 输⼊输出:CLK、RSTn、CLK_15 2.2 引脚约束 1. 输⼊端 ⾃定义 2. 输出端 ⾃定义 2.3 设计要求 1. 输出时钟的周期是输⼊时钟的15倍(15分频器) 2. 分别实现 7/15 占空⽐和 50% 占空⽐两种分频⽅式 3. 使⽤RTL View分析电路的区别 2.4 电路仿真1.

    2024年02月03日
    浏览(12)
  • FPGA学习日记——verilog实现分频器

    FPGA学习日记——verilog实现分频器

    主要思想是利用计数器实现分频器功能,其中按原理不同可分为分频和降频 一、先说分频。 1、第一种实现方式 输入信号为系统时钟50MHz,本例子先以偶数倍六分频为例实现分频的第一种方式:计数器对系统时钟的上升沿进行计数,最大计数M=5,即count取值范围为0~5,当计数

    2024年02月04日
    浏览(8)
  • FPGA基础设计(二):任意分频器(奇数,偶数,小数)

    FPGA基础设计(二):任意分频器(奇数,偶数,小数)

    FPGA开发板上一般只有一个晶振,即一种时钟频率。数字系统设计中,时间的计算都要以时钟作为基本单元,对基准时钟进行不同倍数的分频而得到各模块所需时钟频率,可通过Verilog代码实现;倍频可通过锁相环【PLL】实现。 把输入信号的频率变成成倍的低于输入频率的输出

    2024年02月01日
    浏览(12)
  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器与分频器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用

    2024年02月02日
    浏览(15)
  • 实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)

    实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)

    1. 实验目的: (1) 掌握QuartusⅡ软件的层次型设计方法; (2) 掌握元件封装及调用方法; (3) 熟悉FPGA实验平台,掌握引脚锁定及下载。 2. 实验任务: (1) 基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。 (2) 拓展任务1:用按键或开关

    2024年02月06日
    浏览(33)
  • 12-分频器 -偶分频

    12-分频器 -偶分频

    计数器是对于时钟信号进行计数,板载晶振的时钟频率是固定的,有时候需要进行分频和倍频才能满足需要 开发板上只有一种晶振,只有一种频率的时钟,想要通过对与固定时钟进行分频或者是倍频的方式得到各个模块所需的时钟频率,得到比固定时钟快的时钟通过 倍频 ,得到比固

    2024年02月06日
    浏览(13)
  • 分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

    分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

            在数字系统的设计中经常会碰到 需要使用多个时钟 的情况。时钟信号的产生通常具有两种方法,一种是使用PLL(Phase Locked Loop,锁相环),可生成 倍频、分频信号 ;另一种则是使用硬件描述语言构建一个分频电路。         分频器的设计通常分为以下 三类:

    2023年04月23日
    浏览(13)
  • 06 分频器设计

    06 分频器设计

    实现分频一般有两种方法,一种方法是直接使用 PLL 进行分频,比如在 FPGA 或者 ASIC 设计中,都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性,无法得到频率很低的时钟信号,比如输入 100Mhz 时钟,很多PLL 都无法得到 1Mhz 以下的时钟信号。另外一种方

    2024年02月19日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包