分频器——秒分频、三分频、五分频、任意分频和偶数分频

本文介绍了使用Verilog实现不同类型的时钟分频方法,包括秒分频、偶数分频和奇数分频。在奇数分频中详细讨论了如何保持占空比为50%,并提供了两种实现方式。同时,文章通过实例代码展示了具体的分频过程,并给出了仿真结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


👉声明:本文所使用的的所有代码均已编译并仿真通过,仿真结果附于文中。
👉注:更多精彩请看: 面试常问的verilog代码汇总 一文


1.占空比

  • 占空比:理想的时钟模型是一个占空比为50%且周期固定的方波。时钟周期为T,TH为高脉冲宽度,TL为低脉冲宽度,T=TH+TL。占空比即为高脉冲宽度与周期之比,即TH / T。

2.秒分频计数

假设clk是24MHz系统时钟,秒分频产生s_pulse;秒计数模块对s_pulse计数,计数范围0~9,计数结果s_num的位宽为4 个bit位。
在这里插入图片描述
在这里插入图片描述
代码如下

module s_count(clk,rst_n,s_num);
  input     clk,rst_n;
  output    [3:0]s_num;
    //因为24000000需要25位二进制来表达
  reg       [24:0]con_t;//秒脉冲分频计数
  reg       s_pulse;//秒脉冲尖
  reg       [3:0]s_num;
  
  parameter       fequency=24;//24MHZ 
  
  always@(posedge clk or negedge rst_n)begin
    if(!rst_n) begin
      con_t <= 0;
      s_pulse <= 0;
      s_num <= 0;
    end
    else begin
       //时钟频率是24MHz,所以当con_t计数到(24*1000000-1)时,为1秒
       if(con_t == fequency*1000000 -1)begin
         con_t <= 0;
         s_pulse <= 1;
      end
      else begin
         con_t <= con_t + 1;
         s_pulse <= 0;
      end
    end
    //每出现一各秒脉冲尖,就计数一次
    if(s_pulse == 1)begin
      if(s_num == 9)  s_num <= 0;//计到9个秒脉冲尖,就清零
      else           s_num <= s_num + 1;
    end
  end
endmodule

`timescale 1ns/1ps
module tb_s_count;
  reg       clk,rst_n;
  wire[3:0]   s_num;
  s_count dut(.clk(clk),.rst_n(rst_n),.s_num(s_num));
  
  initial begin 
    clk <= 0;
    forever begin
      #5 clk <= !clk;
    end
  end
  initial begin 
    #10 rst_n <= 0;
    repeat(10) @(posedge clk);
    rst_n <= 1;
  end 
endmodule

仿真结果如下,时间关系,我就没跑完了。
在这里插入图片描述

3.偶数分频

  • 偶分频电路指的是分频系数为 2、4、6、8 … 等偶数整数的分频电路 ;

  • 当进行N倍偶数分频,采用计数器计数带分频时钟。当计数器从**0计数到 N/2 - 1 **时,输出时钟就翻转翻转。

  • 若输入时钟为 24MHz,进行2分频,分频后的时钟频率为 (24/2) = 12 MHz

module div_6(clk_in,rst_n,clk_out);
    input   clk_in;
    input   rst_n;
    output  clk_out;//分频后的时钟
    
    parameter div_num = 6;
  
    reg   clk_out;    
    reg     [3:0]c_count;//分频计数器

  always @(posedge clk_in or negedge rst_n) begin
    if(!rst_n) begin
        clk_out <= 4'd0;
        c_count <= 4'd0; 
    end  
    //如果计数器还未计到 N/2 - 1
    else if(c_count < ((div_num / 2 )- 1)) begin
        c_count     <= c_count + 1'b1;
        clk_out <= clk_out;
    end
    //如果计数器还计到 N/2 - 1,那就翻转
    else begin
        c_count <= 4'd0;
        clk_out <= ~clk_out;
    end
  end
 endmodule

`timescale 1ns/1ps
module tb_div6;
  reg       clk_in,rst_n;
  wire      clk_out;
  div_6 dut(.clk_in(clk_in),.rst_n(rst_n),.clk_out(clk_out));
  
  initial begin 
    clk_in <= 0;
    forever begin
      #5 clk_in <= !clk_in;
    end
  end
  initial begin 
    #10 rst_n <= 0;
    repeat(10) @(posedge clk_in);
    rst_n <= 1;
  end 
endmodule

仿真结果如下:
在这里插入图片描述

4.奇数分频

1. 占空比不为50%

  • 通过对待分频时钟上升沿触发计数器进行计数来实现。
  • 三分频电路:进行模3计数,在时钟上升沿进行加 1操作,比如可以在计数器计数到1时,输出时钟进行翻转,计数到2时再次进行翻转,计数到 2时清零,从头开始计数。这样实现的三分频占空比为1/3。
  • 五分频电路: 进行模5计数,在时钟上升沿进行加 1 操作,计数器的值为 0、1 时,输出时钟信号不变;计数器的值为2、3、4 时,输出时钟信号 clk_div 为低电平。计数到 5 时清零,从头开始计数。五分频占空比为 40% 。
//5分频,占空比不为50%
module div_5(clk,rst_n,clk_div);
input clk;
input rst_n;
output clk_div;

parameter NUM_DIV = 5;//分频数

reg[2:0] cnt1; //上升沿采样计数值
reg    clk_div;//上升沿采样计数
    
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) 
        cnt1 <= 0;
    else if(cnt1 < (NUM_DIV - 1))
        cnt1 <= cnt1 + 1'b1;
    else
        cnt1 <= 0; //等于NUM_DIV时计数器复位
end
always @(posedge clk or negedge rst_n) begin 
    if(!rst_n)
        clk_div <= 1'b1;
    else if(cnt1 < (NUM_DIV-1)/2)//时钟翻转
        clk_div <= 1'b1;//计数器值为0,1时,时钟信号为高
    else
        clk_div <= 1'b0;//计数器值为2,3,4时,时钟信号为低
end
endmodule

`timescale 1ns/1ps
module tb_div5_30;
  reg       clk,rst_n;
  wire      clk_div;
   
  div_5 dut(.clk(clk),.rst_n(rst_n),.clk_div(clk_div));
  initial begin 
    clk <= 0;
    forever begin
      #5 clk <= !clk;
    end
  end
  initial begin 
    #10 rst_n <= 0;
    repeat(10) @(posedge clk);
    rst_n <= 1;
  end 
endmodule

实现了占空比不为50%的五分频
在这里插入图片描述

2. 占空比为50%

当奇分频需要保持分频后的时钟占空比为 50%时 ,就不能像偶分频那样直接在分频系数的一半时使时钟信号翻转(高电平一半,低电平一半)。在此我们需要利用输入时钟上升沿和下降沿来进行设计。

  • 法一:可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。

  • 法二:对进行奇数倍n分频时钟,首先进行n/2分频(带小数,即等于(n-1)/2+0.5),然后再进行二分频得到占空比为50%的奇数倍分频。

//法一实现5分频
module div_5(clk,rst_n,clk_div);
input clk;
input rst_n;
output clk_div;

parameter NUM_DIV = 5;//分频数
reg[2:0] cnt1; //上升沿采样计数值
reg[2:0] cnt2;//下升沿采样计数值
reg    clk_div1, clk_div2;//上升沿采样计数和下降沿采样计数的时钟
    
assign clk_div = clk_div1 | clk_div2;//上升沿采样计数和下降沿采样计数的时钟相或
//上升沿计数
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        cnt1 <= 0;
    else if(cnt1 < NUM_DIV - 1)
        cnt1 <= cnt1 + 1'b1;
    else
        cnt1 <= 0; //等于NUM_DIV时计数器复位
end
always @(posedge clk or negedge rst_n) begin 
    if(!rst_n)
        clk_div1 <= 1'b1;
    else if(cnt1 < NUM_DIV / 2)//时钟翻转
        clk_div1 <= 1'b1;
    else
        clk_div1 <= 1'b0;
end
//下降沿计数
always @(negedge clk or negedge rst_n) begin
    if(!rst_n)
       cnt2 <= 0;
    else if(cnt2 < NUM_DIV - 1)
       cnt2 <= cnt2 + 1'b1;
    else
       cnt2 <= 0;
end
always @(negedge clk or negedge rst_n) begin
    if(!rst_n)
        clk_div2 <= 1'b1;
    else if(cnt2 < NUM_DIV / 2)//时钟翻转,要与上升沿同计数值
        clk_div2 <= 1'b1;
    else
        clk_div2 <= 1'b0;
end
endmodule


`timescale 1ns/1ps
module tb_div5_50;
  reg       clk,rst_n;
  wire      clk_div;
   
  div_5 dut(.clk(clk),.rst_n(rst_n),.clk_div(clk_div));
  initial begin 
    clk <= 0;
    forever begin
      #5 clk <= !clk;
    end
  end
  initial begin 
    #10 rst_n <= 0;
    repeat(10) @(posedge clk);
    rst_n <= 1;
  end 
endmodule

仿真结果如下,实现了占空比为50%的五分频电路
在这里插入图片描述

5.任意分频

对于实现占空比为50% 的N倍奇数分频。有以下步骤:

  • 首先时钟上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数N分频时钟;
  • 同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转。然后经过(N-1)/2时,输出时钟再次翻转,生成占空比非50%的奇数N分频时钟。
  • 两个占空比非50%的N分频时钟相或运算,得到占空比为50%的奇数n分频时钟。
<think>嗯,用户想了解三分频电路的原理应用。首先,我需要确定三分频电路的基本概念。三分频电路应该是指能将输入信号率分为原来三分之一的电路,这在数字电路通信系统中很常见。常见的分频方法包括使用计数器、触发器或者专用分频器芯片。 然后,原理部分可能需要涉及分频的基本方法。例如,使用计数器累计输入脉冲,当达到设定值时输出一个脉冲,从而实现分频。对于三分频,可能需要模3计数器。这里需要确认是同步还是异步设计,同步设计更可靠,抗干扰能力强。 接下来是电路实现。可能需要使用D触发器或JK触发器构成计数器。例如,三个触发器级联,通过反馈逻辑实现模3计数。或者使用可编程逻辑器件,如使用Verilog或VHDL编写代码描述分频行为,再综合成电路。这部分需要具体说明步骤,比如状态转移、真值表等。 应用方面,三分频电路常用于通信系统的率合成、时钟管理、音处理等。例如,在射电路中生成不同段的信号,或者在微控制器中调整时钟率以降低功耗。需要结合具体例子,比如在PLL中的应用,或者数字系统中的时钟分频。 还要考虑用户可能的背景,可能是电子工程学生或爱好者,需要技术细节但不过于复杂。需要确保解释清晰,术语准确但易懂。同时,用户提供的引用中有提到多模分频器的设计,特别是双模分频器计数器实现,这可能与三分频相关,可以引用参考中的内容。 最后,生成相关问题时,要考虑用户可能进一步想了解的内容,比如设计时的注意事项、同步异步的区别、具体应用案例等。确保问题覆盖原理、设计、优化应用等方面,帮助用户深入理解。</think>### 三分频电路原理及应用 #### 一、三分频电路原理 三分频电路的核心功能是将输入信号率$f_{in}$降低为$f_{out}=f_{in}/3$。其实现方式主要分为**数字逻辑电路****可编程器件**两类: 1. **基于计数器的实现** - 使用模3计数器,通过状态机控制输出信号翻转。例如,3个D触发器级联时,通过反馈逻辑(如与非门)检测计数器状态,当计数值达到2时复位,并触发输出信号翻转[^2]。 - 典型电路状态转移: $$0 \rightarrow 1 \rightarrow 2 \rightarrow 0$$ - 输出波形占空比可通过调整状态检测点优化。 2. **基于触发器的同步设计** 使用JK触发器构建同步时序电路,通过时钟边沿触发状态跳变。例如: ```verilog always @(posedge clk) begin if (count == 2) begin out <= ~out; count <= 0; end else begin count <= count + 1; end end ``` 3. **可编程逻辑实现** 在FPGA/CPLD中通过硬件描述语言(如VHDL)直接定义分频行为: ```vhdl process(clk) begin if rising_edge(clk) then if counter < 2 then counter <= counter + 1; else output_signal <= not output_signal; counter <= 0; end if; end if; end process; ``` #### 二、关键参数与设计要点 1. **占空比控制** 常规方法输出占空比为33.3%,若需50%占空比,需采用多相位合成或更复杂的状态机设计。 2. **时序约束** 同步设计需满足建立/保持时间要求,避免亚稳态问题。 3. **抖动抑制** 高应用中需关注时钟树分布信号完整性。 #### 三、典型应用场景 1. **通信系统** - 用于射前端的多模分频器链,支持率合成器生成不同段信号。 - 例如:将3 GHz本振信号分频为1 GHz中。 2. **数字电路** - 微控制器时钟分频,降低外设工作率以节省功耗。 - 例如:将24 MHz主时钟分频为8 MHz供给UART模块。 3. **音处理** - 在数字音系统中对采样时钟进行分频,适配不同编解码需求。 4. **仪器仪表** - 函数发生器中的分频模块,扩展输出率范围。 #### 四、优化方向 1. **低功耗设计** 采用门控时钟技术,在非活跃周期关闭计数器电路。 2. **高速实现** 使用电流模式逻辑(CML)提升工作率至GHz级别。 3. **可重构架构** 集成多模分频功能(如2/3/4分频可配置),增强灵活性。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小verifier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值