1. 程式人生 > 實用技巧 >校招基礎——閘電路和加法器

校招基礎——閘電路和加法器

閘電路

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] != 4b0001)的閘電路。

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如果只使用21mux完成異或邏輯,至少需要幾個mux

9比較下面兩個程式碼,利用FFMuxAdderDcmux

等元件畫出對應的框圖,並比較這兩個設計的不同以及優劣(注意:不要對加法器等進行細化處理,只要利用現有的模組,如DFFAdder、減法器等)

1)Always @(A or B or C or D)

Sum = sel ?(A+B):(C+D)

(2always @(A or B or C or D) begin

Switch0 = sel ? A:C;

Switch1 = sel ? B:D;

end

assign sum = Switch0+Switch1;

很明顯第二種比第一種少了一個加法器,資源消耗減少,說明一個好的設計可以減少資源的佔用,提高資源的利用率。

10、相同工藝條件下,下列哪種邏輯的組合邏輯延遲最長(

A

A、2輸入異或門 B、2輸入與非門

C、2輸入或門 D、1輸入反相器

11、根據 A 的波形,畫出 B、C 的波形,暫存器是同步清0的。

加法器專題

1、加法器分類

(1)半加器;

(2)全加器;

(3)進位延時加法器;

  1. 行波進位加法器(RCA
  2. 超前進位加法器(CLA

(4)進位保留加法器;

2、半加器和全加器結構

半加器:兩個1位二進位制相加,不考慮低位進位;

全加器:兩個1位二進位制相加,考慮低位進位;

3、行波進位加法器RCA(序列進位加法器、逐位進位加法器)

4、超前進位加法器

5、下圖是一個全加器的電路圖,假設每個門的延時為T,不考慮線延時的扇入扇出,下列說法正確的是(AD

A)4Ripple-Carry Adder的最大延時為9T

B)8Ripple-Carry Adder的最大延時為9T

C)4Carry-Lookahead Adder的最大延時為3T

D)8Carry-Lookahead Adder的最大延時為4T

分析:首先明白兩種加法器的結構,首先分析 Ripple-Carry Adder的結構,2bitR加法器就是兩個R加法器連線起來,如下圖所示:

將這個圖代入題幹,可以得出最大延時是ACount,然後再一個CinCount,即3+2=5,每再添一個R加法器,最長路徑多2個門,因此4R加法器最大延時為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