next up previous
Next: Sobre este documento... Up: Práctica 4. La biblioteca Previous: Testeo de las puertas

Un comparador sencillo de 4 bits

Para practicar el uso de la biblioteca de puertas lógicas vamos a construir un sencillo comparador de 4 bits que sea capaz de decirnos cuándo sus dos buses de entradas de 4 bits almacenan el mismo número binario. Esta tarea puede ser fácilmente determinada si tenemos en cuenta que la puerta NXOR presenta en su salida un 1 si sus dos entradas son iguales y un 0 si son distintas. En este sentido, una puerta NXOR es un comparador de 1 bit. Así, para diseñar un comparador de 4 bits, compararemos todos los bits de los buses usando 4 puertas NXOR y los números allí almacenados serán iguales si las 4 salidas de las puertas son 1. Calculando la función AND de estas salidas habremos calculado la salida del comparador.

Un sencillo programa de simulación (al que llamaremos test_comparador.c) que implementa el comparador descrito puede ser el siguiente:

#include <iostream.h>
#include <iomanip.h>
#include "defs.h"
#include "random.h"
#include "gates.h"

void main() {
  int i;                             // Una variable contador
  WIRE A[4], B[4],                   // Buses de entrada A y B
    C[4],                            // Bus interno, salida de las puertas NXOR
    result;                          // Salida del comparador
  NXOR nxor[4];                      // Declaración de las 4 puertas NXOR
  AND and;                           // Declaración de la puerta AND
  for(int iter=0;iter<400;iter++) {  // 400 iteraciones de simulación
    for(i=0;i<4;i++)
      Random(iter,20,A[i]);          // Generación aleatoria del bus A
    for(i=0;i<4;i++)
      Random(iter,20,B[i]);          // Generación aleatoria del bus B
    for(i=0;i<4;i++)
      nxor[i].run(C[i],A[i],B[i]);   // Simulación de las 4 puertas NXOR
    and.run(result,4,C);             // Simulación de la puerta AND
    for(i=0;i<4;i++)
      cout << setw(4) << (int)A[i];  // Salida por pantalla del bus A
    for(i=0;i<4;i++)
      cout << setw(4) << (int)B[i];  // Salida por pantalla del bus B
    cout << setw(4) <<
      (int)result << '\n';           // Salida por pantalla del resultado
  }
}

En este programa se usa la biblioteca de puertas lógicas gates.h y la biblioteca de generación de bits aleatorios random.h que tiene el siguiente interface:

/*
 * random.h -- Generador de bits aleatorios de cierta duración.
 * gse. 1999.
 */

class RANDOM {
  int duracion_del_semiperiodo;
 public:
  RANDOM(int duracion_del_semiperiodo);
  void run(int iteracion_de_simulacion,
           WIRE &ck);
};

void Random(int iterarion_de_simulacion,
            int duracion_de_la_senhal,
            WIRE &senhal);
y la siguiente implementación (random.c):
#include "defs.h"
#include "random.h"
#include <stdlib.h> // rand()

RANDOM::RANDOM(int duracion_del_semiperiodo) {
  this->duracion_del_semiperiodo = duracion_del_semiperiodo;
}

void RANDOM::run(int iteracion_de_simulacion, WIRE &ck) {
  if(!(iteracion_de_simulacion%duracion_del_semiperiodo)) ck = random()&0xFF;
  if(ck<127) ck=GND; else ck=VCC;
}

void Random(int iter, int duracion, WIRE &o) {
  if(!(iter%duracion)) o = random()&0xFF;
  if(o<127) o=0; else o=255;
}

#ifdef _TEST_
#include <iostream.h>
#include <iomanip.h>
void main() {
  int iter=100;
  WIRE a,b,c;
  RANDOM r0(3), r1(7), r2(11);
  while(iter--) {
    r0.run(iter,a);
    r1.run(iter,b);
    r2.run(iter,c);
    cout << setw(4) << (int)a
         << setw(4) << (int)b
         << setw(4) << (int)c
         << '\n';
  }
}
#endif
Notar que además de la implementación, está escrita una función main() que se encarga de simular la función generadora de bits aleatorios. Si se deseara testear esta función escribir:
c++ -D_TEST_ random.c -o test_random
test_random > 1
gnuplot 3.plt

Evidentemente, el fichero random.o no va a estar disponible, así que para crearlo escribiremos:

c++ -c random.c

De la misma forma, para crear el fichero objeto con la biblioteca de puertas, habría que escribir:

c++ -c gates.c

Para simular el comparador escribiremos:

c++ test_comparador.c gates.o random.o -o test_comparador
test_comparador > 1
gnuplot 9.plt

Como ejercicio, reescribir el código anterior encapsulando la implementación del comparador en una clase. Generar un fichero llamado comparador.h con la declaración de la clase COMPARATOR_4_BIT y un fichero comparador.c con la implementación del método run(). Usar la nueva biblioteca creada para crear un objeto del tipo COMPARATOR_4_BIT en el fichero test2_comparador.c. Por último, comprobar que las salidas de test_comparador.c y test2_comparador.c son idénticas.


next up previous
Next: Sobre este documento... Up: Práctica 4. La biblioteca Previous: Testeo de las puertas
Vicente González Ruiz 2001-10-15