目录
1 .偶数分频
2 .奇数分频
3 .半整数分频
分频器是FPGA中常用的设计之一,在FPGA设计中起着重要的作用(请参见)。 大多数设计在厂家集成的锁相环PLL资源中广泛采用分频、倍频、相移(各厂家Xilinx/Alter等开发工具包提供各自的IP ),但对时钟要求不高的基本
说到分频,对于初学者来说,可以考虑用1个计数器在基本时钟下进行计数,通过使其反转来得到期望的时钟。 这种方法确实可以实现偶数分频,但实现奇数分频只需要一个计数器是不够的,通常可能需要两个计数器。
1 .偶数分频偶数分频比奇数分频常见,可由一个计数器完全实现。 需要n分频(n为偶数时,N/2为整数) )时,可以通过1个计数器分频的时钟触发进行奇数周期。 计数器从0奇数变为N/2 -1时,输出时钟反转。
Verilog实现:
moduleEven(clk_in,rst_n,clk_out ); input clk_in; input rst_n; output reg clk_out; parameter N=6; //用于定义分频参数reg [3:0] cnt的always @ (posedge clk _ inornegedgerst _ n ) begin if (! rst_n ) begin cnt=4'b0000; clk_out=1'b0; endelseif(CNT==(n/2-1 ) ) begin clk_out=~clk_out; cnt=4'b0000; end else cnt=cnt 1; 结束模块
2 .奇数分频先看看3分频的时序图:
从时序图中可以看出,对于奇数分频,分别通过主时钟的上升沿触发生成一个时钟,通过下降沿触发生成一组时钟,将两个时钟信号相加或运算得到奇数分频的结果。
如果n是奇数,则N/2不是整数。 N-1/2是整数。 那么,该如何实现呢?
实现方法是
Step1:双边缘计数器计数;
使用cnt_up和cnt_down两个计数器,分别在时钟的上升沿触发计数器cnt_up和cnt_down。
33558www.Sina.com/:2:产生两个控制信号Clk_up和Clk_down;
cnt_up计数到[N-1]/2-1电平反转信号Clk_up,进而计数到N-1电平反转信号Clk_up,同时cnt_down为[N-1]/2-1电平
求 Step2:分钟后的时钟;
如果Clk_up、Clk_down信号和Clk_out之间的关系与Clk_up、Clk_down信号中的高/低电平比有关(例如
)1)高度 Step3低等级比例为n-1/2http://www.Sina.com/n-1/2http://www.Sina.com /,则分频时钟clk _ com
)2)高 / 低电平比例为N-1/2 : N/2时,分频时钟clk_div=clk_up clk_down )图
modulediv3(clk,rst_n,clk_out ); input clk,rst_n; output clk_out; //=======================================================================================* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//clk的上升沿(下降沿)触发生成的计数器CNT_p ) clk //clk上升(下降)触发中生成的时钟clk _ p (clk _ n ) parameter N=5; //分频参数//=====================================分频参数/=========分频参数=================* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *==============* * * * * * * * * * * * * * * * * * * * * * * *。 ELSEif(CNT_p==n-1 ) cnt_p=0; else cnt_p=cnt_p 1'b1; end//CNT _ n0-4 always @ (negedgeclkornegedgerst _ n ) begin if (! rst_n ) cnt_n=4'd0; ELSEif(CNT_n==(n-1 ) ) cnt_n=0; else cnt_n=cnt_n 1'b1; end//clk _ p always @ (posedgeclkornegedgerst _ n ) begin if (! rst_n ) clk_p=1; ELSEif(CNT_p==(n-1 )/2-1 ) clk_p=~clk_p; ELSEif(CNT_p==(n-1 ) ) clk_p=~clk_p; end//clk _ p always @ (negedgeclkornegedgerst _ n ) begin if (! rst_n ) clk_n=1; ELSEif(CNT_n==(n-1 )/2-1 ) clk_n=~clk_n; ELSEif(CNT_n==(n-1 ) ) clk_n=~clk_n; end assign clk_out=clk_n|clk_p; 结束模块
3 .半整数分频半整数分频,本次以2.5分频为例。 这主要利用时钟的上升沿和下降沿进行计数。