分頻電路實現


1.整數分頻電路,無占空比要求

   對於偶數,N分頻電路,只需實現一個N/2個狀態的計數器即可,觸發器 采到計數器為N/2-1時,將clk_out取反。

 

  對於奇數,N分頻電路,可用狀態機實現,前幾個狀態輸出0,后幾個狀態輸出1;也可用計數器實現,比如7分頻電路,計數器從0到6循環計數,觸發器采到2和6時,將clk_out取反。

 

2.整數分頻電路,50%占空比

  對於偶數,保證50%占空比很簡單。

  對於奇數,N分頻時鍾,可用兩個差90°相位的2N分頻時鍾異或得到。如3分頻時鍾,可以用兩個6分頻的時鍾異或得到,如何保證兩個6分頻時鍾相位差為90°呢?也很簡單,先生成一個上升沿觸發的計數器cnt,第一個時鍾clk1使用上升沿觸發器產生,當觸發器采到cnt為2或5時,將clk1取反;第二個時鍾使用下降沿觸發器產生,當觸發器采到cnt為1或4時,將clk2取反。這樣便得到了兩個差90°相位的6分頻時鍾,如下圖所示。

3.小數分頻

 如3.5分頻電路,意味着7個周期產生2個對稱的脈沖,生成一個可以簡單划分下前1.5個周期輸出1(0),1.5~3.5輸出0(1),3.5~5輸出1(0),5~7輸出0(1),那么怎么去實現半個周期呢?,可以注意到上升沿和下降沿就差半個周期。我們生成一個7bit的上升沿的環形計數器,那么cnt[0]就可以實現第一個時鍾周期輸出1(0),前面的分析說到要在前1.5個時鍾周期輸出0(1),那剩下0.5個時鍾周期怎么實現呢?我們產生一個下降沿觸發的clk1,讓clk1在采到cnt[0]為1時輸出1,其他情況輸出0. 再cnt[0]和clk1相或,就可以得到前1.5個周期clk_out輸出1,其他輸出0;同樣的方法對3.5~5這1.5個周期進行同樣處理,就可以讓clk_out在這1.5個周期輸出1。最終得到了3.5分頻的時鍾。此種方法還可以用來得到前面的50%占空比的奇數分頻時鍾。

代碼如下:

module main (
);
    reg clk,rst;
    initial begin
        clk = 1'b0;
        forever #5 clk = ~clk;
    end

    initial begin
        rst = 1'b1;
        #20 rst = 1'b0;
        #1000;
        $finish;
    end

    reg clk_p_div6,clk_n_div6;
    wire clk_div;
    reg [6:0] cnt;
    reg clk1;

    always @(posedge clk ) begin
        if (rst) begin
            cnt <= 7'b0000001;
        end
        else begin
            cnt <= {cnt[5:0],cnt[6]};
        end
    end

    always @(negedge clk ) begin
        if (rst) begin
            clk1 <= 1'b0;
        end
        else if (cnt == 7'b0000001 || cnt==7'b0001000) begin
            clk1 <= 1'b1;
        end
        else begin
            clk1 <= 1'b0;
        end
    end

    assign clk_div = cnt[0] | clk1 | cnt[4];

endmodule


免責聲明!

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



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