歡迎關注個人公眾號摸魚范式
加法器相關
半加器和全加器的區別在於,是否有進位輸入端,可以直觀地理解為,半加器是兩個一比特相加,而全加器是三個一比特相加,輸出結果和進位信號。
半加器
半加器的真值表如下圖
輸入 | 輸出 | ||
---|---|---|---|
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分頻,使得相位較為均勻。
結構圖可以參考下圖