N-0.5倍分频(Verilog)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
采用模N计数器可以实现。对于进行n+0.5分频,首先进行模n的计数,在计数到n-1时,输出时钟赋为‘1’,回到计数0时,又赋为0,因此,可以知道,当计数值为n-1时,输出时钟才为1,因此,只要保持计数值n-1为半个输入时钟周期,即实现了n+0.5分频时钟,因此保持n-1为半个时钟周期即是一个难点。具体如下:因为计数器是通过时钟上升沿计数,因此可以在计数为n-1时对计数触发时钟进行翻转,那么时钟的下降沿变成了上升沿。即在计数值为n-1期间的时钟下降沿变成了上升沿,则计数值n-1只保持了半个时钟周期,由于时钟翻转下降沿变成上升沿,因此计数值变为0。因此,每产生一个n-0.5分频时钟的周期,触发时钟都是要翻转一次。这个过程所要做的就是对CLK进行适当的变换,使之送给计数器的触发时钟每经历N-0.5个周期就翻转一次。N-0.5倍:取N=3,分频原理示意图如下:
clk为为输入时钟;
divclk为计数器计数时钟;
原理框图如下:
程序
代码如下:
module divN_half(clk,divN_half);
input clk; //时钟输入
output divN_half; //N-0.5输出
parameter N = 3; // 设置分频数N-0.5中的N
parameter M = 1; // 2^(M+1)>3
reg [M:0]count;
reg divN_half;
reg div2;
assign divclk="clk"^div2; //时钟输入与2分频异或
always@(posedge divclk) //模N计数器
begin
if(count<N-1)
begin
count<=count+1;
divN_half<=0;
end
else
begin
count<=0;
divN_half<=1;
end
end
always@(posedge divN_half) //2分频
begin
div2<=~div2;
end
endmodule
Post-Route Simulation的仿真波形如下:
可以看到,实现了N-0.5(N=3,3-0.5=2.5)分频。
观察的波形信号加上divclk(计数器计数时钟)、div2(二分频信号),可以看到仿真波形如预期。
当设计N取其他数时,可以在程序中改参数:
parameter N = 3; // 设置分频数N-0.5中的N
parameter M = 1; // 2^(M+1)>3
本文工程文件:https://static.assets-stash.eet-china.com/album/old-resources/2009/2/18/5667006d-7df7-44bd-8de2-ea92191ceca1.rar
参考资料:
1) 任意数分频(包括奇偶数和小数)的各种设计方法[综合电子]_老古开发网文章
http://www.laogu.com/wz_1260.htm
2) 任意分频的verilog语言实现_淡淡啲菋噵
http://hi.baidu.com/wan_yi/blog/item/d8c997990f3d6d0d6f068c4b.html
3) 用Verilog实现基于FPGA的通用分频器,<<电子与电脑>>2006年 第05期
作者: 唐晓燕, 梁光胜, 王玮,
用户1720344 2013-11-23 00:02
用户1720344 2013-11-22 23:42
用户402798 2013-8-30 16:05
用户377235 2013-6-3 14:50
tengjingshu_112148725 2009-6-18 09:34
用户184581 2009-6-17 14:49