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.