next up previous
Next: alu32.c Up: Práctica 13. La unidad Previous: Práctica 13. La unidad

alu32.h

/*
 * alu32.h -- Unidad Aritmético-lógica de 32 bits.
 * Ultima modificación: 14-11-00.
 * gse.
 */

/*
 * Sumador de 1 bit.
 *
 *             carry_in
 *                |                          carry_in a b |sum carry_out
 *                |                          -------------+-------------
 *                |  +---+                          0 0 0 |  0 0
 *    a ----+-----|--|AND|____t0                    0 0 1 |  1 0
 *          |     +--|a0 |    |                     0 1 0 |  1 0
 *          |     |  +---+    |  +---+              0 1 1 |  0 1
 *          |     |  +---+ t1 +--|OR |              1 0 0 |  1 0
 *    b ----|--+--|--|AND|__-----| o |---+          1 0 1 |  0 1
 *          |  |  +--|a1 |    +--|   |   |          1 1 0 |  0 1
 *          |  |  |  +---+    |  +---+   |          1 1 1 |  1 1
 *          |  |  |  +---+    |          |
 *          |  +--|--|AND|____|          |
 *          +--|--|--|a2 |    t2         |
 *          |  |  |  +---+               |
 *          |  |  |  +---+               |
 *          |  +--|--|XOR|____           |
 *          +-----|--|x0 | t3 | +---+    |
 *                |  +---+    +-|XOR|____|____ sum
 *                +-------------|x1 |    |
 *                              +---+    |
 *                                   carry_out
 */
class ADDER_BIT {
  WIRE t[4];
  AND a0,a1,a2;
  XOR x0,x1;
  OR o;
  
 public:
  void run(WIRE &a, WIRE &b,     // Entradas de datos
           WIRE &carry_in,       // Acarreo de entrada
           WIRE &sum,            // Resultado de la suma
           WIRE &carry_out);     // Acarreo de salida
};

/*
 * ALU de 1 bit.
 *
 *      binvert                carry_in       op
 *         |                       |          |
 * less ---|-----------------------|--+       |
 *         |                +---+  |  |       /2
 *    a ---|-------------+--|AND|__|__|__     |
 *         |          +--|--|and|  |  |  |    |
 *         |          |  |  +---+  |  |  |  +-+-
 *         |          |  |  +---+  |  |  +--|i0  \
 *         |          |  +--|OR |__|__|_____|i1   \
 *         |          +--|--| or|  |  |     |  mux +- res
 *         |          |  |  +---+  |  |  +--|i2   /
 *         |          |  |    +----+  +--|--|i3  /
 *         |          |  |    |          |  +---
 *         |          |  |  +---+        |
 *         |  +---+   |  +--| + |________|   less=i3
 *         +--|XOR|___+-----|sum|  
 *    b ------|xor|    t    +---+
 *            +---+           |
 *                        carry_out
 *  binvert op | res
 *  -----------+------
 *        0 00 | a and b
 *        0 01 | a  or b
 *        0 10 | a add b
 *        0 11 | less
 *        1 00 | a and (not b)
 *        1 01 | a  or (not b)
 *        1 10 | a sub b (si carry_in=1)
 *        1 11 | less
 */
class ALU_BIT {
  WIRE t,               // Salida de la puerta XOR
    i[4];               // Entradas del multiplexor
  XOR xor;
  OR or;
  AND and;
  ADDER_BIT sum;
  MUX_4_1 mux;

public:
  void run(WIRE &a, WIRE &b,    // Bits de datos
           WIRE &binvert,       // Complemento de la línea "b"
           WIRE &carry_in,      // Acarreo de entrada
           WIRE op[2],          // Operación de la ALU
           WIRE &less,          // Entrada directa a la salida
           WIRE &res,           // Resultado de la ALU
           WIRE &carry_out);    // Acarreo de salida
};

/*
 * ALU-MSb de 1 bit.
 *
 *      binvert                carry_in       op
 *         |                       |          |
 * less ---|-----------------------|--+       |
 *         |                +---+  |  |       /2
 *    a ---|-------------+--|AND|__|__|__     |
 *         |          +--|--|and|  |  |  |    |
 *         |          |  |  +---+  |  |  |  +-+-
 *         |          |  |  +---+  |  |  +--|i0  \
 *         |          |  +--|OR |__|__|_____|i1   \
 *         |          +--|--| or|  |  |     |  mux +-------- res
 *         |          |  |  +---+  |  |  +--|i2   /
 *         |          |  |    +----+  +--|--|i3  /
 *         |          |  |    |    |     |  +---
 *         |          |  |  +---+  |     |        +---+
 *         |  +---+   |  +--| + |__|_____+--------|XOR|_____ set
 *         +--|XOR|___+-----|sum|  |           +--| x1|
 *    b ------|xor|    t    +---+  |    +---+  |  +---+
 *            +---+           |    +----|XOR|__|____________ overflow
 *                            +---------| x0|
 *                            |         +---+
 *                        carry_out
 */
class ALU_MSBIT {
  WIRE t,               // Salida de la puerta XOR
    i[4];               // Entradas del multiplexor
  XOR xor;
  OR or;
  AND and;
  ADDER_BIT sum;
  MUX_4_1 mux;
  XOR x0,x1;

public:
  void run(WIRE &a, WIRE &b,
           WIRE &binvert,
           WIRE &carry_in,
           WIRE op[2],
           WIRE &less,
           WIRE &res,
           WIRE &carry_out,
           WIRE &set,
           WIRE &overflow);
};

/*
 * ALU de 32 bits ripple-carry.
 *
 *      bnegate                                     op[2]
 *         |                                          |
 *         +------+--------------+           +--------+
 *         |      |              |           |        |
 *         | +----+--------------+-----------+------+ |
 *         | | binvert      carry_in        op      | |
 *         | |                                      | |
 *       +---+ less                                 | |
 *       | | |                ALU[0]                | |
 *  a[0]-----+ a                                res +----+------ res[0]
 *       | | |                                      | |  |
 *  b[0]-----+ b                                    | |  |
 *       | | |               carry_out              | |  |
 *       | | +-------------------+------------------+ |  |
 *       | |                     |                    |  |
 *       | +------+              | c[0]      +--------+  |
 *       | |      |              |           |        |  |
 *       | | +----+--------------+-----------+------+ |  |
 *       | | | binvert      carry_in        op      | |  |
 *       | | |                                      | |  |
 *    0 -----+ less                                 | |  |
 *       | | |                ALU[1]                | |  |
 *  a[1]-----+ a                                res +-----+----- res[1]
 *       | | |                                      | |  ||
 *  b[1]-----+ b                                    | |  ||
 *       | | |               carry_out              | |  ||
 *       | | +-------------------+------------------+ |  ||
 *       : :                     : c[1]               :  ::
 *       | +------+              |           +--------+  ||
 *       |        |              | c[30]     |           ||            
 *       |   +----+--------------+-----------+------+    ||
 *       |   | binvert      carry_in        op      |    ||
 *       |   |                                      |    ||
 *    0 -----+ less                             set +-+  ||
 *       |   |                ALU[31]               | |  ||
 * a[31]-----+ a                                res +--------+-- res[31]
 *       |   |                                      | |  ||..|
 * b[31]-----+ b                           overflow +----------- overflow
 *       |   |               carry_out              | |  ||..|
 *       |   +-------------------+------------------+ |  ||..|
 *       |less                   |                    |  ||..|
 *       +--------------------------------------------+  ||..|
 *                               |                       ||..|
 *                           carry_out                 +-++..+-+
 *                                                     |  NOR  |
 *                                                     |  zero |
 *                                                     +---+---+
 *                                                         |
 *                                                       zero
 *        bnegate oper | output
 *        -------------+----------
 *            * 0   00 | A and B
 *            * 0   01 | A or B
 *            * 0   10 | A add B
 *              0   11 | 000...0A donde A = overflow XOR sum[MSb]
 *              1   00 | A and (not B)
 *              1   01 | A or (not B)
 *            * 1   10 | A sub B = A add ((not B) + 1)
 *            * 1   11 | (A<B)
 *
 *            * -> Operaciones normalmente útiles
 */

class ALU_32BIT_RC {
  WIRE c[31];                // Bits de acarreo entre ALU's de 1 bit
  WIRE less;                 // Bit de realimentación del MSb al LSb
  ALU_BIT alu[31];           // ALU's menos significativas
  ALU_MSBIT alu31;           // La ALU más significativa
  NOR nor;                   // Cálculo del zero
 public:
  void run(WIRE a[32], WIRE b[32],    // Buses de datos de entrada
           WIRE &bnegate, WIRE op[2], // Entradas de control de operación
           WIRE res[32],              // Bus de datos de salida
           WIRE &overflow,            // Overflow en la operación
           WIRE &carry_out,           // Acarreo de salida de la ALU
           WIRE &zero);               // El resultado es cero
};

/*******************************************************************
 * Jose Domingo Alvarez Hervas.
 * Laboratorio de Arquitectura: 1999-2000.
 * ALU de 32 bits con Carry-Look-Ahead.
 */

class ADDER_BIT_CLA {
  WIRE t;
  XOR x0,x1;
  
 public:
  void run(WIRE &a, WIRE &b,     // Entradas de datos
           WIRE &carry_in,       // Acarreo de entrada
           WIRE &sum);           // Resultado de la suma
};

class ALU_BIT_CLA {
  WIRE t,               // Salida de la puerta XOR
    i[4];               // Entradas del multiplexor
  XOR xor;
  OR or;
  AND and;
  ADDER_BIT_CLA sum;
  MUX_4_1 mux;

public:
  void run(WIRE &a, WIRE &b,    // Bits de datos
           WIRE &binvert,       // Complemento de la línea "b"
           WIRE &carry_in,      // Acarreo de entrada
           WIRE op[2],          // Operación de la ALU
           WIRE &less,          // Entrada directa a la salida
           WIRE &res);          // Resultado de la ALU
};

class ALU_32BIT_CLA {
  XOR xoraux[31];            // Con esto se si utilizo b o b negada para calcular los gi y pi
  WIRE salida[31];           // Salida de las puestas anteriores
  AND andg[31];              // Para calcular los gi
  WIRE g[31];                // Las lineas que llevan los gi    
  OR orp[31];                // Para calcular los pi
  WIRE p[31];                // Las lineas que llevan los pi
  AND andaux[496];           // Puertas AND auxiliares para calcular los carry
  WIRE aux[496];             // Salidas de las puertas AND
  OR oraux[31];              // Puertas OR auxiliares para calcular los carry
  WIRE c[31];                // Lineas de salida de las puertas OR anteriores
  WIRE less;                 // Bit de realimentación del MSb al LSb
  ALU_BIT_CLA alu[31];       // ALU's menos significativas
  ALU_MSBIT alu31;           // La ALU más significativa
  NOR nor;                   // Cálculo del zero

 public:
  void run(WIRE a[32], WIRE b[32],    // Buses de datos de entrada
           WIRE &bnegate, WIRE op[2], // Entradas de control de operación
           WIRE res[32],              // Bus de datos de salida
           WIRE &overflow,            // Overflow en la operación
           WIRE &carry_out,           // Acarreo de salida de la ALU
           WIRE &zero);               // El resultado es cero

};




2000-11-16