用Bresenham演算法在FPGA上實現小數分頻器

2021-04-14 05:06:00 字數 1120 閱讀 6312

最近朋友問了乙個問題,輸入時鐘是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 的直線,用輸入時鐘驅動畫...