最近朋友问了一个问题,输入时钟是33MHz,要分出一路2.048MHz的时钟来,要求相位抖动尽可能小。我想到可以用计算机图形学中绘制直线的Bresenham算法来解决,获得成功。
输入时钟是33000kHz,输出时钟是2048kHz,好比从原点画一条到(33000,2048)的直线,用输入时钟驱动画笔在 x 方向的运动,那么对应的 y 方向的运动就是输出时钟。
Verilog代码如下:
module divider(clk_in, clk_out, nrst);
input clk_in, nrst;
output clk_out;
reg clk_out;
parameter input_freq = 33000; // both in kHz
parameter output_freq = 2048;
reg[16:0] err; // change to 18 bits if necessary, look down
always @(posedge clk_in or negedge nrst)
begin
if (nrst == 1'b0) begin
clk_out <= 1'b0;
err <= (output_freq << 2) - input_freq;
end
else begin

本文介绍了如何利用Bresenham算法在FPGA中设计一个分频器,将33MHz的输入时钟精确地分频为2.048MHz的输出时钟,有效降低了相位抖动。通过Verilog代码展示具体实现过程,确保输出时钟边沿抖动小于输入时钟周期。
最低0.47元/天 解锁文章
410





