用 Verilog 语言实现任意整数分频器
分频器是 FPGA 设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,
广泛使用芯片厂家集成的锁相环资源,如赛灵思(Xilinx)的 DLL.来进行时钟的分频,倍频
以及相移。 但是对于时钟要求不高的基本设计,通过语言进行时钟的分频相移仍然非常流
行,首先这种方法可以节省芯片内部的锁相环资源,再者,消耗不多的逻辑单元就可以 达
到对时钟操作的目的。另一方面,通过语言设计进行时钟分频,可以看出设计者对设计语
言的理解程度。因此很多招聘单位在招聘时往往要求应聘者写一个分频器 (比如奇数分
频)以考核应聘人员的设计水平和理解程度。下面讲讲对各种分频系数进行分频的方法:
第一,偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完
全可以实现的。如进行 N 倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当
计数器从 0 计数到 N/2-1 时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个
时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。电路上只需一个
D 触发器和一个非门即可实现,Q(n+1)=D,D=~Q(n),clk_out=Q(n+1) .
第二,奇数倍分频:奇数倍分频常常在论坛上有人问起,实际上,奇数倍分频有两种
实现方法:
占空比为非 50%的三分频时钟,完全可以通过计数器来实现,如进行三分频,通过待
分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可
以在计数器计数到 1 时,输出时钟进行翻转,计数到 2 时再次进行翻转。即是在计数值在
邻近的 1 和 2 进行了两次翻转。这样实现的三分频占空比为 1/3 或者 2/3。
module three(clk_in,rst,clk_out);// 三倍频
input clk_in,rst;
output clk_out;
reg clk_out;
reg [1:0] count;
always @(negedge rst or posedge clk_in)
begin
if(rst==0) begin count<=0; clk_out<=0; end
else
begincount<=count+1;
if(count==1) clk_out<=~clk_out;
else if(count==2) begin clk_out=~clk_out; count<=0; end
end
end
endmodule
仿真图
另一种实现:
module div3(CLKIN,CLKOUT,RESETn); //依然是三倍频
input CLKIN,RESETn;
评论1