next up previous
Next: Un comparador sencillo de Up: La biblioteca de puertas Previous: La implementación gates.c

Testeo de las puertas lógicas test_gates.c

El fichero test_gates.c contiene una serie de funciones main() que simulan cada una de las puertas lógicas.
#include <iostream.h>
#include <iomanip.h>
#include "defs.h"
#include "clock.h"
#include "gates.h"

#ifdef _NOT_
void main() {
  int iter=30;
  WIRE a,b;
  NOT gate;
  CLOCK ck(5);
  while(iter--) {
    ck.run(iter,a);
    gate.run(b,a);
    cout << setw(4) << (int)a
         << setw(4) << (int)b
         << '\n';
  }
}
#endif

#ifdef _AND_
void main() {
  int iter=100;
  WIRE a=GND,b=GND,c=GND;
  AND gate;
  CLOCK ck0(3), ck1(7);
  while(iter--) {
    ck0.run(iter,a);
    ck1.run(iter,b);
    gate.run(c,a,b);
    cout << setw(4) << (int)a
         << setw(4) << (int)b
         << setw(4) << (int)c
         << '\n';
  }
}
#endif

#ifdef _AND3_
void main() {
  int iter=100;
  WIRE i[3],o;
  AND gate;
  i[0] = i[1] = i[2] = GND;
  CLOCK ck0(8), ck1(10), ck2(13);
  while(iter--) {
    ck0.run(iter,i[0]);
    ck1.run(iter,i[1]);
    ck2.run(iter,i[2]);
    gate.run(o,3,i);
    cout << setw(4) << (int)i[0]
         << setw(4) << (int)i[1]
         << setw(4) << (int)i[2]
         << setw(4) << (int)o
         << '\n';
  }
}
#endif

#ifdef _AND3b_
void main() {
  int iter=100;
  WIRE i0,i1,i2,o;
  AND gate;
  CLOCK ck0(8), ck1(10), ck2(13);
  i0 = i1 = i2 = o = GND;
  while(iter--) {
    ck0.run(iter,i0);
    ck1.run(iter,i1);
    ck2.run(iter,i2);
    gate.run(o,3,i0,i1,i2);
    cout << setw(4) << (int)i0
         << setw(4) << (int)i1
         << setw(4) << (int)i2
         << setw(4) << (int)o
         << '\n';
  }
}
#endif

#ifdef _OR_
void main() {
  int iter=100;
  WIRE a=GND,b=GND,c=GND;
  OR gate;
  CLOCK ck0(8), ck1(10);
  while(iter--) {
    ck0.run(iter,a);
    ck1.run(iter,b);
    gate.run(c,a,b);
    cout << setw(4) << (int)a
         << setw(4) << (int)b
         << setw(4) << (int)c
         << '\n';
  }
}
#endif

#ifdef _OR3_
void main() {
  int iter=100;
  WIRE i[3],o;
  OR gate;
  CLOCK ck0(8), ck1(10), ck2(13);
  while(iter--) {
    ck0.run(iter,i[0]);
    ck1.run(iter,i[1]);
    ck2.run(iter,i[2]);
    gate.run(o,3,i);
    cout << setw(4) << (int)i[0]
         << setw(4) << (int)i[1]
         << setw(4) << (int)i[2]
         << setw(4) << (int)o
         << '\n';
  }
}
#endif

#ifdef _NAND_
void main() {
  int iter=50;
  WIRE a=GND,b=GND,c=GND;
  NAND gate;
  CLOCK ck0(3), ck1(7);
  while(iter--) {
    ck0.run(iter,a);
    ck1.run(iter,b);
    gate.run(c,a,b);
    cout << setw(4) << (int)a
         << setw(4) << (int)b
         << setw(4) << (int)c
         << '\n';
  }
  iter=50;
  CLOCK ck2(2);
  while(iter--) {
    ck0.run(iter,a);
    ck2.run(iter,b);
    gate.run(c,a,b);
    cout << setw(4) << (int)a
         << setw(4) << (int)b
         << setw(4) << (int)c
         << '\n';
  }
  iter=50;
  CLOCK ck3(1);
  while(iter--) {
    ck0.run(iter,a);
    ck3.run(iter,b);
    gate.run(c,a,b);
    cout << setw(4) << (int)a
         << setw(4) << (int)b
         << setw(4) << (int)c
         << '\n';
  }
}
#endif

#ifdef _NAND3_
void main() {
  int iter=200;
  WIRE i[3],o;
  NAND gate;
  CLOCK ck0(8), ck1(10), ck2(13);
  i[0]=i[1]=i[2]=GND; o = GND;
  while(iter--) {
    ck0.run(iter,i[0]);
    ck1.run(iter,i[1]);
    ck2.run(iter,i[2]);
    gate.run(o,3,i);
    cout << setw(4) << (int)i[0]
         << setw(4) << (int)i[1]
         << setw(4) << (int)i[2]
         << setw(4) << (int)o
         << '\n';
  }
}
#endif

#ifdef _NAND3b_
void main() {
  int iter=200;
  WIRE i0,i1,i2,o;
  i0=i1=i2=GND; o = GND;
  NAND gate;
  CLOCK ck0(8), ck1(10), ck2(13);
  while(iter--) {
    ck0.run(iter,i0);
    ck1.run(iter,i1);
    ck2.run(iter,i2);
    gate.run(o,3,i0,i1,i2);
    cout << setw(4) << (int)i0
         << setw(4) << (int)i1
         << setw(4) << (int)i2
         << setw(4) << (int)o
         << '\n';
  }
}
#endif

#ifdef _NOR_
void main() {
  int iter=100;
  WIRE a=GND,b=GND,c=GND;
  NOR gate;
  CLOCK ck0(1), ck1(5);
  while(iter--) {
    ck0.run(iter,a);
    ck1.run(iter,b);
    gate.run(c,a,b);
    cout << setw(4) << (int)a
         << setw(4) << (int)b
         << setw(4) << (int)c
         << '\n';
  }
}
#endif

#ifdef _NOR3_
void main() {
  int iter=1000;
  WIRE i[3],o;
  NOR gate;
  CLOCK ck0(8), ck1(10), ck2(13);
  while(iter--) {
    ck0.run(iter,i[0]);
    ck1.run(iter,i[1]);
    ck2.run(iter,i[2]);
    gate.run(o,3,i);
    cout << setw(4) << (int)i[0]
         << setw(4) << (int)i[1]
         << setw(4) << (int)i[2]
         << setw(4) << (int)o
         << '\n';
  }
}
#endif

#ifdef _XOR_
void main() {
  int iter=100;
  WIRE a=GND,b=GND,c=GND;
  XOR gate;
  CLOCK ck0(8), ck1(10);
  while(iter--) {
    ck0.run(iter,a);
    ck1.run(iter,b);
    gate.run(c,a,b);
    cout << setw(4) << (int)a
         << setw(4) << (int)b
         << setw(4) << (int)c
         << '\n';
  }
}
#endif

#ifdef _XOR3_
void main() {
  int iter=1000;
  WIRE i[3],o;
  XOR gate;
  CLOCK ck0(8), ck1(10), ck2(13);
  while(iter--) {
    ck0.run(iter,i[0]);
    ck1.run(iter,i[1]);
    ck2.run(iter,i[2]);
    gate.run(o,3,i);
    cout << setw(4) << (int)i[0]
         << setw(4) << (int)i[1]
         << setw(4) << (int)i[2]
         << setw(4) << (int)o
         << '\n';
  }
}
#endif

#ifdef _NXOR_
void main() {
  int iter=100;
  WIRE a=GND,b=GND,c=GND;
  NXOR gate;
  CLOCK ck0(8), ck1(10);
  while(iter--) {
    ck0.run(iter,a);
    ck1.run(iter,b);
    gate.run(a,b,c);
    cout << setw(4) << (int)a
         << setw(4) << (int)b
         << setw(4) << (int)c
         << '\n';
  }
}
#endif

#ifdef _NXOR3_
void main() {
  int iter=1000;
  WIRE i[3],o;
  NXOR gate;
  CLOCK ck0(8), ck1(10), ck2(13);
  while(iter--) {
    ck0.run(iter,i[0]);
    ck1.run(iter,i[1]);
    ck2.run(iter,i[2]);
    gate.run(o,3,i);
    cout << setw(4) << (int)i[0]
         << setw(4) << (int)i[1]
         << setw(4) << (int)i[2]
         << setw(4) << (int)o
         << '\n';
  }
}
#endif

#ifdef _BUFFER_Z_
void main() {
  int iter=1000;
  WIRE i=GND,e=GND,o=GND;
  BUFFER_Z x;
  CLOCK ck0(8), ck1(130);
  while(iter--) {
    ck0.run(iter,i);
    ck1.run(iter,e);
    x.run(o,i,e);
    cout << setw(4) << (int)i
         << setw(4) << (int)e
         << setw(4) << (int)o
         << '\n';
  }
}
#endif
De esta forma podemos saber si una puerta está o no funcionando correctamente sin más que escribir:
c++ -D_AND_ test_gates.c gates.o clock.o -o test_AND
test_AND > 1
gnuplot 3.plt
Si el fichero gates.o no estuviera creado, crearlo con:
c++ -c gates.c
Si el fichero clock.o no estuviera creado, crearlo con:
c++ -c clock.c

Probar a simular alguna puerta más y especialmente la puerta BUFFER_Z. Esta puerta lo que hace es comunicar la entrada y la salida si la entrada de habilitación es VCC y aislar la entrada de la salida si la entrada de habilitación es GND.



Vicente González Ruiz 2001-10-15