有時在基本模塊的設計中常常會使用到時鍾分頻,時鍾的偶分頻相對奇分頻來說比較簡單易於理解,但是奇分頻的理念想透徹后也是十分簡單的,本文就針對奇分頻做一個記錄並列出了 modelsim 的仿真結果。
奇分頻
其實現很簡單,主要為使用兩個計數模塊分別計數,得到兩個波形進行基本與或操作完成。一個 5 分頻的參考代碼部分如下。
module div_freq(
iCLK,
iRST_n,
oCLK
);
input wire iCLK;
input wire iRST_n;
output oCLK;
parameter N = 4'd5;
reg clk_p;
reg [3:0] cnt_p;
always @ (posedge iCLK or negedge iRST_n) begin
if (!iRST_n)
cnt_p <= 4'd0;
else if (cnt_p == N - 1)
cnt_p <= 4'd0;
else
cnt_p <= cnt_p + 1'b1;
end
always @ (posedge iCLK or negedge iRST_n) begin
if (!iRST_n)
clk_p <= 1'b0;
else if (cnt_p == (N - 1) / 2)
clk_p <= ~clk_p;
else if (cnt_p == N - 1)
clk_p <= ~clk_p;
else
clk_p <= clk_p;
end
reg clk_n;
reg [3:0] cnt_n;
always @ (negedge iCLK or negedge iRST_n) begin
if (!iRST_n)
cnt_n <= 4'd0;
else if (cnt_n == N - 1)
cnt_n <= 4'd0;
else
cnt_n <= cnt_n + 1'b1;
end
always @ (negedge iCLK or negedge iRST_n) begin
if (!iRST_n)
clk_n <= 1'b0;
else if (cnt_n == (N - 1) / 2)
clk_n <= ~clk_n;
else if (cnt_n == N - 1)
clk_n <= ~clk_n;
else
clk_n <= clk_n;
end
assign oCLK = clk_p | clk_n;
endmodule
之后使用 Modelsim 仿真得到的結果如下圖
小結
從仿真的結果中可以看到其已經實現了奇分頻的功能,其中的分頻倍數可以根據需要自行調整,不過感覺在實際需求中大多用到的也都是偶分頻,奇分頻不常見,但是深入理解了其實現機制對FPGA還是有一定的幫助作用的。