加法器相關(guān)
半加器和全加器的區(qū)別在于,是否有進位輸入端,可以直觀地理解為,半加器是兩個一比特相加,而全加器是三個一比特相加,輸出結(jié)果和進位信號。
?
半加器
半加器的真值表如下圖
輸入 | 輸出 | ||
A | B | C | S |
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
其邏輯表達式為
根據(jù)邏輯表達式,可以使用如下門電路實現(xiàn)
全加器
全加器真值表如下
輸入 | 輸出 | |||
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 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
其邏輯表達式為:
使用門電路搭建
?
使用加法器計算 7bit 中 1 的數(shù)量,最少用幾個?
有 7 個 1bit 的數(shù),為他們編號,從 b0 到 b6,一共七個。
使用 1bit 全加器可以將 3 個 bit 相加,得到 2bit 的結(jié)果,那么 b0,b1,b2 使用一個加法器,b3,b4,b5 使用一個加法器。
現(xiàn)在 7 個 1bit 變成了 2 個 2bit 和一個 1bit(b6)。
然后使用一個 2bit 全加器將兩個 2bit 數(shù)進行相加,1bit 的 b6 作為進位輸入。相加后結(jié)果為 3 位,最大可以表示到 7 個 1bit。
而 2bit 全加器可以有 2 個 1bit 全加器組成,所以一共使用 4 個 1bit 全加器可以完成 1 的數(shù)量的統(tǒng)計。
?
行波進位加法器
以 4bit 的行波進位加法器為例,需要使用 4 個 1bit 加法器實現(xiàn),如下圖所示。在進行加法運算時,首先準備好的是 1 號全加器的 3 個 input。而 2、3、4 號全加器的 Cin 全部來自前一個全加器的 Cout,只有等到 1 號全加器運算完畢,2、3、4 號全加器才能依次進行進位運算,最終得到結(jié)果。這樣進位輸出,像波浪一樣,依次從低位到高位傳遞, 最終產(chǎn)生結(jié)果的加法器,也因此得名為行波進位加法器(Ripple-Carry Adder,RCA)。
如果將全加器內(nèi)部打開,我們可以看到,關(guān)鍵路上有 9 個門,門延遲非常高
?
超前進位加法器
為了改進行波僅為加法器的延遲問題,可以將全加器的進位信號轉(zhuǎn)化為 G 和 P 以及本級進位輸入組成的邏輯。如下圖
將四個加法器串聯(lián),迭代可以得到
可以看到,每一級的進位都不依賴于上一級的進位,因此不需要等待上一個加法器完成計算,超前得到進位結(jié)果。同時,顯然如果要實現(xiàn)大位寬加法器,邏輯將會變得更加復(fù)雜。
通過超強進位的方法,實現(xiàn)四位全加器的原理圖如下
單 bit 全加器的輸出改為輸出 P、G 和 S,而每一級的進位可以有下方的邏輯得到。因此最終延遲為 4 個門。
對比行波進位加法器(RCA)和超前進位加法器(CLA)
- | RCA | CLA |
結(jié)構(gòu)特點 | 低位全加器的 Cout 連接到高一位全加器 Cin | 每個全加器的進位輸入并不來自于前一級的全加器,而是來自超前進位的邏輯 |
優(yōu)點 | 電路布局簡單,設(shè)計方便 | 計算 Ci+1 的延遲時間固定為三級門延遲,與加法器的位數(shù)無關(guān) |
缺點 | 高位的運算必須等待低位的運算完成,延遲時間長 | 如果進一步拓寬加法器的位數(shù),則電路變得非常復(fù)雜 |
?
分頻電路相關(guān)
偶數(shù)分頻
偶數(shù)分頻器的實現(xiàn)簡單,用計數(shù)器在上升沿或者下降沿計數(shù),當(dāng)計數(shù)器的值等于分頻系數(shù)的一半或等于分頻系數(shù)時,信號翻轉(zhuǎn)。偶數(shù)分頻器分頻原理如下圖所示:
上圖的的分頻系數(shù)是 4,就是 4 分頻。電路原理是用一個上升沿計數(shù)的計數(shù)器,每次計數(shù)到 2 時輸出信號 clkout 翻轉(zhuǎn)一次,每次計數(shù)到 4 時 clkout 再翻轉(zhuǎn)一次,一直周期重復(fù)下去。其他的偶數(shù)分頻器原理也是一樣。
如果偶數(shù)分頻系數(shù)是 2 的冪,就可以用 2 分頻器級聯(lián)得到;例如 4 分頻就是兩個 2 分頻級聯(lián),下圖就是用兩個 2 分頻器級聯(lián)得到 4 分頻器。
?
奇數(shù)分頻
如果不要求占空比為 50%的話,也比較容易實現(xiàn),如進行三分頻,通過待分頻時鐘上升沿觸發(fā)計數(shù)器進行模三計數(shù),當(dāng)計數(shù)器計數(shù)到鄰近值進行兩次翻轉(zhuǎn),比如可以在計數(shù)器計數(shù)到 1 時,輸出時鐘進行翻轉(zhuǎn),計數(shù)到 2 時再次進行翻轉(zhuǎn)。即在計數(shù)值在鄰近的 1 和 2 進行了兩次翻轉(zhuǎn)。這樣實現(xiàn)的三分頻占空比為 1/3 或者 2/3。
對于實現(xiàn)占空比為 50%的 N 倍奇數(shù)分頻,可以分解為兩個通道:
?上升沿觸發(fā)進行模 N 計數(shù),計數(shù)選定到某一個值進行輸出時鐘翻轉(zhuǎn),然后經(jīng)過(N-1)/2 再次進行翻轉(zhuǎn)得到一個占空比為非 50%奇數(shù) N 分頻時鐘;?下降沿觸發(fā)進行模 N 計數(shù),到和上升沿觸發(fā)輸出時鐘翻轉(zhuǎn)選定值相同值時,進行輸出時鐘時鐘翻轉(zhuǎn),同樣經(jīng)過(N-1)/2 時,輸出時鐘再次翻轉(zhuǎn)生成占空比非 50%的奇數(shù) N 分頻時鐘。
將這兩個占空比非 50%的 N 分頻時鐘或運算,得到占空比為 50%的奇數(shù) n 分頻時鐘。
具體例子:5 分頻等占空比,可以通過待分頻時鐘下降沿和上升沿觸發(fā) 0~4 計數(shù),
?對于待分頻時鐘的上升沿,當(dāng)計數(shù)器 cnt1 計數(shù)到 1 時,clk_p 翻轉(zhuǎn);當(dāng)計數(shù)器計數(shù)到 3(1 + (5 - 1) / 2 = 3)時,clk_p 再次反轉(zhuǎn);?對于待分頻時鐘的下降沿,當(dāng)計數(shù)器 cnt2 計數(shù)到 1 時,clk_n 翻轉(zhuǎn);當(dāng)計數(shù)器計數(shù)到 3(1 + (5 - 1) / 2 = 3)時,clk_n 再次反轉(zhuǎn);?然后下降沿產(chǎn)生的 5 分頻時鐘和上升沿產(chǎn)生的 5 分頻時鐘進行或運算,即可得到占空比為 50%的 N 分頻時鐘。
這種方法可以實現(xiàn)任意的奇數(shù)分頻。
下面給出 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
?
分數(shù)分頻
對于要求相位以及占空比嚴格的分數(shù)分頻(小數(shù)分頻),建議采用模擬電路實現(xiàn)。而使用數(shù)字電路實現(xiàn)只能保證盡量均勻,在長時間內(nèi)進行分頻。
對于一個分數(shù),把他它分為整數(shù)部分和小數(shù)部分的形式。例如 N=M.D>1 分頻,分為整數(shù) M 和小數(shù) D,我們使用 M 分頻和 M+1 分頻來構(gòu)成 M.D 分頻。
設(shè) M 分頻的次數(shù)為 N1,M+1 分頻的次數(shù)為 N2。
將 M 分頻進行 N1 次和 M+1 分頻進行 N2 次,那么在 M*N1+(M+1)*N2 個周期內(nèi),整體可以看作(M*N1+(M+1)*N2)/(N1+N2)=N 分頻。
可以通過均勻分布 M 分頻和 M+1 分頻,使得相位較為均勻。
結(jié)構(gòu)圖可以參考下圖