備戰秋招[一]-加法器與分頻器


歡迎關注個人公眾號摸魚范式

加法器相關

半加器和全加器的區別在於,是否有進位輸入端,可以直觀地理解為,半加器是兩個一比特相加,而全加器是三個一比特相加,輸出結果和進位信號。

半加器

半加器的真值表如下圖

輸入 輸出
A B C S
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

其邏輯表達式為

根據邏輯表達式,可以使用如下門電路實現

全加器

全加器真值表如下

輸入 輸出
A B Ci C S
0 0 0 0 0
0 1 0 0 1
1 0 0 0 1
1 1 0 1 0
0 0 1 1 0
0 1 1 1 0
1 0 1 1 0
1 1 1 1 1

其邏輯表達式為:

使用門電路搭建

使用加法器計算7bit中1的數量,最少用幾個?

有7個1bit的數,為他們編號,從b0到b6,一共七個。

使用1bit全加器可以將3個bit相加,得到2bit的結果,那么b0,b1,b2使用一個加法器,b3,b4,b5使用一個加法器。

現在7個1bit變成了2個2bit和一個1bit(b6)。

然后使用一個2bit全加器將兩個2bit數進行相加,1bit的b6作為進位輸入。相加后結果為3位,最大可以表示到7個1bit。

而2bit全加器可以有2個1bit全加器組成,所以一共使用4個1bit全加器可以完成1的數量的統計。

行波進位加法器

以4bit的行波進位加法器為例,需要使用4個1bit加法器實現,如下圖所示。在進行加法運算時,首先准備好的是1號全加器的3個input。而2、3、4號全加器的Cin全部來自前一個全加器的Cout,只有等到1號全加器運算完畢,2、3、4號全加器才能依次進行進位運算,最終得到結果。 這樣進位輸出,像波浪一樣,依次從低位到高位傳遞, 最終產生結果的加法器,也因此得名為行波進位加法器(Ripple-Carry Adder,RCA)。

如果將全加器內部打開,我們可以看到,關鍵路上有9個門,門延遲非常高

超前進位加法器

為了改進行波僅為加法器的延遲問題,可以將全加器的進位信號轉化為有G和P以及本級進位輸入組成的邏輯。如下圖

將四個加法器串聯,迭代可以得到

可以看到,每一級的進位都不依賴於上一級的進位,因此不需要等待上一個加法器完成計算,超前得到進位結果。同時,顯然如果要實現大位寬加法器,邏輯將會變得更加復雜。

通過超前進位的方法,實現四位全加器的原理圖如下

單bit全加器的輸出改為輸出P、G和S,而每一級的進位可以有下方的邏輯得到。因此最終延遲位4個門。

對比行波進位加法器(RCA)和超前進位加法器(CLA)

- RCA CLA
結構特點 低位全加器的Cout連接到高一位全加器Cin 每個全加器的進位輸入並不來自於前一級的全加器,而是來自超前進位的邏輯
優點 電路布局簡單,設計方便 計算Ci+1的延遲時間固定為三級門延遲,與加法器的位數無關
缺點 高位的運算必須等待低位的運算完成,延遲時間長 如果進一步拓寬加法器的位數,則電路變得非常復雜

分頻電路相關

偶數分頻

偶數分頻器的實現簡單,用計數器在上升沿或者下降沿計數,當計數器的值等於分頻系數的一半或等於分頻系數時,信號翻轉。偶數分頻器分頻原理如下圖所示:

上圖的的分頻系數是4,就是4分頻。電路原理是用一個上升沿計數的計數器,每次計數到2時輸出信號clkout翻轉一次,每次計數到4時clkout再翻轉一次,一直周期重復下去。其他的偶數分頻器原理也是一樣。

如果偶數分頻系數是2的冪,就可以用2分頻器級聯得到;例如4分頻就是兩個2分頻級聯,下圖就是用兩個2分頻器級聯得到4分頻器。

奇數分頻

如果不要求占空比為50%的話,也比較容易實現,如進行三分頻,通過待分頻時鍾上升沿觸發計數器進行模三計數,當計數器計數到鄰近值進行兩次翻轉,比如可以在計數器計數到1時,輸出時鍾進行翻轉,計數到2時再次進行翻轉。即在計數值在鄰近的1和2進行了兩次翻轉。這樣實現的三分頻占空比為1/3或者2/3。

對於實現占空比為50%的N倍奇數分頻,可以分解為兩個通道:

  • 上升沿觸發進行模N計數,計數選定到某一個值進行輸出時鍾翻轉,然后經過(N-1)/2再次進行翻轉得到一個占空比為非50%奇數N分頻時鍾
  • 下降沿觸發進行模N計數,到和上升沿觸發輸出時鍾翻轉選定值相同值時,進行輸出時鍾時鍾翻轉,同樣經過(N-1)/2時,輸出時鍾再次翻轉生成占空比非50%的奇數N分頻時鍾

將這兩個占空比非50%的N分頻時鍾或運算,得到占空比為50%的奇數n分頻時鍾

具體例子:5分頻等占空比,可以通過待分頻時鍾下降沿和上升沿觸發0~4計數,

  • 對於待分頻時鍾的上升沿,當計數器cnt1計數到1時,clk_p翻轉;當計數器計數到3(1 + (5 - 1) / 2 = 3)時,clk_p再次反轉;
  • 對於待分頻時鍾的下降沿,當計數器cnt2計數到1時,clk_n翻轉;當計數器計數到3(1 + (5 - 1) / 2 = 3)時,clk_n再次反轉;
  • 然后下降沿產生的5分頻時鍾和上升沿產生的5分頻時鍾進行運算,即可得到占空比為50%的N分頻時鍾。

這種方法可以實現任意的奇數分頻。

下面給出5分頻的具體代碼:

`timescale 1ns/1ps 

module CLK_DIV5(
    input   clk_i,
    input   rst_n,
    output  clk_o
    );
    reg [2:0] cnt1,cnt2;
    reg clk_p,clk_n;
           
//*********************
//MAIN CORE
//*********************        
always @(posedge clk_i,negedge rst_n)
    if(!rst_n) begin
        cnt1 <= 3'b0;
        clk_p <= 1'b0;
    end 
    else begin
        if(cnt1 == 3'b100) begin
            cnt1 <= 3'b0;
            clk_p <= clk_p;
        end
        else begin
            cnt1 <= cnt1 + 1'b1;
            if(cnt1 == 3'b1 || cnt1 == 3'b11)
                clk_p <= ~clk_p;
        end
    end

always @(negedge clk_i,negedge rst_n)
    if(!rst_n) begin
        cnt2 <= 3'b0;
        clk_n <= 1'b0;
    end 
    else begin
        if(cnt2 == 3'b100) begin
            cnt2 <= 3'b0;
            clk_n <= clk_n;
        end
        else begin
            cnt2 <= cnt2 + 1'b1;
            if(cnt2 == 3'b1 || cnt2 == 3'b11)
                clk_n <= ~clk_n;
        end
    end
    
    assign clk_o = clk_p | clk_n;
endmodule

分數分頻

對於要求相位以及占空比嚴格的分數分頻(小數分頻),建議采用模擬電路實現。而使用數字電路實現只能保證盡量均勻,在長時間內進行分頻。

對於一個分數,把他它分為整數部分和小數部分的形式。例如N=M.D>1分頻,分為整數M和小數D,我們使用M分頻和M+1分頻來構成M.D分頻。

設M分頻的次數為N1,M+1分頻的次數為N2。

將M分頻進行N1次和M+1分頻進行N2次,那么在M*N1+(M+1)*N2個周期內,整體可以看作(M*N1+(M+1)*N2)/(N1+N2)=N分頻。

可以通過均勻分布M分頻和M+1分頻,使得相位較為均勻。

結構圖可以參考下圖


免責聲明!

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



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