[原創]FPGA 實現任意時鍾分頻


有時在基本模塊的設計中常常會使用到時鍾分頻,時鍾的偶分頻相對奇分頻來說比較簡單易於理解,但是奇分頻的理念想透徹后也是十分簡單的,本文就針對奇分頻做一個記錄並列出了 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 仿真得到的結果如下圖

Modelsim仿真

小結

從仿真的結果中可以看到其已經實現了奇分頻的功能,其中的分頻倍數可以根據需要自行調整,不過感覺在實際需求中大多用到的也都是偶分頻,奇分頻不常見,但是深入理解了其實現機制對FPGA還是有一定的幫助作用的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM