最近朋友問了乙個問題,輸入時鐘是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;
endelse begin
if (err[16] == 1'b0) begin // also change here !!! (if change the former)
err <= err - (input_freq << 1) + (output_freq << 2);
clk_out <= !clk_out;
endelse begin
err <= err + (output_freq << 2);
endend
endendmodule
這是乙個同步時序電路,在 clk_in 的每個上公升沿判斷 clk_out 是否翻轉,設 clk_in 的週期是t,
那麼 clk_out 的邊沿抖動小於t。
用Bresenham演算法在FPGA上實現小數分頻器
最近朋友問了乙個問題,輸入時鐘是33mhz,要分出一路2.048mhz的時鐘來,要求相位抖動盡可能小。我想到可以用計算機圖形學中繪製直線的bresenham演算法來解決,獲得成功。輸入時鐘是33000khz,輸出時鐘是2048khz,好比從原點畫一條到 33000,2048 的直線,用輸入時鐘驅動畫...
用Bresenham演算法在FPGA上實現小數分頻器
最近朋友問了乙個問題,輸入時鐘是33mhz,要分出一路2.048mhz的時鐘來,要求相位抖動盡可能小。我想到可以用計算機圖形學中繪製直線的bresenham演算法來解決,獲得成功。輸入時鐘是33000khz,輸出時鐘是2048khz,好比從原點畫一條到 33000,2048 的直線,用輸入時鐘驅動畫...
用Bresenham演算法在FPGA上實現小數分頻器
最近朋友問了乙個問題,輸入時鐘是33mhz,要分出一路2.048mhz的時鐘來,要求相位抖動盡可能小。我想到可以用計算機圖形學中繪製直線的bresenham演算法來解決,獲得成功。輸入時鐘是33000khz,輸出時鐘是2048khz,好比從原點畫一條到 33000,2048 的直線,用輸入時鐘驅動畫...