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