Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
з лабораторної роботи №6
на тему:
„ SystemC: моделювання функціонування автомату Мура.”
Підготував: ст. гр. СКС-1
Львів 2007
Мета: Ознайомитись з моделлю автомату Мура у SystemC.
Завдання:
1.Заванажити до середовища SystemC проект moore та запустити його на виконання.
2.Ознайомитись з результатами та зробити висновки.
Теоретичні відомості:
Автомат Мура у SystemC моделюється з використанням одного процесу для логіки наступного стану, регістра стану та вихідної логіки. Це є синхронний процес з умовою переходу, що має виходи, зв’язані з кожним можливим варіантом переходу та входи, які визначають наступний стан. В поданому нижче прикладі сигнал moore_state використовується для моделювання автомату Мура, що має чотири можливі стани:
Рисунок1. Приклад графу автомату Мура.
Приклад реалізації автомату Мура у SystemC:
/ / File: moore.h
#include "systemc.hn “
SC-MODULE (moore) {
sc-in<bool> a, clk, reset;
sc-out<bool> z ;
enum state-type {SO, sl, s2, s3) ;
sc-signal<state-type> moore-state;
void prc-moore ( )
SC-CTOR (moore) {
SC-METHOD (prc-moore);
sensitivepos << clk;
}
};
/ / File : moore. cpp
#include "moore.h"
void moore : :prc-moore ( ) {
if (reset) / / Synchronous reset.
moore-state = so;
else
switch (moore-state) {
case SO: z = 1; moore-state = a ? SO : s2; break;
case sl: z = 0; moore-state = a ? SO : s2; break;
case s2: z = 0; moore-state = a ? s2 : s3; break;
case s3: z = 1; moore-state = a ? sl : s3; break;
}
}
Рисунок2. Схема реалізації автомату Мура (результат синтезу).
Виконання лабораторної роботи:
1.Лістинг проекту:
// File moore.h Declaration
#include "systemc.h"
SC_MODULE(moore) {
sc_in<sc_logic> a_in_pin, reset_in_pin; // input ports
sc_in_clk clk_in_pin; // clock input
sc_out<sc_logic> z_out_pin; // output port
sc_out<sc_uint<2> > state_out_pin; // port for monitoring
// Internal variable
enum state_type {s0, s1, s2, s3};
sc_signal<state_type> moore_state;
sc_uint<2> state_int;
// FSM processes
void state(); // synchro process
void output(); // combi process
// Constructor
SC_CTOR(moore) {
SC_METHOD(state);
sensitive_pos << clk_in_pin;
SC_METHOD(output);
sensitive << clk_in_pin;
}
};
// File moore.cpp Implementation
#include "moore.h"
void moore::state(){
bool cond1, cond2;
if (reset_in_pin->read()== sc_logic_1) cond1 = true; else cond1 = false;
if (a_in_pin->read()== sc_logic_1) cond2 = true; else cond2 = false;
if (cond1) //->read())
moore_state = s0;
else
switch(moore_state){
case s0: moore_state = cond2 ? s0:s2; break;
case s1: moore_state = cond2 ? s0:s2; break;
case s2: moore_state = cond2 ? s2:s3; break;
case s3: moore_state = cond2 ? s1:s3; break;
}
}
void moore::output(){
switch(moore_state){
case s3: z_out_pin->write(sc_logic_1); state_int = 3; break;
case s0: z_out_pin->write(sc_logic_1); state_int = 0; break;
case s1: z_out_pin->write(sc_logic_0); state_int = 1; break;
case s2: z_out_pin->write(sc_logic_0); state_int = 2; break;
}
state_out_pin->write(state_int);
}
// File mon_stim.h Declaration
#include <systemc.h>
SC_MODULE(mon_stim) {
sc_in_clk clk_in;
sc_out<sc_logic> a_out;
sc_out<sc_logic> reset_out;
sc_in<sc_logic> z_in;
sc_in<sc_uint<2> > state_in;
bool stimul;
bool reset_int;
// Stimulus and Monitor processes
void monitor();
void stim();
// Constructor
SC_CTOR(mon_stim) {
SC_METHOD(monitor);
sensitive_neg << clk_in;
SC_THREAD(stim);
sensitive_neg << clk_in;
}
};
// Implementation File mon_stim.cpp
#include <math.h>
#include "mon_stim.h"
void mon_stim :: monitor () {
std::cout << "Time is : " << sc_time_stamp()
<< ", reset = " << reset_out
<< ", state = " << state_in
<< ", z = " << z_in
<< ", a = " << a_out
<< std::endl;
}
int clknum = 0 ;
void mon_stim :: stim (){
sc_logic stimul_logic, reset_int_logic;
stimul = false;
stimul_logic = sc_logic_0;
reset_int = true;
reset_int_logic = sc_logic_1;
a_out -> write(stimul_logic);
reset_out->write(reset_int_logic);
clknum ++;
while (true) {
a_out -> write(stimul_logic);
reset_out->write(reset_int_logic);
if (stimul)
{stimul = false; stimul_logic = sc_logic_0;}
else
{stimul = true; stimul_logic = sc_logic_1;}
if (clknum < 5 )
{reset_int = true; reset_int_logic = sc_logic_1;}
else
{reset_int = false; reset_int_logic = sc_logic_0;}
clknum ++;
wait();
}
}
// File main.cpp. Testbench
#include "systemc.h"
#include "moore.h"
#include "mon_stim.h"
int sc_main(int argc, char* argv[]) {
sc_signal<sc_logic> a_wire;
sc_signal<sc_logic> reset_wire;
sc_signal<sc_logic> z_wire;
sc_signal<sc_uint<2> > state_wire;
sc_clock clk("Clock", 10, 0.5, 0);
//Initialize input
a_wire = sc_logic_0;
reset_wire = sc_logic_0;
state_wire=0;
// Instantiate modules and signals connect
moore moore_inst("moore_inst");
moore_inst.clk_in_pin(clk);
moore_inst.reset_in_pin(reset_wire);
moore_inst.a_in_pin(a_wire);
moore_inst.z_out_pin(z_wire);
moore_inst.state_out_pin(state_wire);
mon_stim mon_stim_inst("mon_stim_inst");
mon_stim_inst.a_out(a_wire);
mon_stim_inst.reset_out(reset_wire);
mon_stim_inst.clk_in(clk);
mon_stim_inst.z_in(z_wire);
mon_stim_inst.state_in(state_wire);
//tracing
sc_trace_file *tf = sc_create_vcd_trace_file ("moore_wave");
sc_trace(tf, clk.signal(), "Clock");
sc_trace(tf, a_wire, "a input");
sc_trace(tf, z_wire, "z output");
sc_trace(tf, reset_wire, "reset");
sc_trace(tf, state_wire, "state");
sc_start(300);
return(0);
}
2.Результати дослідження роботи проекту:
2.1.Резльтат у вигляді консольної аплікації:
Висновок: На даній лабораторній роботі я ознайомився з поняттям каналів у SystemC на прикладі проекту «Mutex».