任意分频器电路设计

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

目录

任意分频器电路设计

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

运行后的波形如下显示:

任意分频器电路设计,Verilog数字电路与逻辑设计,fpga开发,dsp开发,嵌入式硬件,硬件工程,算法

      可以看出,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%占空比的一个时钟波形。

任意分频器电路设计,Verilog数字电路与逻辑设计,fpga开发,dsp开发,嵌入式硬件,硬件工程,算法

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

任意分频器电路设计,Verilog数字电路与逻辑设计,fpga开发,dsp开发,嵌入式硬件,硬件工程,算法

       一般高质量的时钟信号都是要求有 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 软件 或者其他仿真工具运行后的波形如下显示:

任意分频器电路设计,Verilog数字电路与逻辑设计,fpga开发,dsp开发,嵌入式硬件,硬件工程,算法

        可以看出,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 参数不一样,最终分频的时钟是多少。文章来源地址https://www.toymoban.com/news/detail-576035.html

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

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

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

相关文章

  • 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    目录 一、前言 二、偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三、奇数分频 3.1 占空比非50%奇数分频 3.2 占空比50%奇数分频 3.3 Verilog代码 3.4 Testbench 3.5 仿真结果 四、小数分频 4.1 双模前置分频法 4.2 Verilog代码 4.3 Testbench 4.4 仿真结果 五、半整

    2024年02月04日
    浏览(48)
  • 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    数字IC经典电路设计 经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字I

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

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

    2023年04月23日
    浏览(68)
  • FPGA学习——实现任意倍分频器(奇数/偶数倍分频器均可实现)

    在FPGA(可编程逻辑门阵列)中,分频器是一种用于将时钟信号的频率降低的电路或模块。它可以根据输入的时钟信号生成一个较低频率的输出时钟信号。 常见的分频器可以按照固定比例来进行分频,例如将输入时钟频率除以2、除以4等。因此,如果输入时钟信号的频率为10

    2024年02月05日
    浏览(42)
  • FPGA【Verilog分频器】

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

    2024年02月20日
    浏览(49)
  • 【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日
    浏览(34)
  • Verilog手撕代码(6)分频器

    分频就是生成一个新时钟,该新时钟的频率是原有时钟频率的整数分之一倍,新周期是原有周期的整数倍。 再简单来说,让你手撕一个四分频电路,就是写代码生成一个周期是原来四倍的时钟,如果手撕一个三分频电路,就是写代码生成一个周期是原来三倍的时钟。 如图为

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

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

    2024年02月04日
    浏览(45)
  • 【实验室学习】时钟分频器,2、3、4、8分频 verilog实现

    记录时钟分频器的Verilog代码编写,主要掌握分频器设计思路 2、4、8分频设计较为容易: 2分频—设计一个1位的寄存器,当原时钟上升沿时取反即可 代码展示: 4分频与8分频—设计一个两位的计数器,4分频只需在计数器计数到00B或者10B时跳变电平即可,8分频只需在计数器计

    2024年02月11日
    浏览(44)
  • 常用数字电路模块:计数器与分频器(一)

    分频器的原理就是计数,翻转,计数,翻转,所以我们先来了解一下计数器! (1)计数器代码   计数器,顾名思义就是在时钟的节拍下进行计数,一个简单的N位计数器的代码如下所示,这个计数器从0计数到2 N -1(共计数了2 N 个数,也就是N位计数器。例如0,1,2,3,计

    2024年02月16日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包