校招基礎——閘電路和加法器
閘電路
1、使用最少數量的兩個輸入與非門設計3輸入與非門?
解析:Y=(ABC)’=((AB)’+C’)=(((AB)’)’C)’=((1(AB)’)’C)’,答案就出來了。
2、分別用兩個輸入的與非門實現OR GATE,AND GATE,畫出門級電路。
分析: 或門,A+B = (A’B’)’=((1A)’(1B)’)’,三個與非門即可。
與門,AB=((AB)’)’,兩個與非門即可。
3、畫出assign out = (a[3:0] != 4’b0001)的閘電路。
a[3:0] == 4’b0001 -> out = 1’b0;
a[3:0] != 4’b0001 -> out = 1’b1;
4、一位比較器的閘電路實現,輸出Y0(>)、Y1(=)、Y2(<)?
5、二選一選擇器的閘電路實現?
6、使用2x1MUX實現2輸入AND門?
7、使用2x1MUX實現D鎖存器?
8、如果只使用2選1mux完成異或邏輯,至少需要幾個mux?
9、比較下面兩個程式碼,利用FF、Mux、Adder、Dcmux
(1)Always @(A or B or C or D) Sum = sel ?(A+B):(C+D) (2)always @(A or B or C or D) begin Switch0 = sel ? A:C; Switch1 = sel ? B:D; end assign sum = Switch0+Switch1;
很明顯第二種比第一種少了一個加法器,資源消耗減少,說明一個好的設計可以減少資源的佔用,提高資源的利用率。
10、相同工藝條件下,下列哪種邏輯的組合邏輯延遲最長(
A、2輸入異或門 B、2輸入與非門
C、2輸入或門 D、1輸入反相器
11、根據 A 的波形,畫出 B、C 的波形,暫存器是同步清0的。
加法器專題
1、加法器分類
(1)半加器;
(2)全加器;
(3)進位延時加法器;
- 行波進位加法器(RCA)
- 超前進位加法器(CLA)
(4)進位保留加法器;
2、半加器和全加器結構
半加器:兩個1位二進位制相加,不考慮低位進位;
全加器:兩個1位二進位制相加,考慮低位進位;
3、行波進位加法器RCA(序列進位加法器、逐位進位加法器)
4、超前進位加法器
5、下圖是一個全加器的電路圖,假設每個門的延時為T,不考慮線延時的扇入扇出,下列說法正確的是(AD)
A)4位Ripple-Carry Adder的最大延時為9T
B)8位Ripple-Carry Adder的最大延時為9T
C)4位Carry-Lookahead Adder的最大延時為3T
D)8位Carry-Lookahead Adder的最大延時為4T
分析:首先明白兩種加法器的結構,首先分析 Ripple-Carry Adder的結構,2bit的R加法器就是兩個R加法器連線起來,如下圖所示:
將這個圖代入題幹,可以得出最大延時是A到Count,然後再一個Cin到Count,即3+2=5,每再添一個R加法器,最長路徑多2個門,因此4位R加法器最大延時為3+2+2+2=9;其次分析Carry-Lookahead Aheader的特點,C加法器的各級進位彼此獨立產生,只與輸入資料和Cin有關,因此超過1位的C加法器,其最大延時都是3位本體最大延時加上1位的進位延時,因此8位的C加法器的最大延時為3+1=4。(很多人分析的是3,他只算了輸入到進位,但我們求的是和,所以得加一)。
6、加法器程式碼
//-------------------------------------------------------- //-- 半加器 //-------------------------------------------------------- module HALF_ADDER ( input wire a, input wire b, output reg s, output reg c ); always@(*)begin c = a & b; s = a ^ b; end endmodule //-------------------------------------------------------- //-- 全加器 //-------------------------------------------------------- module FULL_ADDER ( input wire ai, input wire bi, input wire ci, output reg s, output reg co ); wire gi; wire pi; wire pi_ci; wire si; HALF_ADDER U_HALF_ADDER_0 ( .a (ai ), .b (bi ), .c (gi ), .s (pi ) ); HALF_ADDER U_HALF_ADDER_1 ( .a (ci ), .b (pi ), .c (pi_ci ), .s (si ) ); always@(*)begin co = pi_ci | gi; s = si; end endmodule //-------------------------------------------------------- //-- 行波進位加法器 //-------------------------------------------------------- module RCA #( parameter N = 4) ( input wire [N-1:0] ai, input wire [N-1:0] bi, input wire ci, output wire [N-1:0] s, output wire co ); reg [N-1:0] ci_t; wire [N-1:0] co_t; always@(*)begin:ci_gen integer n; for(n = 0; n < N; n = n + 1)begin if(n == 0) ci_t[n] = ci; else ci_t[n] = co_t[n-1]; end end assign co = co_t[N-1]; genvar i; generate for(i = 0; i < N; i = i + 1)begin:rca_g FULL_ADDER U_FULL_ADDER ( .ai (ai[i] ), .bi (bi[i] ), .ci (ci_t[i] ), .co (co_t[i] ), .s (s[i] ) ); end endgenerate endmodule //-------------------------------------------------------- //-- 超前進位加法器 //-------------------------------------------------------- module CLA #( parameter N = 4) ( input wire [N-1:0] ai, input wire [N-1:0] bi, input wire ci, output reg [N-1:0] s, output reg co ); reg [N:0] c; reg [N:1] st; reg [N:1] g; reg [N:1] p; reg [N:1] a; reg [N:1] b; reg gp; reg gg; always@(*)begin s = st; a = ai; b = bi; co = c[N]; end always@(*)begin:cla_gen integer i; gp = 1; gg = 0; c[0] = ci; for(i=1; i<=N; i=i+1)begin g[i] = a[i] & b[i]; p[i] = a[i] ^ b[i]; gp = p[i] & gp; gg = g[i] + (p[i] & gg); c[i] = gg | (gp & c[i-1]); st[i] = p[i] ^ c[i-1]; end end endmodule