© Harry Broeders.
Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Faculteit Technologie, Innovatie & Samenleving groep E-EMSYS = minor Embedded Systems.
Deze handleidig gaat ervan uit dat de programma's Visual Studio Express 2013 for Windows Desktop en gtkwave al geïnstalleerd zijn en dat de SystemC library al geïnstalleerd en gecompileerd is. Begin hier als dit niet het geval is.
Thuis heb je de SystemC library waarschijnlijk geïnstalleerd in het directory C:\systemc-2.3.1. In lokaal 1.052 op de faculteit TIS van de HHS is de SystemC library geïnstalleerd in Q:\Grp_Elektrotechniek\Embedded_systems\systemc-2.3.1.
Visual Studio Express 2013 for Windows Desktop werkt alleen op Windows 7 en hoger, als je nog Windows XP gebruikt dan kun je gebruik maken van Microsoft Visual C++ 2010 Express Edition, zie hier.
SystemC_test
als naam
voor het project.SystemC_test
als een naam voor
de cpp file.C:\systemc-2.3.1\src
(thuis) of
Q:\Grp_Elektrotechniek\Embedded_systems\systemc-2.3.1\src
(TIS)._CRT_SECURE_NO_WARNINGS;
Dit voorkomt dat de
Visual C++ compiler warnings geeft bij het compileren van de SystemC
headerfile. /vmg
.C:\systemc-2.3.1\msvc80\SystemC\Debug
(thuis) of
Q:\Grp_Elektrotechniek\Embedded_systems\systemc-2.3.1\msvc80\SystemC\Debug
(TIS).SystemC.lib;
.#include <systemc>
using namespace sc_core;
using namespace sc_dt;
using namespace std;
/* Simple DFF */
SC_MODULE(dff) {
/* Model of a Data Flip-Flop that reacts on a negative edge of the clock signal clk */
sc_in_clk
clk;
sc_in<sc_logic> din;
sc_out<sc_logic> dout;
SC_CTOR(dff) {
SC_METHOD(on_clk_neg);
sensitive << clk.neg();
/* Execute process on_clk_neg on every negative edge of the clock signal clk */
}
private:
void on_clk_neg() {
/* Behavior of DFF */
dout.write(din.read());
}
};
SC_MODULE(tb_dff) {
/* Test bench for the DFF */
sc_clock clk;
sc_signal<sc_logic> din;
sc_signal<sc_logic> dout;
SC_CTOR(tb_dff):
clk("clk",10,SC_NS,0.5), DUT("dff") {
/* Connect test bench with DFF which is the device under test (DUT)*/DUT.din(din);
DUT.dout(dout);
DUT.clk(clk);
SC_THREAD(main);
}
private:
dff DUT;
void main() {
/* test script */
din.write(SC_LOGIC_0);
wait(31, SC_NS);
din.write(SC_LOGIC_1);
wait(42, SC_NS);
din.write(SC_LOGIC_0);
}
};
int sc_main(int argc, char* argv[]) {
tb_dff TB("tb_dff");
/* Trace (record) signals */
sc_trace_file *tf(sc_create_vcd_trace_file("trace"));
tf->set_time_unit(1, SC_NS);
sc_trace(tf, TB.clk, "clk");
sc_trace(tf, TB.din, "din");
sc_trace(tf, TB.dout, "dout");
sc_start(100, SC_NS);
sc_close_vcd_trace_file(tf);
cin.get();
return 0;
}
Dit is een low level (gate level) SystemC model van een D
flip-flop. Dit is een eenvoudig geheugen-element. Het signaal op de
ingang din
wordt alleen overgenomen op de uitgang
dout
bij een negatieve flank op de clock ingang
clk
.
C:\gtkwave\bin\gtkwave.exe
en bij TIS is
dat
Q:\Grp_Elektrotechniek\Embedded_systems\gtkwave\bin\gtkwave.exe
.dout
signaal voor
de eerste negatieve flank niet gedefinieerd is. Breidt de D flip-flop uit
met een asynchrone reset
ingang. De uitgang dout
moet meteen laag worden als de reset
ingang hoog wordt.
Zolang de reset
ingang hoog is blijft de uitgang
dout
laag. Als de reset
ingang laag is dan
"onthoud" de uitgang dout
zijn waarde totdat er een negatieve
flank komt op de clock ingang clk
. Breidt ook de test bench
uit zodat de aangepaste D flip-flop getest kan worden. Bedenk dat de waarde
van de reset ingang ook undefined (SC_LOGIC_X
) of
high-impedance (SC_LOGIC_Z
) kan zijn.
din.write(SC_LOGIC_0);
reset.write(SC_LOGIC_X);
wait(3, SC_NS);
reset.write(SC_LOGIC_1);
wait(4, SC_NS);
reset.write(SC_LOGIC_0);
wait(13, SC_NS);
din.write(SC_LOGIC_1);
wait(12, SC_NS);
din.write(SC_LOGIC_0);
wait(18, SC_NS);
din.write(SC_LOGIC_1);
wait(20, SC_NS);
reset.write(SC_LOGIC_1);
wait(7, SC_NS);
reset.write(SC_LOGIC_0);
moet de uitvoer als volgt zijn:
-