任意整数分频

一、概述

        分频电路一般以输入时钟源作为参考,对其进行降频输出;分频可以直接使用锁相环(PLL)时钟资源实现,也可以计数为基础,进行分频设计。本文主要记录后者的相关问题。

二、偶分频

1、概念

分频数:即降频倍数,可以为奇数也可以为偶数,甚至可以是有理分数;举例:时钟为24Mhz,奇分频如3分频为8Mhz,偶分频如4分频为6Mhz。

占空比:一个周期内高电平持续时间所占的比例,即高电平持续时间/周期时间

2、实现代码

代码中通过修改DIV参数改变分频系数。即可实现奇分频,又可实现偶分频。


//======================================================================
// --- 名称 : div_clk
// --- 作者 : 木子
// --- 日期 :2024-8-9
// --- 描述 : 实现任意整数分频,占空比50%
//======================================================================

module div_clk
//========================< 参数 >==========================================
    #(
        parameter       DIV     =   2
    )
    //---------------------<端口声明>---------------------------------------
    (
        input     wire      clk      ,
        input     wire      rst_n     ,
        output    wire      div_clk   
    );
    
    //---------------------<信号定义>---------------------------------------
    
    reg   [31:0]      pos_cnt      ;
    wire              pos_clk      ;
    reg   [31:0]      neg_cnt      ;
    wire              neg_clk      ;

    //----------------------------------------------------------------------
    //--   clk上升沿分频
    //----------------------------------------------------------------------
    
    always @(posedge clk or negedge rst_n)  begin
        if(!rst_n)
            pos_cnt <=  0;
        else if (pos_cnt == DIV-1)
            pos_cnt <= 0;
            else 
                pos_cnt <= pos_cnt + 1'b1;
            end
        
        assign pos_clk = (pos_cnt < DIV/2)?0:1;
    //----------------------------------------------------------------------
    //--   clk下降沿分频
    //----------------------------------------------------------------------

    always @(negedge clk or negedge rst_n)begin
        if(!rst_n)
            neg_cnt <= 0;
        else if (neg_cnt == DIV-1)
            neg_cnt <= 0;
            else
                neg_cnt <= neg_cnt + 1'b1;  
            end

            assign neg_clk = (neg_cnt < DIV/2)?0:1;

//==========================================================================
//==    奇偶判断后,输出正确的分频
//==========================================================================
assign div_clk = DIV[0] ? (pos_clk & neg_clk) : pos_clk;

    endmodule

三、奇分频

奇分频要使用到时钟的下降沿,因为分频后时钟需要半个之前的时钟周期。

1、实现代码

奇分频设计思路:
1: 假设为N分频,需从0计数到N-1(一共N/2个基准时钟),一直循环。
2: 设计一个对基准时钟上升沿敏感的信号,每当计数到(N-1)/2-1时,时钟翻转;计数到计数器最大值时再翻转;
3: 设计一个对基准时钟下降沿敏感的信号,每当计数到(N-1)/2-1时,时钟翻转;计数到计数器最大值时再翻转;
4: 将上升沿敏感信号和下降沿敏感的信号相与即N分频电路;
实现代码及仿真波形参考偶分频。

四、仿真波形

仿真代码参考呼吸灯,修改例化模块后即可使用。下面给出2分频例子。

 可以看到分频后频率为之前的2分之1。
奇分频如下,以下是5分频例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值