zoukankan      html  css  js  c++  java
  • 校招基础——门电路和加法器

    门电路

    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

     

    --------------------------------------------------------------------------------------
    作者:咸鱼FPGA
    本文版权归作者所有,如需转载请保留此段声明。
  • 相关阅读:
    条件编译
    宏定义
    联合体,枚举类型
    结构体的概念
    C#程序报找不到时区错误
    C# ArrayList和List的区别
    C# 无法将类型为“__DynamicallyInvokableAttribute”的对象强制转换为类型...
    C# readonly与const区别
    C#特性
    Linux vsftpd 安装配置使用
  • 原文地址:https://www.cnblogs.com/xianyufpga/p/13642359.html
Copyright © 2011-2022 走看看