一、概述
分频电路一般以输入时钟源作为参考,对其进行降频输出;分频可以直接使用锁相环(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分频例子。