偶数分频器电路设计

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

目录

偶数分频器电路设计

1、偶数分频器电路简介

2、实验任务

3、程序设计

方法1:

3.1、8分频电路代码如下:

3.2、仿真验证

3.2.1、编写 TB 文件

3.2.2、仿真验证

方法2:

4、计数器进行分频

4.1、仿真测试


偶数分频器电路设计

       分频器在逻辑设计中一直都担任着很重要的角色,分频器一般包括计数分频和偶数分频。实现偶数分频可通过一个简单计数器实现,而如果需要三分频,五分频,七分频等奇数分频,一个计数器是不够的。我们先来看下偶数分频。

1、偶数分频器电路简介

       实现分频一般有两个方法,一个方法是直接使用 PLL 进行分频,比如 FPGA 或者 ASIC 设计中,都可以直接使用 PLL 进行分频,但是这种分频倍数有时候受限于 PLL 本身的特性,比如输入 100Mhz 时钟,很多 PLL 都实现不了分频到 1Mhz 的时钟,这个就是 PLL 本身特性限制的。还有一种实现方法就是直接使用逻辑实现,即使用代码实现分频设计。我们本节介绍的是使用代码进行设计分频器。本节我们先看下偶数分频设计。

        偶数分频,顾名思义,是说分频后的频率和分频前的频率比例是偶数,比如 100Mhz 时钟,进行二分频后,就是 50Mhz

       实现偶数分频可通过一个简单计数器实现,而如果需要三分频,五分频,七分频等奇数分频,一个计数器是不够的。

       偶数分频实现比较简单,假设为 N(偶数)分频,只需计数到 N/2-1,然后时钟翻转、计数器清零,如此循环就可以得到 N(偶)分频。举个例子,比如晶振时钟是 100Mhz 时钟,想得到一个 25Mhz 的时钟, 那么这个是一个 100/25=4 的四分频设计,那么按照我们刚说的计数到 4/2-1=1,然后时钟翻转、计数器清零,就可以得到一个 24Mhz 的时钟。

2、实验任务

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

3、程序设计

        偶数分频器:2分频设计,只需要使用基准时钟在第1个时钟周期输出高电平(或低电平),在第2个时钟周期输出相反电平,如此反复即可。

       同理,4分频设计:使用基准时钟在第1、2个时钟周期输出高电平(或低电平),在第3、4个时钟周期输出相反电平,如此反复即可。

       同理,8分频设计:使用基准时钟在第1、2、3、4个时钟周期输出高电平(或低电平),在第5、6、7、8个时钟周期输出相反电平,如此反复即可。

        由此可以推导出偶数分频设计的一般方法:假设为N分频,只需设计一个计数器从0计数到 N/2-1(一共N/2个基准时钟),然后将输出分频时钟翻转、计数器清零,如此循环就可以得到 N分频。

       根据简介介绍的分频电路设计思路,假设为 N(偶数)分频,只需计数到 N/2-1,然后时钟翻转、计数清零,如此循环就可以得到 N(偶)分频,可以通过改变参量 N 的值和计数变量 cnt 的位宽实现任意偶分频,由于默认为 8 分频,因此 N 初始值为 8。由此可以写出如下代码。

方法1:

3.1、8分频电路代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/13 14:45:37
// Design Name: 
// Module Name: divider_8
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
//
//偶数分频器:2分频设计,只需要使用基准时钟在第1个时钟周期输出高电平(或低电平),
//在第2个时钟周期输出相反电平,如此反复即可。
//同理,4分频设计:使用基准时钟在第1、2个时钟周期输出高电平(或低电平),
//在第3、4个时钟周期输出相反电平,如此反复即可。
//同理,8分频设计:使用基准时钟在第1、2、3、4个时钟周期输出高电平(或低电平),
//在第5、6、7、8个时钟周期输出相反电平,如此反复即可。
//由此可以推导出偶数分频设计的一般方法:假设为N分频,只需设计一个计数器从0计数到 N/2-1(一共N/2个基准时钟),
//然后将输出分频时钟翻转、计数器清零,如此循环就可以得到 N分频。

//8分频电路设计
module divider_8(
//     input          sys_clk,    //50MHz系统时钟(一个周期是20ns:1/50MHz=0.02us=20ns)
    //differential system clocks //200MHz系统时钟(一个周期是5ns:1/200MHz=0.005us=5ns)
    input               sys_clk_p,       //system clock positive
    input               sys_clk_n,       //system clock negative
     input          sys_rst_n,  //复位信号,低电平有效
     
     output reg     clk_8       //输出8分频信号(50MHz/8=6.25MHz,周期160ns)(200MHz/8=25MHz,周期40ns)
    );

//parameter define
parameter  N = 8;

//reg define  //define the time counter
reg [1:0]   cnt;

wire        sys_clk;

//差分输入时钟缓冲器(黑金FPGA)
IBUFDS sys_clk_ibufgds //generate single end clock
(
	.O           (sys_clk       ),
	.I           (sys_clk_p     ),
	.IB          (sys_clk_n     )
);

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

//8分频时钟输出模块
//满足计数条件则对8分频时钟进行反转
//8分频时钟每隔4个周期反转一次,所以8分频的周期,即为8个时钟周期
always @(posedge sys_clk or negedge sys_rst_n) begin
     if(!sys_rst_n)
          clk_8 <= 1'b0;     //复位清零
      else if(cnt==2'd3)     //计满4个时钟周期
          clk_8 <=  ~clk_8;  //计满,则输出反转
      else 
          clk_8 <= clk_8;     //没计满,就保持原状态
end
 
endmodule

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

偶数分频器电路设计

        从上图可以看出,cnt 是一个 2bit 的计数器,在计数器计到 3 的时候,clk_8 进行取反操作,即得到一个八分频时钟。

3.2、仿真验证

3.2.1、编写 TB 文件

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

`timescale 1ns / 1ps		//时间刻度:单位1ns,精度1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/13 15:04:35
// Design Name: 
// Module Name: tb_divider_8
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_divider_8();	//仿真测试模块

//parameter T = 20; //50MHz时钟周期为20ns
parameter T = 5; //200MHz时钟周期为5ns

//input define
//reg       sys_clk;   //时钟信号
reg       sys_clk_p;   //时钟信号
wire      sys_clk_n;
reg       sys_rst_n;

//output define
wire       clk_8;

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

//always代表重复进行,#10代表每10个时间单位
//每10个时间单位反转时钟,即时钟周期为20个时间单位(20ns)
//always #10 sys_clk = ~sys_clk;  //每半个周期后,电平取反一次。
always #(T/2) sys_clk_p <= ~sys_clk_p;  //每半个周期后,电平取反一次。
assign sys_clk_n=~sys_clk_p;

//例化被测试模块
divider_8 u_divider_8(
//     .sys_clk            (sys_clk),
     .sys_clk_p          (sys_clk_p),
     .sys_clk_n          (sys_clk_n),
     .sys_rst_n          (sys_rst_n),
     
     .clk_8               (clk_8)
);

endmodule

3.2.2、仿真验证

        测试程序在 Xilinx Vivado 软件 或者其他仿真工具运行后的波形如下显示,可以看出,N 初始为 8,当复位撤销(复位信号低有效)之后,cnt 即开始计数,在计数器计到 3 的时候,clk_8 进行取反操作,即得到一个八分频时钟。

偶数分频器电路设计

方法2:

4、计数器进行分频

       此处再给大家介绍一个分频设计方法,就是直接使用计数器即可进行分频。 直接使用计数器分配的代码如下:

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

//8分频电路
//直接使用计数器即可进行分频。
module divider_8CNT(
    input             clk ,  // system clock 50Mhz on board
    input             rst_n, // system rst, low active 
    output reg [2:0]  y      // output signal
   );

//===========================================================================
// ------------------------- MAIN CODE --------------------------------------
//===========================================================================
always @ (posedge clk or negedge rst_n) begin
    if (rst_n == 1'b0)
        y <= 3'b0 ;
    else
        y <= y + 1'b1 ;
end

endmodule

4.1、仿真测试

       testbech 测试电路,这个 testbech 激励只需要提供时钟和复位就好了,通过仿真来看下计数器的波形。

测试代码如下

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

//testbech 测试电路,这个 testbech 激励只需要提供时钟和复位就好了,
//通过仿真来看下计数器的波形。
//测试代码如下
module tb_divider_8CNT();

reg    sys_clk;
reg    sys_rst_n;

wire [2:0]  y;

initial begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0; 
    #200 //等待200ns
    sys_rst_n = 1'b1;  
end

always #10 sys_clk = ~sys_clk;

divider_8CNT  u_divider_8CNT(
    .clk   (sys_clk    ),
    .rst_n (sys_rst_n  ),
    .y     (y          )
);

endmodule

       可以看出,当复位撤销(复位信号低有效)之后,计数器 y 就从 0 开始一直累加,每次加 1,直到加到 7 之后,进位溢出为 0,然后再次从 0 开始一直累加,如此反复循环。

        从波形中,我们能看到一个分频的效果,计数器最低 bit y[0]是每 2 个周期在循环跳变,计数器次低 bit y[1] 是每 4 个周期在循环跳变,计数器最高 bit y[2] 是每 8 个周期在循环跳变,这个也是常有的分频方法,比如直接把计数器的各个 bit 赋值给一个时钟信号,那么计数器的 y[0] 实现的是 2 分频,计数器的 y[1] 实现的是 4 分频,计数器的 y[2] 实现的是 8 分频。这个也是最简单和最常用的偶数分频方法。

偶数分频器电路设计文章来源地址https://www.toymoban.com/news/detail-493051.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日
    浏览(45)
  • FPGA学习——实现任意倍分频器(奇数/偶数倍分频器均可实现)

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

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

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

    2024年02月16日
    浏览(51)
  • verilog---分频器设计

    //设计分频器 将50MHZ信号分频产生1HZ的秒脉冲,输出信号占空比为50%。 //设计思路:用计数器设计,N分频:当计数到(N/2)-1个数时,输出时钟翻转一次 //50*10^6次分频:计数到24 999 999(需要25bit)时,输出信号翻转。 //无法用vmf仿真,因为endtime最大为10us,实际最少需要1000000u

    2024年02月04日
    浏览(34)
  • 06 分频器设计

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

    2024年02月19日
    浏览(49)
  • 数电实验6:可控分频器设计

    学习 ModelSim 仿真方法。 巩固 Verilog HDL 时序电路设计。 FPGA 开发板上有一个 50MHz 的高频时钟。设计一个可控分频器,clk_in 为分频器时钟输入, sel为选择开关, clk_out为分频器信号输出。当sel=0时,fclk_out=sn[2:0]Hz;当 sel=1 时, fclk_out=sn[4:0] Hz。 clk_out 的占空比 D=28%;(D=tH/T,

    2024年02月05日
    浏览(37)
  • FPGA设计开发(基础课题):分频器设计

    一、设计目的 1、掌握分频器的设计原理; 2、用HDL语言设计分频器。 二、设计原理 分频器与计数器类似,也是要对时钟脉冲进行计数,但其输出的不是对时钟脉冲个数的计数值,而是其频率与时钟的频率成固定比例关系的脉冲信号。整数分频是所有分频器中最简单,最容易

    2024年02月13日
    浏览(51)
  • EDA实验------数控分频器设计(QuartusII)

    目录 一、实验目的 二、实验原理 三、实验内容 四、实验步骤 五、注意事项 六、思考题 七、实验过程 分频器的基本原理 什么是分频器?  如何去分频? 1.创建新项目 2.创建Verilog文件,写入代码 3.连接电路  锁相环的创建  4.烧录文件 学习数控分频器的设计、分析和测试方

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

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

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

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

    2024年02月06日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包