分频器是对系统始终或其他时钟进行分频产生所需要的时钟信号;
首先从偶数分频器入手,最简单的二分频,就是在原时钟的上升沿进行输出信号翻转即可。
如果要实现4分频呢?就要用到计数器,在计数器计到2个上升沿的时候进行输出信号翻转。
现在对一般偶数分频器进行分析,N为偶数的时候,计数器进行上升沿技术。计数器的范围为0-(N-1),在0-N范围内选一个值K,分出两个范围选择输出信号的状态,当cnt在0~K范围内时,为低电平;在(K+1)-(N-1)范围内为高电平,因此输出占空比(N-1-K)/N,以下例子统一用50%占空比。
奇数分频器,先从最简单的三分频入手,首先还是按照偶数分频的思想去操作,发现计数器需要计算3/2=1.5个周期,输出信号再进行翻转,因此计数器上升沿计数这样操作就得不到结果,所以这种分频方法就不行。正确思路:取两路上升沿和下降沿信号,然后对这两路信号取或。具体是,使用计数器在0-2之间循环计数,控制输出1个高电平,2个低电平的信号1,然后把信号1延迟半个周期得到信号2,最后信号1与信号2相与得到50%占空比的3分频信号。
奇数分频N,使用计数器cnt在0-(N-1)之间循环计数,输出N-1/2个高电平,N+1/2个低电平的clk1信号,延时半个周期,得到clk2信号,clk_out=clk1 | clk2;或者输出N+1/2个高电平,N-1/2个低电平的clk1,延时半个周期,clk_out=clk1 & clk2;
偶数分频(任意占空比)代码:
module clk_div (
//system signals
input clk ,
input rst ,
//
output reg clk_out
);
parameter N=8,K=3;
reg [3:0] cnt;
always @(posedge clk or posedge rst) begin
if (rst) begin
clk_out <= 1'b0;
end
else if(cnt == K