Ejemplo de implementación:

Se implementara una compuerta EXOR, usando 4 puertas NAND.

 

 

El Código para una compuerta NAND, es el siguiente:

 

 

Cuadro de texto: # include “systemc.h”
SC_MODULE (nand2)
{
	sc_in<bool> A, B;
	sc_out<bool> F;
	
	void do_nand2 ()
	{
		F.write (! A.read() &&B.read() ) );
	}
	SC_CTOR(nand2)
	{ 
		SC_METHOD(do_nand2);
	Sensitive <<A << B;
	}
};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Para que finalmente tengamos el EXOR, se usan 4 módulos del tipo NAND, simplemente llamando al modulo NAND.

Cuadro de texto: # include “systemc.h”
# include “nand2.h”
SC_MODULE(exor29
{
	sc_in<bool> A, B;
	sc_out<bool> F;
	
	nand2 n1, n2, n3, n4;
 	sc_signal<bool> S1, S2, S3;
SC_CTOR(exor) : n1(“N1”), n2(“N2”), n3(“N3”), n4(“N4”),
{
		n1.A(A);
		n1.B(B);	
n1.F(S1);

n2<< A << S1 << S2;

n3.(S1);
		n3.(B);	
n3.(S3);

n4.A(S2);
		n4.B(S3);	
n4.F(F);
}

};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Para Probar nuestro EXOR, esta el siguiente codigo, que simula las entradas al EXOR.

 

 

Cuadro de texto: #include “systemc.h”
SC_MODULE (stim)
{
	sc_out<bool> A, B;
	sc_in_clk Clk;

	void StimGen()
	{
		A.write (false);
		B.write (false);
		wait ();
		A.write (false);
B.write (true);
wait ();
A.write (true);
		B.write (false);
		wait ();
		A.write (true);
B.write (true);
wait ();
sc_stop();
	}
	SC_CTOR(stim)
	{
		SC_CTHREAD(StimGen, Cñk.pos());
	}
};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

El siguiente código, monitorea la salida del EXOR.

 

 

Cuadro de texto: #include “systemc.h”
#include “stim.h”
#include “exor2.h”
#include “mon.h”

int sc_main (int argc, char* argv [])
{
	sc_signal<bool> Asig, Bsig, Fsig;
	sc_clock TestClk(“TestClock”, 10, SC_NS_0.5);
	
	stim Stim1(“Stimulus”);
	Stim1.A(Asig);
	Stim1.B(Bsig);
	Stim1.Clk(TestClk);

	Exor2 DUT(“exor2”);
	DUT.A(Asig) ;
	DUT.B(Bsig) ;
	DUT.F(Fsig) ;

	mon Monitor1(“Monitor”)
	Monitor1.A(Asig);
	Monitor1.B(Bsig);
	Monitor1.F(Fsig);
	Monitor1.Clk(TestClk);

	sc_start() ;
	return 0;
	}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

La salida por consola, es la siguiente:

 

                   Time  A       B       F

                     0  s  0        0        1

10 ns 0        0        0

20 ns 0        1        1

30 ns 1        0        1

40 ns 1        1        0