OpenCores
URL https://opencores.org/ocsvn/spacewiresystemc/spacewiresystemc/trunk

Subversion Repositories spacewiresystemc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /spacewiresystemc/trunk
    from Rev 28 to Rev 29
    Reverse comparison

Rev 28 → Rev 29

/systemC/link_sc.h
1,3 → 1,35
//+FHDR------------------------------------------------------------------------
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//GLADIC Open Source RTL
//-----------------------------------------------------------------------------
//FILE NAME :
//DEPARTMENT : IC Design / Verification
//AUTHOR : Felipe Fernandes da Costa
//AUTHOR’S EMAIL :
//-----------------------------------------------------------------------------
//RELEASE HISTORY
//VERSION DATE AUTHOR DESCRIPTION
//1.0 YYYY-MM-DD name
//-----------------------------------------------------------------------------
//KEYWORDS : General file searching keywords, leave blank if none.
//-----------------------------------------------------------------------------
//PURPOSE : ECSS_E_ST_50_12C_31_july_2008
//-----------------------------------------------------------------------------
//PARAMETERS
//PARAM NAME RANGE : DESCRIPTION : DEFAULT : UNITS
//e.g.DATA_WIDTH [32,16] : width of the DATA : 32:
//-----------------------------------------------------------------------------
//REUSE ISSUES
//Reset Strategy :
//Clock Domains :
//Critical Timing :
//Test Features :
//Asynchronous I/F :
//Scan Methodology :
//Instantiations :
//Synthesizable (y/n) :
//Other :
//-FHDR------------------------------------------------------------------------
#ifndef CONTROL_SC_H
#define CONTROL_SC_H
 
/systemC/main.cc
0,0 → 1,914
//+FHDR------------------------------------------------------------------------
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//GLADIC Open Source RTL
//-----------------------------------------------------------------------------
//FILE NAME :
//DEPARTMENT : IC Design / Verification
//AUTHOR : Felipe Fernandes da Costa
//AUTHOR’S EMAIL :
//-----------------------------------------------------------------------------
//RELEASE HISTORY
//VERSION DATE AUTHOR DESCRIPTION
//1.0 YYYY-MM-DD name
//-----------------------------------------------------------------------------
//KEYWORDS : General file searching keywords, leave blank if none.
//-----------------------------------------------------------------------------
//PURPOSE : ECSS_E_ST_50_12C_31_july_2008
//-----------------------------------------------------------------------------
//PARAMETERS
//PARAM NAME RANGE : DESCRIPTION : DEFAULT : UNITS
//e.g.DATA_WIDTH [32,16] : width of the DATA : 32:
//-----------------------------------------------------------------------------
//REUSE ISSUES
//Reset Strategy :
//Clock Domains :
//Critical Timing :
//Test Features :
//Asynchronous I/F :
//Scan Methodology :
//Instantiations :
//Synthesizable (y/n) :
//Other :
//-FHDR------------------------------------------------------------------------
#include <systemc.h>
#include <stdio.h>
#include <vector>
#include <string>
#include <stdlib.h>
#include <gtkmm.h>
#include <random>
#include <boost/thread.hpp>
 
using namespace std;
using namespace Gtk;
using namespace boost;
 
#include "../gladicapi/data_recorder.h"
#include "../gladicapi/data_check.h"
 
bool enable_null;
bool enable_fct;
bool enable_time_code;
bool enable_n_char;
 
bool EEP_EOP;
 
unsigned int finish = 0;
bool link_start = false;
bool link_disable = false;
bool auto_start = false;
 
//systemc and verilog
bool global_reset = false;
 
//verilog variables
bool verilog_link_start = false;
bool verilog_link_disable = false;
bool verilog_auto_start = false;
int frquency_nano_second = 500;
 
vector<string> data_col_store;
data_recorder *REC_TX_SPW;
data_check *COMPARE_SPW;
 
vector<string> data_col_store0;
data_recorder *REC_TX_SPWSC;
data_check *COMPARE_SPW_RX;
 
unsigned long int a = 0;
int clock_systemc = 2;
 
//send data systemC
 
bool start_send_data_verilog = false;
bool enable_time_code_verilog = false;
 
bool start_send_data = false;
bool start_tick_data = false;
 
vector<sc_uint<9> > data_generated_sc;
sc_uint<9> intermediate_systemc;
sc_uint<9> intermediate_sc;
unsigned int data_iteration_sc_aux = 0;
unsigned int data_iteration_sc = 0;
 
vector<sc_uint<9> > data_generated_verilog;
sc_uint<9> intermediate;
sc_uint<9> intermediate_verilog;
 
unsigned int data_iteration = 0;
unsigned int data_iteration_vlog = 0;
sc_uint<9> intermediate_data;
 
#include "top_spw.h"
 
//Data generation
unsigned long int max_data = 100;
 
std::random_device rd;
std::uniform_int_distribution<unsigned long int> data_in(0,255);
std::uniform_int_distribution<unsigned long int> nchar(1,max_data-1);//eop-eep
 
class sc_TOP_SPW;
 
SC_MODULE(sc_TOP_SPW)
{
 
sc_clock CLOCK;
sc_signal<bool> RESET;
sc_signal<bool> LINK_START;
sc_signal<bool> LINK_DISABLE;
sc_signal<bool> AUTO_START;
sc_signal<sc_uint<4> > FSM_SPW_OUT;
sc_signal<sc_uint<4> > FSM_TX;
 
sc_signal<sc_uint<10> > CLOCK_GEN;
sc_signal<bool> E_SEND_DATA;
//sc_signal<bool> TICKIN_TX;
//sc_signal<sc_uint<8> > TIMEIN_CONTROL_FLAG_TX;
 
//sc_signal<bool> TXWRITE_TX;
//sc_signal<sc_uint<9> > TXDATA_FLAGCTRL_TX;
 
//sc_signal<bool> READY_TX;
//sc_signal<bool> READY_TICK;
 
sc_signal<bool> BUFFER_READY;
sc_signal<sc_uint<9> > DATARX_FLAG;
sc_signal<bool> BUFFER_WRITE;
 
sc_signal<sc_uint<8> > TIME_OUT;
sc_signal<bool> TICK_OUT;
sc_signal<bool> CONTROL_FLAG_OUT;
 
sc_signal<uint> DOUT;
sc_signal<uint> SOUT;
sc_signal<uint> DIN;
sc_signal<uint> SIN;
 
sc_TOP DUT;
 
SC_CTOR(sc_TOP_SPW) :CLOCK("CLOCK",20,SC_NS),
RESET("RESET"),
LINK_DISABLE("LINK_DISABLE"),
LINK_START("LINK_START"),
AUTO_START("AUTO_START"),
FSM_SPW_OUT("FSM_SPW_OUT"),
CLOCK_GEN("CLOCK_GEN"),
E_SEND_DATA("E_SEND_DATA"),
//TICKIN_TX("TICKIN_TX"),
//TIMEIN_CONTROL_FLAG_TX("TIMEIN_CONTROL_FLAG_TX"),
//TXWRITE_TX("TXWRITE_TX"),
//TXDATA_FLAGCTRL_TX("TXDATA_FLAGCTRL_TX"),
 
//READY_TX("READY_TX"),
//READY_TICK("READY_TICK"),
DOUT("DOUT"),
SOUT("SOUT"),
 
FSM_TX("FSM_TX"),
DIN("DIN"),
SIN("SIN"),
BUFFER_READY("BUFFER_READY"),
DATARX_FLAG("DATARX_FLAG"),
BUFFER_WRITE("BUFFER_WRITE"),
TIME_OUT("TIME_OUT"),
TICK_OUT("TICK_OUT"),
CONTROL_FLAG_OUT("CONTROL_FLAG_OUT"),
 
 
DUT("DUT") {
DUT.CLOCK(CLOCK);
DUT.RESET(RESET);
DUT.LINK_DISABLE(LINK_DISABLE);
DUT.AUTO_START(AUTO_START);
DUT.LINK_START(LINK_START);
DUT.FSM_SPW_OUT(FSM_SPW_OUT);
DUT.CLOCK_GEN(CLOCK_GEN);
DUT.E_SEND_DATA(E_SEND_DATA);
//DUT.TICKIN_TX(TICKIN_TX);
//DUT.TIMEIN_CONTROL_FLAG_TX(TIMEIN_CONTROL_FLAG_TX);
//DUT.TXWRITE_TX(TXWRITE_TX);
//DUT.TXDATA_FLAGCTRL_TX(TXDATA_FLAGCTRL_TX);
DUT.FSM_TX(FSM_TX);
//DUT.READY_TX(READY_TX);
//DUT.READY_TICK(READY_TICK);
DUT.DOUT(DOUT);
DUT.SOUT(SOUT);
 
DUT.DIN(DIN);
DUT.SIN(SIN);
DUT.BUFFER_READY(BUFFER_READY);
DUT.DATARX_FLAG(DATARX_FLAG);
DUT.BUFFER_WRITE(BUFFER_WRITE);
DUT.TIME_OUT(TIME_OUT);
DUT.TICK_OUT(TICK_OUT);
DUT.CONTROL_FLAG_OUT(CONTROL_FLAG_OUT);
 
cout << "SC_CTOR(sc_TOP_SPW)" << endl;
}
 
};
 
Glib::RefPtr<Gtk::Builder> builder;
 
Gtk::Window *window;
 
Gtk::Button *BtnFinsihSimulation;
Gtk::Button *BtnLinkEnable;
Gtk::Button *BtnLinkDisable;
Gtk::Button *BtnAutoStart;
Gtk::Button *BtnReset;
 
Gtk::Button *BtnSpaceWireVerilog;
Gtk::CheckButton *CheckbtnLinkEnable;
Gtk::CheckButton *CheckbtnAutoStart;
Gtk::CheckButton *CheckbtnLinkDisable;
 
//Execute test
Gtk::Button *BtnSimpleTest;
Gtk::CheckButton *CheckBtnEop;
Gtk::CheckButton *CheckBtnEep;
Gtk::CheckButton *CheckBtnTimeCode;
 
//Generate data
Gtk::Button *BtnGenerationDataVerilog;
Gtk::CheckButton *CheckBtnEopGenVerilog;
Gtk::CheckButton *CheckBtnEepGenVerilog;
Gtk::CheckButton *CheckBtnTimeCodeGenVerilog;
 
Gtk::Button *BtnTxFrequency;
Gtk::Entry *EntryFrequency;
 
Gtk::Button *BtnChangeFrequencyVerilog;
Gtk::Entry *EntryFrequencyVerilog;
 
Gtk::Button *BtnSendDataScTx;
Gtk::Button *BtnTimeCodeScTx;
Gtk::Button *BtnGenerateDataSc;
 
Gtk::CheckButton *CheckBtnEepGenSystemC;
Gtk::CheckButton *CheckBtnEopGenSystemC;
 
 
Gtk::Label *lblStatus;
 
 
sc_TOP_SPW *sn_top;
 
extern "C" Control_SC* create_object()
{
return new Control_SC;
}
 
extern "C" void destroy_object( Control_SC* object )
{
delete object;
}
 
/*GTKMM CONTROL*/
void on_BtnFinsihSimulation_clicked()
{
cout<< "End Simulation" <<endl;
Gtk::Main::quit();
finish = 1;
REC_TX_SPW->endsimulation();
REC_TX_SPWSC->endsimulation();
}
 
void on_BtnLinkEnable_clicked()
{
link_start = !link_start;
}
 
void on_BtnLinkDisable_clicked()
{
link_disable = !link_disable;
}
 
void on_BtnAutoStart_clicked()
{
auto_start = !auto_start;
}
 
void on_BtnReset_clicked()
{
global_reset = !global_reset;
}
 
 
void on_BtnSpaceWireVerilog_clicked()
{
 
 
if(!CheckbtnLinkEnable->get_active())
{
verilog_link_start = false;
lblStatus->set_text("LINKENABLE VERILOG IS OFF");
}
 
if(!CheckbtnAutoStart->get_active())
{
verilog_auto_start = false;
lblStatus->set_text("AUTOSTART VERILOG IS OFF");
}
 
if(!CheckbtnLinkDisable->get_active())
{
verilog_link_disable = false;
lblStatus->set_text("AUTOSTART VERILOG IS OFF");
}
 
if(CheckbtnLinkEnable->get_active())
{
verilog_link_start = true;
lblStatus->set_text("LINKENABLE VERILOG IS ON");
}
 
if(CheckbtnAutoStart->get_active())
{
verilog_auto_start = true;
lblStatus->set_text("AUTOSTART VERILOG IS ON");
}
 
if(CheckbtnLinkDisable->get_active())
{
verilog_link_disable = true;
lblStatus->set_text("LINKDISABLE VERILOG IS ON");
}
 
}
 
 
void on_BtnSimpleTest_clicked()
{
 
if(CheckBtnEopGenVerilog->get_active())
{
start_send_data_verilog = true;
}
else
{
start_send_data_verilog = false;
}
 
if(CheckBtnTimeCodeGenVerilog->get_active())
{
enable_time_code_verilog = true;
}
else
{
enable_time_code_verilog = false;
}
 
/*
data_generated.clear();
data_iteration=0;
data_iteration_vlog=0;
if(CheckBtnEop->get_active())
{
for(int cnt_max_data = 0; cnt_max_data <= max_data;cnt_max_data++)
{
if(cnt_max_data == 0 || cnt_max_data == max_data)
{
intermediate(8,8) = 1;
intermediate(7,0) = 0;
}else if(cnt_max_data > 0 && cnt_max_data < max_data)
{
intermediate(7,0) = data_in(rd);
intermediate(8,8) = 0;
}
data_generated.push_back(intermediate);
}
start_send_data_verilog = true;
}else if(CheckBtnEep->get_active())
{
for(int cnt_max_data = 0; cnt_max_data <= max_data;cnt_max_data++)
{
if(cnt_max_data == 0 || cnt_max_data == max_data)
{
intermediate(8,8) = 1;
intermediate(7,0) = 1;
}else if(cnt_max_data > 0 && cnt_max_data < max_data)
{
intermediate(7,0) = data_in(rd);
intermediate(8,8) = 0;
}
data_generated.push_back(intermediate);
}
intermediate(7,0) = 1;
intermediate(8,8) = 1;
data_generated[nchar(rd)] = intermediate;
start_send_data_verilog = true;
}
 
if(CheckBtnTimeCode->get_active())
{
enable_time_code_verilog = true;
}
*/
 
 
}
 
void on_BtnGenerationDataVerilog_clicked()
{
data_generated_verilog.clear();
data_iteration=0;
data_iteration_vlog=0;
if(CheckBtnEopGenVerilog->get_active())
{
for(unsigned int cnt_max_data = 0; cnt_max_data <= max_data;cnt_max_data++)
{
if(cnt_max_data == 0 || cnt_max_data == max_data)
{
intermediate_verilog(8,8) = 1;
intermediate_verilog(7,0) = 0;
}else if(cnt_max_data > 0 && cnt_max_data < max_data)
{
intermediate_verilog(7,0) = data_in(rd);
intermediate_verilog(8,8) = 0;
}
data_generated_verilog.push_back(intermediate_verilog);
}
}else if(CheckBtnEepGenVerilog->get_active())
{
for(unsigned int cnt_max_data = 0; cnt_max_data <= max_data;cnt_max_data++)
{
if(cnt_max_data == 0 || cnt_max_data == max_data)
{
intermediate_verilog(8,8) = 1;
intermediate_verilog(7,0) = 1;
}else if(cnt_max_data > 0 && cnt_max_data < max_data)
{
intermediate_verilog(7,0) = data_in(rd);
intermediate_verilog(8,8) = 0;
}
data_generated_verilog.push_back(intermediate_verilog);
}
intermediate_verilog(7,0) = 1;
intermediate_verilog(8,8) = 1;
data_generated_verilog[nchar(rd)] = intermediate_verilog;
}
}
 
void on_BtnTxFrequency_clicked()
{
 
string aux = EntryFrequency->get_text();
switch(atoi(aux.c_str()))
{
case 2:
sn_top->CLOCK_GEN = 1;
lblStatus->set_text("TX CLOCK SYSTEMC SET IN 2MHz");
break;
case 10:
sn_top->CLOCK_GEN = 2;
lblStatus->set_text("TX CLOCK SYSTEMC SET IN 10MHz");
break;
case 20:
sn_top->CLOCK_GEN = 4;
lblStatus->set_text("TX CLOCK SYSTEMC SET IN 20MHz");
break;
case 50:
sn_top->CLOCK_GEN = 8;
lblStatus->set_text("TX CLOCK SYSTEMC SET IN 50MHz");
break;
case 100:
sn_top->CLOCK_GEN = 16;
lblStatus->set_text("TX CLOCK SYSTEMC SET IN 100MHz");
break;
case 150:
sn_top->CLOCK_GEN = 32;
lblStatus->set_text("TX CLOCK SYSTEMC SET IN 150MHz");
break;
case 200:
sn_top->CLOCK_GEN = 64;
lblStatus->set_text("TX CLOCK SYSTEMC SET IN 200MHz");
break;
case 201:
sn_top->CLOCK_GEN = 128;
lblStatus->set_text("TX CLOCK SYSTEMC SET IN 201MHz");
break;
case 250:
sn_top->CLOCK_GEN = 256;
lblStatus->set_text("TX CLOCK SYSTEMC SET IN 250MHz");
break;
case 280:
sn_top->CLOCK_GEN = 512;
lblStatus->set_text("TX CLOCK SYSTEMC SET IN 280MHz");
break;
}
 
}
 
void on_BtnTimeCodeScTx_clicked()
{
start_tick_data = !start_tick_data;
if(start_tick_data)
{lblStatus->set_text("TIME CODE ENABLED ON TX SYSTEMC");}
else
{lblStatus->set_text("TIME CODE DISABLED ON TX SYSTEMC");}
}
 
void on_BtnSendDataScTx_clicked()
{
start_send_data = !start_send_data;
if(start_send_data)
{lblStatus->set_text("SEND DATA ENABLED TX SYSTEMC");}
else
{lblStatus->set_text("SEND DATA DISABLED TX SYSTEMC");}
}
 
void on_BtnGenerateDataSc_clicked()
{
data_generated_sc.clear();
data_iteration_sc_aux=0;
data_iteration_sc=0;
if(CheckBtnEopGenSystemC->get_active())
{
for(unsigned int cnt_max_data = 0; cnt_max_data <= max_data;cnt_max_data++)
{
if(cnt_max_data == 0 || cnt_max_data == max_data)
{
intermediate_sc(8,8) = 1;
intermediate_sc(7,0) = 0;
}else if(cnt_max_data > 0 && cnt_max_data < max_data)
{
intermediate_sc(7,0) = data_in(rd);
intermediate_sc(8,8) = 0;
}
data_generated_sc.push_back(intermediate_sc);
}
}else if(CheckBtnEepGenSystemC->get_active())
{
for(unsigned int cnt_max_data = 0; cnt_max_data <= max_data;cnt_max_data++)
{
if(cnt_max_data == 0 || cnt_max_data == max_data)
{
intermediate_sc(8,8) = 1;
intermediate_sc(7,0) = 1;
}else if(cnt_max_data > 0 && cnt_max_data < max_data)
{
intermediate_sc(7,0) = data_in(rd);
intermediate_sc(8,8) = 0;
}
data_generated_sc.push_back(intermediate_sc);
}
intermediate_sc(7,0) = 1;
intermediate_sc(8,8) = 1;
data_generated_sc[nchar(rd)] = intermediate_sc;
}
}
 
 
void on_BtnChangeFrequencyVerilog_clicked()
{
string aux = EntryFrequencyVerilog->get_text();
 
switch(atoi(aux.c_str()))
{
case 2:
frquency_nano_second = 500;
break;
case 10:
frquency_nano_second = 100;
break;
case 20:
frquency_nano_second = 50;
break;
case 50:
frquency_nano_second = 20;
break;
case 100:
frquency_nano_second = 10;
break;
case 150:
frquency_nano_second = 7;
break;
case 200:
frquency_nano_second = 5;
break;
case 201:
frquency_nano_second = 4;
break;
case 250:
frquency_nano_second = 4;
break;
case 280:
frquency_nano_second = 3;
break;
default:
frquency_nano_second = 500;
break;
}
}
 
void thread_gtkmm_run()
{
//GRAPHICAL INTERFACE
Main Application(true);
builder = Gtk::Builder::create_from_file("SpaceWrireTestSuit.glade");
 
builder->get_widget("SpaceWireTestStress", window);
builder->get_widget("BtnFinsihSimulation", BtnFinsihSimulation);
builder->get_widget("BtnLinkEnable", BtnLinkEnable);
builder->get_widget("BtnLinkDisable", BtnLinkDisable);
builder->get_widget("BtnAutoStart", BtnAutoStart);
builder->get_widget("BtnReset", BtnReset);
 
builder->get_widget("BtnSpaceWireVerilog", BtnSpaceWireVerilog);
builder->get_widget("CheckbtnLinkDisable", CheckbtnLinkDisable);
builder->get_widget("CheckbtnAutoStart", CheckbtnAutoStart);
builder->get_widget("CheckbtnLinkEnable", CheckbtnLinkEnable);
 
builder->get_widget("BtnGenerationDataVerilog", BtnGenerationDataVerilog);
builder->get_widget("BtnSimpleTest", BtnSimpleTest);
builder->get_widget("CheckBtnEopGenVerilog", CheckBtnEopGenVerilog);
builder->get_widget("CheckBtnEepGenVerilog", CheckBtnEepGenVerilog);
builder->get_widget("CheckBtnTimeCodeGenVerilog", CheckBtnTimeCodeGenVerilog);
 
builder->get_widget("BtnChangeFrequencyVerilog", BtnChangeFrequencyVerilog);
builder->get_widget("EntryFrequencyVerilog", EntryFrequencyVerilog);
 
builder->get_widget("BtnTxFrequency", BtnTxFrequency);
builder->get_widget("EntryFrequency", EntryFrequency);
 
builder->get_widget("BtnSendDataScTx", BtnSendDataScTx);
builder->get_widget("BtnTimeCodeScTx", BtnTimeCodeScTx);
builder->get_widget("BtnGenerateDataSc", BtnGenerateDataSc);
builder->get_widget("CheckBtnEepGenSystemC", CheckBtnEepGenSystemC);
builder->get_widget("CheckBtnEopGenSystemC", CheckBtnEopGenSystemC);
 
builder->get_widget("lblStatus",lblStatus);
 
BtnFinsihSimulation->signal_clicked().connect(sigc::ptr_fun(&on_BtnFinsihSimulation_clicked));
BtnLinkEnable->signal_clicked().connect(sigc::ptr_fun(&on_BtnLinkEnable_clicked));
BtnLinkDisable->signal_clicked().connect(sigc::ptr_fun(&on_BtnLinkDisable_clicked));
BtnAutoStart->signal_clicked().connect(sigc::ptr_fun(&on_BtnAutoStart_clicked));
BtnReset->signal_clicked().connect(sigc::ptr_fun(&on_BtnReset_clicked));
 
BtnSpaceWireVerilog->signal_clicked().connect(sigc::ptr_fun(&on_BtnSpaceWireVerilog_clicked));
 
BtnSimpleTest->signal_clicked().connect(sigc::ptr_fun(&on_BtnSimpleTest_clicked));
 
BtnChangeFrequencyVerilog->signal_clicked().connect(sigc::ptr_fun(&on_BtnChangeFrequencyVerilog_clicked));
 
BtnGenerationDataVerilog->signal_clicked().connect(sigc::ptr_fun(&on_BtnGenerationDataVerilog_clicked));
 
BtnTxFrequency->signal_clicked().connect(sigc::ptr_fun(&on_BtnTxFrequency_clicked));
 
BtnSendDataScTx->signal_clicked().connect(sigc::ptr_fun(&on_BtnSendDataScTx_clicked));
BtnTimeCodeScTx->signal_clicked().connect(sigc::ptr_fun(&on_BtnTimeCodeScTx_clicked));
BtnGenerateDataSc->signal_clicked().connect(sigc::ptr_fun(&on_BtnGenerateDataSc_clicked));
 
window->set_title("GLADIC SPACEWIRE TEST TOOL");
 
Application.run(*window);
}
 
Control_SC::Control_SC()
{
clock_systemc = 2;
sn_top = new sc_TOP_SPW("sc_TOP_SPW");
boost::thread workerThreadGTKMM(thread_gtkmm_run);
 
data_col_store.push_back("CONTROL TYPE");
data_col_store.push_back("NUMBER GENERATED");
data_col_store.push_back("NUMBER RECEIVED");
data_col_store.push_back("COMPARE");
data_col_store.push_back("TIME STAMP");
REC_TX_SPW = new data_recorder("test_suit_vlog_sc.html",data_col_store,"test_suit_vlog_sc.html","TX VERILOG 2 RX SYSTEMC");
REC_TX_SPW->initialize();
COMPARE_SPW = new data_check();
data_col_store.clear();
 
data_col_store0.push_back("CONTROL TYPE");
data_col_store0.push_back("NUMBER GENERATED");
data_col_store0.push_back("NUMBER RECEIVED");
data_col_store0.push_back("COMPARE");
data_col_store0.push_back("TIME STAMP");
REC_TX_SPWSC = new data_recorder("test_suit_sc_vlog.html",data_col_store0,"test_suit_sc_vlog.html","TX SYSTEMC 2 RX VERILOG");
COMPARE_SPW_RX = new data_check();
REC_TX_SPWSC->initialize();
data_col_store0.clear();
}
 
void Control_SC::init()
{
 
sn_top->RESET = true;
 
sn_top->LINK_DISABLE = false;
sn_top->LINK_START = false;
sn_top->AUTO_START = false;
 
sn_top->E_SEND_DATA = false;
 
sn_top->CLOCK_GEN = 1;
frquency_nano_second = 500;
//sn_top->TICKIN_TX = false;
//sn_top->TIMEIN_CONTROL_FLAG_TX = 0;
 
//sn_top->TXWRITE_TX = false;
//sn_top->TXDATA_FLAGCTRL_TX = 0;
}
 
void autostart()
{
if(auto_start)
{
sn_top->AUTO_START = true;
//lblStatus->set_text("AUTOSTART ENABLED ON TX SYSTEMC");
}
else
{
sn_top->AUTO_START = false;
//lblStatus->set_text("AUTOSTART DISABLED ON TX SYSTEMC");
}
}
 
void linkstart()
{
if(link_start)
{
sn_top->LINK_START = true;
//lblStatus->set_text("LINKSTART ENABLED ON TX SYSTEMC");
}
else
{
sn_top->LINK_START = false;
//lblStatus->set_text("LINKSTART DISABLED ON TX SYSTEMC");
}
}
 
void linkdisable()
{
if(link_disable)
{
sn_top->LINK_DISABLE = true;
//lblStatus->set_text("LINKDISABLE ENABLED ON TX SYSTEMC");
}
else
{
sn_top->LINK_DISABLE = false;
//lblStatus->set_text("LINKDISABLE DISABLED ON TX SYSTEMC");
}
}
 
void send_data_tx_sc()
{
if(start_send_data)
{
sn_top->E_SEND_DATA = true;
}
else
{
sn_top->E_SEND_DATA = false;
}
 
}
 
void Control_SC::run_sim()
{
 
autostart();
linkstart();
linkdisable();
send_data_tx_sc();
 
sc_start(clock_systemc,SC_NS);
 
}
 
/* END OF SIMULATION */
void Control_SC::stop_sim()
{
sc_stop();
}
 
/* RESET HIGH */
bool Control_SC::reset_set()
{
 
if(global_reset)
{
sn_top->RESET = false;
}else
{
sn_top->RESET = true;
}
 
return sn_top->RESET;
}
 
unsigned int Control_SC::get_value_dout()
{
return sn_top->DOUT.read();
}
 
unsigned int Control_SC::get_value_sout()
{
return sn_top->SOUT.read();
}
 
void Control_SC::set_rx_sin(unsigned int strobe)
{
sn_top->SIN = strobe;
}
 
void Control_SC::set_rx_din(unsigned int data)
{
sn_top->DIN = data;
}
 
unsigned int Control_SC::get_spw_fsm()
{
return sn_top->FSM_SPW_OUT.read();
}
 
unsigned int Control_SC::finish_simulation()
{
return finish;
}
 
//verilog variables
bool Control_SC::verilog_linkenable()
{
return verilog_link_start;
}
 
bool Control_SC::verilog_autostart()
{
return verilog_auto_start;
}
 
bool Control_SC::verilog_linkdisable()
{
return verilog_link_disable;
}
 
float Control_SC::verilog_frequency()
{
return frquency_nano_second;
}
 
//Test verilog
bool Control_SC::start_tx_test()
{
return start_send_data_verilog;
}
 
bool Control_SC::enable_time_code_tx_test()
{
return enable_time_code_verilog;
}
 
void Control_SC::end_tx_test()
{
start_send_data_verilog = enable_time_code_verilog = false;
}
 
int Control_SC::size_data_test()
{
return data_generated_verilog.size()-1;
}
 
unsigned int Control_SC::take_data(unsigned int a)
{
intermediate = data_generated_verilog[a];
return intermediate(8,0);
}
 
void Control_SC::data_o(unsigned int data, unsigned int pos)
{
sc_uint<9> intermediate = data;
 
data_col_store0.clear();
if(data_iteration_sc <= data_generated_sc.size()-1)
{
data_col_store0.push_back("DATA");
 
intermediate_sc=data_generated_sc[pos];
data_col_store0.push_back(intermediate_sc.to_string(SC_HEX));
 
data_col_store0.push_back(intermediate.to_string(SC_HEX));
 
data_col_store0.push_back(" ");
COMPARE_SPW_RX->compare_test(&data_col_store0);
 
data_col_store0.push_back(sc_time_stamp().to_string());
REC_TX_SPWSC->storedata(data_col_store0);
data_iteration_sc++;
}else
{
data_iteration_sc = 0;
}
}
 
unsigned int Control_SC::clock_tx()
{
return sn_top->DUT.CLOCK_TX_OUT.read();
}
 
/systemC/rx_spw.h
0,0 → 1,695
//+FHDR------------------------------------------------------------------------
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//GLADIC Open Source RTL
//-----------------------------------------------------------------------------
//FILE NAME :
//DEPARTMENT : IC Design / Verification
//AUTHOR : Felipe Fernandes da Costa
//AUTHOR’S EMAIL :
//-----------------------------------------------------------------------------
//RELEASE HISTORY
//VERSION DATE AUTHOR DESCRIPTION
//1.0 YYYY-MM-DD name
//-----------------------------------------------------------------------------
//KEYWORDS : General file searching keywords, leave blank if none.
//-----------------------------------------------------------------------------
//PURPOSE : ECSS_E_ST_50_12C_31_july_2008
//-----------------------------------------------------------------------------
//PARAMETERS
//PARAM NAME RANGE : DESCRIPTION : DEFAULT : UNITS
//e.g.DATA_WIDTH [32,16] : width of the DATA : 32:
//-----------------------------------------------------------------------------
//REUSE ISSUES
//Reset Strategy :
//Clock Domains :
//Critical Timing :
//Test Features :
//Asynchronous I/F :
//Scan Methodology :
//Instantiations :
//Synthesizable (y/n) :
//Other :
//-FHDR------------------------------------------------------------------------
 
#ifndef SPW_RX_H
#define SPW_RX_H
 
#define STATE_RESET 0
#define STATE_ENABLED 1
#define STATE_GOT_BIT 2
#define STATE_GOT_NULL 3
 
#define ESC 0
#define FCT 1
#define EOP 2
#define EEP 3
#define DATA 4
#define TIME_CODE 5
 
class SPW_RX_SC;
 
SC_MODULE(SPW_RX_SC)
{
 
sc_in<bool> RX_CLOCK;
sc_in<uint> DIN;
sc_in<uint> SIN;
 
sc_in<bool> CLOCK_SYS;
 
sc_in<bool> ENABLE_RX;
sc_in<bool> RESET_RX;
 
sc_out<bool> RX_ERROR;
sc_out<bool> RX_CREDIT_ERROR;
sc_out<bool> GOT_BIT;
sc_out<bool> GOT_NULL;
sc_out<bool> GOT_NCHAR;
sc_out<bool> GOT_TIME_CODE;
sc_out<bool> GOT_FCT;
 
sc_out<bool> SEND_FCT_NOW_RX;
 
sc_in<bool> BUFFER_READY;
sc_out<sc_uint<9> > DATARX_FLAG;
sc_out<bool> BUFFER_WRITE;
 
sc_out<sc_uint<8> > TIME_OUT;
sc_out<bool> TICK_OUT;
sc_out<bool> CONTROL_FLAG_OUT;
 
//INTERNAL
sc_uint<4> state_rx;
 
sc_uint<4> control;
sc_uint<10> data;
sc_uint<10> timecode;
 
sc_uint<4> control_sys =4;
sc_uint<4> last_control_sys =4;
 
sc_uint<10> data_sys;
sc_uint<10> last_data;
 
sc_uint<10> timecode_sys;
sc_uint<10> last_timecode;
 
sc_signal<bool> tag_found;
 
unsigned int counter = 0;
unsigned int counter_fct = 0;
unsigned int counter_received_data = 0;
bool enable_bit;
bool first_time;
 
bool connected = false;
 
int cycles=0;
 
bool control_found;
bool data_found;
bool time_code_found;
 
 
bool NULL_FOUND;
bool FCT_FOUND;
bool DATA_FOUND;
bool TIMECODE_FOUND;
 
bool control_parity_error;
bool data_parity_error;
bool time_code_parity_error;
bool invalid_combination;
 
vector<sc_uint<9> > data_store;
vector<sc_uint<9> > time_code;
 
unsigned int last_char;
 
void CalcPARITY()
{
control_parity_error = false;
data_parity_error = false;
time_code_parity_error = false;
if(last_char == ESC || last_char == FCT || last_char == EOP || last_char == EEP)
{
if(control_found)
{
if(!(control_sys[2]^last_control_sys[0]^last_control_sys[1]) != control_sys[3])
{
control_parity_error = true;
}
}else if(data_found)
{
if(!(data_sys[8]^last_control_sys[0]^last_control_sys[1]) != data_sys[9])
{
data_parity_error = true;
}
}else if(time_code_found)
{
if(!(timecode_sys[8]^last_control_sys[0]^last_control_sys[1]) != timecode_sys[9])
{
time_code_parity_error = true;
}
}
}else if(last_char == DATA)
{
if(control_found)
{
if(!(data_sys[8]^last_control_sys[0]^last_control_sys[1]) != data_sys[9])
{
control_parity_error = true;
}
}else if(data_found)
{
if(!(data_sys[8]^last_data[0]^last_data[1]^last_data[2]^last_data[3]^last_data[4]^last_data[5]^last_data[6]^last_data[7]) != data_sys[9])
{
data_parity_error = true;
}
}else if(time_code_found)
{
if(!(data_sys[8]^timecode_sys[0]^timecode_sys[1]^timecode_sys[2]^timecode_sys[3]^timecode_sys[4]^timecode_sys[5]^timecode_sys[6]^timecode_sys[7]) != data_sys[9])
{
time_code_parity_error = true;
}
}
}else if(last_char == TIME_CODE)
{
if(control_found)
{
if(!(timecode_sys[8]^last_control_sys[0]^last_control_sys[1]) != timecode_sys[9])
{
control_parity_error = true;
}
}/*else if(data_found)
{
if(!(timecode[8]^data_sys[0]^data_sys[1]^data_sys[2]^data_sys[3]^data_sys[4])^data_sys[5]^data_sys[6]^data_sys[7] != timecode[9])
{
data_parity_error = true;
}
}else if(time_code_found)
{
if(!(timecode[8]^timecode_sys[0]^timecode_sys[1]^timecode_sys[2]^timecode_sys[3]^timecode_sys[4]^timecode_sys[5]^timecode_sys[6]^timecode_sys[7]) != timecode[9])
{
time_code_parity_error = true;
}
}*/
}
}
 
void gotFCT()
{
while(1)
{
if(!ENABLE_RX)
{
RX_CREDIT_ERROR = false;
counter_fct = 1;
}else
{
if(counter_fct*8 > 56)
{
RX_CREDIT_ERROR = true;
wait(1);
RX_CREDIT_ERROR = false;
}
}
wait(1);
}
}
 
void UPDATE_FCT()
{
while(1)
{
if(!ENABLE_RX)
{
SEND_FCT_NOW_RX = false;
counter_received_data = 0;
}else if(counter_received_data >= 64)
{
SEND_FCT_NOW_RX = true;
counter_received_data = 0;
}else { SEND_FCT_NOW_RX = false;}
wait(1);
}
}
 
 
void TIMER_ADTER850()
{
if(GOT_BIT)
{
cycles=0;
}
}
 
void TIMER_850COUNTER()
{
if(!ENABLE_RX)
{
RX_ERROR = false;
control_parity_error = false;
data_parity_error = false;
time_code_parity_error = false;
invalid_combination = false;
cycles = 0;
}
else
{
//if(GOT_BIT)
//{
if(cycles == 43 || control_parity_error || data_parity_error || time_code_parity_error || invalid_combination)
{
//RX_ERROR = true;
#ifdef RX_ERROR_ENABLE
cout << "ERROR RX ENABLE" << endl;
cout << control_parity_error << endl;
cout << data_parity_error << endl;
cout << time_code_parity_error << endl;
cout << invalid_combination << endl;
#endif
}
else
{
RX_ERROR = false;
cycles++;
}
//}
}
}
 
 
void RX_GET_SIGNAL()
{
 
if( NULL_FOUND )
{
GOT_NULL = true;
GOT_FCT = false;
GOT_NCHAR = false;
}else if( FCT_FOUND )
{
GOT_FCT = true;
GOT_NULL = false;
GOT_NCHAR = false;
}else if( DATA_FOUND )
{
GOT_NCHAR = true;
GOT_FCT = false;
GOT_NULL = false;
}else if( TIMECODE_FOUND )
{
GOT_TIME_CODE = true;
GOT_NCHAR = false;
GOT_FCT = false;
GOT_NULL = false;
}
 
}
 
void RX_RECEIVER()
{
GOT_BIT = true;
NULL_FOUND = false;
FCT_FOUND = false;
DATA_FOUND = false;
TIMECODE_FOUND = false;
data_col_store.clear();
 
if(!connected)
{
if(counter == 0)
{
timecode(0,0) = data(9,9) = control(3,3) = DIN;
counter++;
}
else if(counter == 1)
{
timecode(1,1) = data(8,8) = control(2,2) = DIN;
counter++;
}
else if(counter == 2)
{
timecode(2,2) = data(0,0) = control(1,1) = DIN;
counter++;
}else if(counter == 3)
{
data_col_store.clear();
 
timecode(3,3) = data(1,1) = control(0,0) = DIN;
 
counter = 0;
 
if(last_control_sys(2,0) == 7 && control(2,0) == 4)
{
control_found = true;
NULL_FOUND = true;
FCT_FOUND = false;
DATA_FOUND = false;
last_char = ESC;
 
data_col_store.push_back("NULL");
data_col_store.push_back(" - ");
data_col_store.push_back(last_control_sys(2,0).to_string(SC_HEX) + control(2,0).to_string());
data_col_store.push_back(" - ");
data_col_store.push_back(sc_time_stamp().to_string());
REC_TX_SPW->storedata(data_col_store);
 
if(counter_fct > 0)
{
counter_fct = counter_fct -1;
}
 
}else if(last_control_sys(2,0) != 7 && control(2,0) == 4)
{
last_char = FCT;
counter_fct++;
FCT_FOUND = true;
connected = true;
NULL_FOUND = false;
 
data_col_store.push_back("FCT");
data_col_store.push_back(" - ");
data_col_store.push_back(last_control_sys(2,0).to_string(SC_HEX) + control(2,0).to_string());
data_col_store.push_back(" - ");
data_col_store.push_back(sc_time_stamp().to_string());
REC_TX_SPW->storedata(data_col_store);
 
 
}else if(last_control_sys(2,0) == 4 && control(2,0) == 7)
{
last_char = ESC;
if(counter_fct > 0)
{
counter_fct = counter_fct -1;
}
}else
{
invalid_combination = true;
connected = false;
//cout << last_control_sys(2,0) << control_sys(2,0) << endl;
data_col_store.push_back("INVALID CONNECTION");
data_col_store.push_back(" - ");
data_col_store.push_back(last_control_sys(2,0).to_string(SC_HEX) + control(2,0).to_string());
data_col_store.push_back(" - ");
data_col_store.push_back(sc_time_stamp().to_string());
REC_TX_SPW->storedata(data_col_store);
}
last_control_sys = control;
//control_sys = control;
 
}
}
else
{
if(counter == 0)
{
timecode(9,9) = data(9,9) = control(3,3) = DIN;
counter++;
}
else if(counter == 1)
{
timecode(8,8) = data(8,8) = control(2,2) = DIN;
counter++;
}
else if(counter == 2)
{
timecode(0,0) = data(0,0) = control(1,1) = DIN;
counter++;
}else if(counter == 3)
{
timecode(1,1) = data(1,1) = control(0,0) = DIN;
if(control(2,2) == 1)
{
control_found = true;
counter = 0;
if(last_control_sys(2,0) == 7 && control(2,0) == 4)
{
data_col_store.clear();
 
control_found = true;
NULL_FOUND = true;
FCT_FOUND = false;
DATA_FOUND = false;
last_char = ESC;
 
data_col_store.push_back("NULL");
data_col_store.push_back(" - ");
data_col_store.push_back(last_control_sys(2,0).to_string(SC_HEX) + control(2,0).to_string());
data_col_store.push_back(" - ");
data_col_store.push_back(sc_time_stamp().to_string());
REC_TX_SPW->storedata(data_col_store);
 
if(counter_fct > 0)
{
counter_fct = counter_fct -1;
}
 
}else if(last_control_sys(2,0) != 7 && control(2,0) == 4)
{
data_col_store.clear();
 
last_char = FCT;
counter_fct++;
 
FCT_FOUND = true;
NULL_FOUND = false;
DATA_FOUND = false;
 
data_col_store.push_back("FCT");
data_col_store.push_back(" - ");
data_col_store.push_back(last_control_sys(2,0).to_string(SC_HEX) + control(2,0).to_string());
data_col_store.push_back(" - ");
data_col_store.push_back(sc_time_stamp().to_string());
REC_TX_SPW->storedata(data_col_store);
 
}else if(last_control_sys(2,0) != 7 && control(2,0) == 5)
{
data_col_store.clear();
 
last_char = EOP;
data_col_store.push_back("EOP");
 
FCT_FOUND = false;
NULL_FOUND = false;
DATA_FOUND = true;
 
intermediate_data = data_generated_verilog[data_iteration];
data_col_store.push_back(intermediate_data.to_string(SC_HEX));
 
data_col_store.push_back(last_control_sys(2,0).to_string(SC_HEX) + control(2,0).to_string());
data_col_store.push_back(" ");
COMPARE_SPW->compare_test(&data_col_store);
data_iteration++;
 
data_col_store.push_back(sc_time_stamp().to_string());
REC_TX_SPW->storedata(data_col_store);
 
if(counter_fct > 0)
{
counter_fct = counter_fct - 1;
}
 
counter_received_data = counter_received_data + 8;
}else if(last_control_sys(2,0) != 7 && control(2,0) == 6)
{
 
data_col_store.clear();
 
last_char = EEP;
 
FCT_FOUND = false;
NULL_FOUND = false;
DATA_FOUND = true;
 
data_col_store.push_back("EEP");
intermediate_data = data_generated_verilog[data_iteration];
data_col_store.push_back(intermediate_data.to_string(SC_HEX));
 
data_col_store.push_back(last_control_sys(2,0).to_string(SC_HEX) + control(2,0).to_string());
data_col_store.push_back(" ");
COMPARE_SPW->compare_test(&data_col_store);
data_iteration++;
 
data_col_store.push_back(sc_time_stamp().to_string());
REC_TX_SPW->storedata(data_col_store);
 
if(counter_fct > 0)
{
counter_fct = counter_fct -1;
}
 
counter_received_data = counter_received_data + 8;
}else if((last_control_sys(2,0) == 0 || last_control_sys(2,0) == 6) && control(2,0) == 7)
{
last_char = ESC;
if(counter_fct > 0)
{
counter_fct = counter_fct -1;
}
}else if(last_control_sys(2,0) == 4 && control(2,0) == 7)
{
last_char = ESC;
if(counter_fct > 0)
{
counter_fct = counter_fct -1;
}
}else if(last_control_sys(2,0) == 5 && control(2,0) == 7)
{
last_char = ESC;
if(counter_fct > 0)
{
counter_fct = counter_fct -1;
}
}else
{
data_col_store.clear();
 
invalid_combination = true;
connected = false;
//cout << last_control_sys(2,0) << control_sys(2,0) << endl;
data_col_store.push_back("INVALID CONNECTION");
data_col_store.push_back(" - ");
data_col_store.push_back(last_control_sys(2,0).to_string(SC_HEX) + control_sys(2,0).to_string());
data_col_store.push_back(" - ");
data_col_store.push_back(sc_time_stamp().to_string());
REC_TX_SPW->storedata(data_col_store);
}
last_control_sys = control;
 
 
}
else
{
counter++;
}
 
//cout << control.to_string(SC_HEX) << endl;
}else if(counter == 4)
{
timecode(2,2) = data(2,2) = DIN;
counter++;
}else if(counter == 5)
{
timecode(3,3) = data(3,3) = DIN;
counter++;
}else if(counter == 6)
{
timecode(4,4) = data(4,4) = DIN;
counter++;
}else if(counter == 7)
{
timecode(5,5) = data(5,5) = DIN;
counter++;
}else if(counter == 8)
{
timecode(6,6) = data(6,6) = DIN;
counter++;
}else if(counter == 9)
{
timecode(7,7) = data(7,7) = DIN;
if(data(8,8) == 0 && last_control_sys(2,0) != 7)
{
data_col_store.clear();
 
data_found = true;
FCT_FOUND = false;
NULL_FOUND = false;
DATA_FOUND = true;
//data_store.push_back(data);
last_char = DATA;
 
control_sys = 0;
last_control_sys =0;
 
data_col_store.push_back("DATA");
 
intermediate_data = data_generated_verilog[data_iteration];
data_col_store.push_back(intermediate_data.to_string(SC_HEX));
 
data_col_store.push_back(data(8,0).to_string(SC_HEX));
data_col_store.push_back(" ");
COMPARE_SPW->compare_test(&data_col_store);
 
data_col_store.push_back(sc_time_stamp().to_string());
REC_TX_SPW->storedata(data_col_store);
counter_received_data = counter_received_data + 8;
 
data_iteration++;
last_data = data;
 
if(counter_fct > 0)
{
counter_fct = counter_fct -1;
}
 
 
}else if(data(8,8) == 0 && last_control_sys(2,0) == 7)
{
FCT_FOUND = false;
NULL_FOUND = false;
DATA_FOUND = false;
TIMECODE_FOUND = true;
 
time_code_found = true;
timecode_sys = timecode;
time_code_found = false;
last_char = TIME_CODE;
control_sys = 0;
last_control_sys =0;
data_col_store.push_back("TIMECODE");
data_col_store.push_back(" - ");
data_col_store.push_back(timecode_sys(7,0).to_string());
data_col_store.push_back(" - ");
data_col_store.push_back(sc_time_stamp().to_string());
REC_TX_SPW->storedata(data_col_store);
last_timecode = timecode_sys;
 
if(counter_fct > 0)
{
counter_fct = counter_fct -1;
}
}
counter = 0;
}
}
 
}
 
SC_CTOR(SPW_RX_SC)
{
SC_CTHREAD(gotFCT,CLOCK_SYS.pos());
 
SC_CTHREAD(UPDATE_FCT,CLOCK_SYS.pos());
 
SC_METHOD(TIMER_ADTER850);
sensitive << RX_CLOCK.pos() << RX_CLOCK.neg();
dont_initialize();
 
SC_METHOD(TIMER_850COUNTER);
sensitive << CLOCK_SYS.pos();
dont_initialize();
 
SC_METHOD(CalcPARITY);
sensitive << RX_CLOCK.pos() << RX_CLOCK.neg();
dont_initialize();
 
SC_METHOD(RX_RECEIVER);
sensitive << RX_CLOCK.pos() << RX_CLOCK.neg();
dont_initialize();
 
SC_METHOD(RX_GET_SIGNAL);
sensitive << RX_CLOCK.pos() << RX_CLOCK.neg();
dont_initialize();
 
}
};
#endif
/systemC/rx_spw_clock_recovery.h
0,0 → 1,57
//+FHDR------------------------------------------------------------------------
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//GLADIC Open Source RTL
//-----------------------------------------------------------------------------
//FILE NAME :
//DEPARTMENT : IC Design / Verification
//AUTHOR : Felipe Fernandes da Costa
//AUTHOR’S EMAIL :
//-----------------------------------------------------------------------------
//RELEASE HISTORY
//VERSION DATE AUTHOR DESCRIPTION
//1.0 YYYY-MM-DD name
//-----------------------------------------------------------------------------
//KEYWORDS : General file searching keywords, leave blank if none.
//-----------------------------------------------------------------------------
//PURPOSE : ECSS_E_ST_50_12C_31_july_2008
//-----------------------------------------------------------------------------
//PARAMETERS
//PARAM NAME RANGE : DESCRIPTION : DEFAULT : UNITS
//e.g.DATA_WIDTH [32,16] : width of the DATA : 32:
//-----------------------------------------------------------------------------
//REUSE ISSUES
//Reset Strategy :
//Clock Domains :
//Critical Timing :
//Test Features :
//Asynchronous I/F :
//Scan Methodology :
//Instantiations :
//Synthesizable (y/n) :
//Other :
//-FHDR------------------------------------------------------------------------
 
#ifndef SPW_RX_CLOCK_RECOVERY_H
#define SPW_RX_CLOCK_RECOVERY_H
 
class SPW_RX_CLOCK_RECOVERY_SC;
 
SC_MODULE(SPW_RX_CLOCK_RECOVERY_SC)
{
sc_in<uint> DIN_REC;
sc_in<uint> SIN_REC;
 
sc_out<bool> RX_CLOCK_OUT;
 
void RX_CLOCK_XOR()
{
RX_CLOCK_OUT = DIN_REC ^ SIN_REC;
}
 
SC_CTOR(SPW_RX_CLOCK_RECOVERY_SC)
{
SC_METHOD(RX_CLOCK_XOR);
sensitive << DIN_REC << SIN_REC;
}
};
#endif
/systemC/send_module_sc.h
0,0 → 1,143
//+FHDR------------------------------------------------------------------------
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//GLADIC Open Source RTL
//-----------------------------------------------------------------------------
//FILE NAME :
//DEPARTMENT : IC Design / Verification
//AUTHOR : Felipe Fernandes da Costa
//AUTHOR’S EMAIL :
//-----------------------------------------------------------------------------
//RELEASE HISTORY
//VERSION DATE AUTHOR DESCRIPTION
//1.0 YYYY-MM-DD name
//-----------------------------------------------------------------------------
//KEYWORDS : General file searching keywords, leave blank if none.
//-----------------------------------------------------------------------------
//PURPOSE : ECSS_E_ST_50_12C_31_july_2008
//-----------------------------------------------------------------------------
//PARAMETERS
//PARAM NAME RANGE : DESCRIPTION : DEFAULT : UNITS
//e.g.DATA_WIDTH [32,16] : width of the DATA : 32:
//-----------------------------------------------------------------------------
//REUSE ISSUES
//Reset Strategy :
//Clock Domains :
//Critical Timing :
//Test Features :
//Asynchronous I/F :
//Scan Methodology :
//Instantiations :
//Synthesizable (y/n) :
//Other :
//-FHDR------------------------------------------------------------------------
 
#ifndef SPW_TX_SEND
#define SPW_TX_SEND
 
class SPW_TX_SEND_DATA;
 
SC_MODULE(SPW_TX_SEND_DATA)
{
sc_in<bool> CLOCK_SEND_DATA;
sc_in<bool> RESET_SEND_DATA;
sc_in<bool> E_SEND_DATA;
 
sc_out<bool> TICKIN_TX_SEND_DATA;
sc_out<sc_uint<8> > TIMEIN_CONTROL_FLAG_TX_SEND_DATA;
 
sc_out<bool> TXWRITE_TX_SEND_DATA;
sc_out<sc_uint<9> > TXDATA_FLAGCTRL_TX_SEND_DATA;
 
sc_in<bool> READY_TX_SEND_DATA;
sc_in<bool> READY_TICK_DATA;
 
sc_uint<9> data_send;
 
int a = 0;
int c = 0;
 
void SEND_DATA()
{
if(!RESET_SEND_DATA)
{
TXWRITE_TX_SEND_DATA = false;
a=0;
}
else
{
if(E_SEND_DATA && data_generated_sc.size() > 0)
{
if(a < data_generated_sc.size()-(unsigned int)1)
{
data_send = data_generated_sc[a];
if(!READY_TX_SEND_DATA)
{
TXWRITE_TX_SEND_DATA = true;
}else
{
TXWRITE_TX_SEND_DATA = false;
TXDATA_FLAGCTRL_TX_SEND_DATA= data_send;
}
}
//cout << TXDATA_FLAGCTRL_TX_SEND_DATA.read().to_string(SC_HEX) << " " << READY_TX_SEND_DATA << " " << TXWRITE_TX_SEND_DATA << endl;
}
}
}
 
 
void INCREMMENT_DATA()
{
if(a < data_generated_sc.size()-(unsigned int)1)
a++;
else
a=0;
}
 
void SEND_TIME_CODE()
{
if(!RESET_SEND_DATA)
{
TICKIN_TX_SEND_DATA = false;
TIMEIN_CONTROL_FLAG_TX_SEND_DATA = 0;
c=0;
}
else
{
if(start_tick_data)
{
if( c < 256)
{
 
if(!READY_TICK_DATA)
{
TICKIN_TX_SEND_DATA = true;
}
else
{
TICKIN_TX_SEND_DATA = false;
c++;
TIMEIN_CONTROL_FLAG_TX_SEND_DATA = TIMEIN_CONTROL_FLAG_TX_SEND_DATA.read() +1;
}
}
else
{
c=0;
TIMEIN_CONTROL_FLAG_TX_SEND_DATA = 0;
}
}
}
}
SC_CTOR(SPW_TX_SEND_DATA)
{
SC_METHOD(SEND_DATA);
sensitive << CLOCK_SEND_DATA;
SC_METHOD(INCREMMENT_DATA);
sensitive << READY_TX_SEND_DATA.pos();
SC_METHOD(SEND_TIME_CODE);
sensitive << CLOCK_SEND_DATA.pos();
}
};
#endif
/systemC/spw_fsm.h
0,0 → 1,268
//+FHDR------------------------------------------------------------------------
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//GLADIC Open Source RTL
//-----------------------------------------------------------------------------
//FILE NAME :
//DEPARTMENT : IC Design / Verification
//AUTHOR : Felipe Fernandes da Costa
//AUTHOR’S EMAIL :
//-----------------------------------------------------------------------------
//RELEASE HISTORY
//VERSION DATE AUTHOR DESCRIPTION
//1.0 YYYY-MM-DD name
//-----------------------------------------------------------------------------
//KEYWORDS : General file searching keywords, leave blank if none.
//-----------------------------------------------------------------------------
//PURPOSE : ECSS_E_ST_50_12C_31_july_2008
//-----------------------------------------------------------------------------
//PARAMETERS
//PARAM NAME RANGE : DESCRIPTION : DEFAULT : UNITS
//e.g.DATA_WIDTH [32,16] : width of the DATA : 32:
//-----------------------------------------------------------------------------
//REUSE ISSUES
//Reset Strategy :
//Clock Domains :
//Critical Timing :
//Test Features :
//Asynchronous I/F :
//Scan Methodology :
//Instantiations :
//Synthesizable (y/n) :
//Other :
//-FHDR------------------------------------------------------------------------
#ifndef SPW_FSM_T_H
#define SPW_FSM_T_H
 
#include <systemc.h>
 
#define ERROR_RESET 0
#define ERROR_WAIT 1
#define READY 2
#define STARTED 3
#define CONNECTING 4
#define RUN 5
 
class SPW_FSM_SC;
 
SC_MODULE(SPW_FSM_SC)
{
 
/*FSM signal*/
sc_in<bool> CLOCK;
sc_in<bool> RESET;
sc_in<bool> LINK_START;
sc_in<bool> LINK_DISABLE;
sc_in<bool> AUTO_START;
sc_out<sc_uint<4> > FSM_SPW_OUT;
 
/*Signal come from RX Receiver*/
sc_in<bool> GOT_FCT_RX;
sc_in<bool> GOT_TIMECODE_RX;
sc_in<bool> GOTNCHAR_RX;
sc_in<bool> GOTNULL_RX;
sc_in<bool> GOTBIT_RX;
sc_in<bool> CREDITERROR_RX;
sc_in<bool> RXERROR_RX;
sc_out<bool> ENABLE_RX;
 
/*Signal come from TX Transmit*/
sc_out<bool> ENABLE_TX;
sc_out<bool> SEND_NULL_TX;
sc_out<bool> SEND_FCT_TX;
sc_out<bool> SEND_NCHAR_TX;
sc_out<bool> SEND_TIMECODE_TX;
/*RESET TX / RX*/
sc_out<bool> RESET_TX;
sc_out<bool> RESET_RX;
 
bool After128;
 
bool After64;
 
sc_uint<4> state_fsm_spw;
 
void FSM()
{
 
//cout << "STARTING FSM SPW SC" << endl;
while(1)
{
 
if(!RESET)
{
FSM_SPW_OUT = state_fsm_spw = ERROR_RESET;
ENABLE_TX = false;
SEND_NULL_TX = false;
SEND_FCT_TX = false;
SEND_NCHAR_TX = false;
SEND_TIMECODE_TX= false;
RESET_TX = true;
RESET_RX = true;
}else
{
FSM_SPW_OUT = state_fsm_spw;
 
switch(state_fsm_spw)
{
case ERROR_RESET:
RESET_TX = true;
RESET_RX = true;
ENABLE_TX = false;
ENABLE_RX = false;
if(After64 == true)
{
state_fsm_spw = ERROR_WAIT;
}
//cout << "ERROR RESET" << endl;
break;
case ERROR_WAIT:
RESET_TX = true;
ENABLE_TX = false;
RESET_RX = false;
ENABLE_RX = true;
 
if(After128 == true)
{
state_fsm_spw = READY;
}else if(RXERROR_RX || GOT_FCT_RX || GOTNCHAR_RX || GOT_TIMECODE_RX)
{
state_fsm_spw = ERROR_RESET;
}
 
//cout << "ERROR WAIT" << endl;
break;
case READY:
RESET_TX = true;
RESET_RX = false;
ENABLE_RX = true;
if(RXERROR_RX || GOT_FCT_RX || GOTNCHAR_RX || GOT_TIMECODE_RX)
{
state_fsm_spw = ERROR_RESET;
}
else if((!LINK_DISABLE) && (LINK_START ||(AUTO_START && GOTNULL_RX)))
{
state_fsm_spw = STARTED;
}
//cout << "READY" << endl;
break;
case STARTED:
RESET_TX = false;
RESET_RX = false;
SEND_NULL_TX = true;
ENABLE_TX = true;
ENABLE_RX = true;
 
if(RXERROR_RX || GOT_FCT_RX || GOTNCHAR_RX || GOT_TIMECODE_RX || After128 )
{
state_fsm_spw = ERROR_RESET;
}
else if(GOTNULL_RX && GOTBIT_RX)
{
state_fsm_spw = CONNECTING;
}
//cout << "STARTED" << endl;
break;
case CONNECTING:
 
RESET_TX = false;
RESET_RX = false;
ENABLE_TX = true;
ENABLE_RX = true;
 
SEND_NULL_TX = true;
SEND_FCT_TX = true;
 
 
if(RXERROR_RX || GOTNCHAR_RX || GOT_TIMECODE_RX || After128 )
{
state_fsm_spw = ERROR_RESET;
}else if(GOT_FCT_RX)
{
state_fsm_spw = RUN;
}
//cout << "CONNECTING" << endl;
break;
case RUN:
 
SEND_NULL_TX = true;
ENABLE_TX = true;
SEND_FCT_TX = true;
SEND_NCHAR_TX = true;
SEND_TIMECODE_TX = true;
ENABLE_RX = true;
 
if(RXERROR_RX || CREDITERROR_RX || LINK_DISABLE)
{
state_fsm_spw = ERROR_RESET;
//cout << "RX ERROR DETECTED" << endl;
}
else
{
state_fsm_spw = RUN;
}
 
//cout << "RUN" << endl;
break;
}
}
wait(1);
}
}
 
 
void TIMER_ADTER128()
{
while(1)
{
if(!RESET)
{
After128 = false;
}
else
{
if(state_fsm_spw == ERROR_WAIT || state_fsm_spw == STARTED || state_fsm_spw == CONNECTING)
{
After128 = false;
wait(639);
After128 = true;
}
}
wait(1);
}
}
 
void TIMER_ADTER64()
{
while(1)
{
if(!RESET)
{
After64 = false;
}
else
{
if(state_fsm_spw == ERROR_RESET)
{
After64 = false;
wait(319);
After64 = true;
}
}
wait(1);
}
}
 
 
SC_CTOR(SPW_FSM_SC)
{
SC_CTHREAD(FSM,CLOCK.pos());
SC_CTHREAD(TIMER_ADTER64,CLOCK.pos());
SC_CTHREAD(TIMER_ADTER128,CLOCK.pos());
}
 
};
 
#endif
/systemC/top_spw.h
0,0 → 1,222
//+FHDR------------------------------------------------------------------------
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//GLADIC Open Source RTL
//-----------------------------------------------------------------------------
//FILE NAME :
//DEPARTMENT : IC Design / Verification
//AUTHOR : Felipe Fernandes da Costa
//AUTHOR’S EMAIL :
//-----------------------------------------------------------------------------
//RELEASE HISTORY
//VERSION DATE AUTHOR DESCRIPTION
//1.0 YYYY-MM-DD name
//-----------------------------------------------------------------------------
//KEYWORDS : General file searching keywords, leave blank if none.
//-----------------------------------------------------------------------------
//PURPOSE : ECSS_E_ST_50_12C_31_july_2008
//-----------------------------------------------------------------------------
//PARAMETERS
//PARAM NAME RANGE : DESCRIPTION : DEFAULT : UNITS
//e.g.DATA_WIDTH [32,16] : width of the DATA : 32:
//-----------------------------------------------------------------------------
//REUSE ISSUES
//Reset Strategy :
//Clock Domains :
//Critical Timing :
//Test Features :
//Asynchronous I/F :
//Scan Methodology :
//Instantiations :
//Synthesizable (y/n) :
//Other :
//-FHDR------------------------------------------------------------------------
#ifndef TX_RX_SC_TOP_H
#define TX_RX_SC_TOP_H
 
#include "spw_fsm.h"
 
#include "tx_spw.h"
#include "tx_clock.h"
#include "link_sc.h"
 
#include "rx_spw.h"
#include "rx_spw_clock_recovery.h"
 
#include "send_module_sc.h"
 
class sc_TOP;
 
SC_MODULE(sc_TOP)
{
 
/*FSM signal*/
sc_in<bool> CLOCK;
sc_in<bool> RESET;
sc_in<bool> LINK_START;
sc_in<bool> LINK_DISABLE;
sc_in<bool> AUTO_START;
sc_out<sc_uint<4> > FSM_SPW_OUT;
 
/*Signal come from RX Receiver*/
sc_signal<bool> GOT_FCT_RX;
sc_signal<bool> GOT_TIMECODE_RX;
sc_signal<bool> GOTNCHAR_RX;
sc_signal<bool> GOTNULL_RX;
sc_signal<bool> GOTBIT_RX;
sc_signal<bool> CREDITERROR_RX;
sc_signal<bool> RXERROR;
 
/*Signal come from TX Transmit*/
sc_signal<bool> ENABLE_TX;
sc_signal<bool> SEND_NULL_TX;
sc_signal<bool> SEND_FCT_TX;
sc_signal<bool> SEND_NCHAR_TX;
sc_signal<bool> SEND_TIME_CODE_TX;
/*RESET TX / RX*/
sc_signal<bool> RESET_TX;
 
//sc_signal<bool> GOT_FCT_TX;
//TX ONLY
sc_signal<bool> TICKIN_TX;
sc_signal<sc_uint<8> > TIMEIN_CONTROL_FLAG_TX;
 
sc_signal<bool> SEND_FCT_NOW_TOP;
sc_signal<bool> TXWRITE_TX_S;
sc_signal<sc_uint<9> > TXDATA_FLAGCTRL_TX;
 
sc_signal<bool> READY_TX;
sc_signal<bool> READY_TICK;
 
sc_signal<bool> CLOCK_TX_OUT;
 
sc_out<uint> DOUT; //TROCAR PARA UINT QUANDO FOR PARA O VPI
sc_out<uint> SOUT; //TROCAR PARA UINT QUANDO FOR PARA O VPI
 
sc_out<sc_uint<4> > FSM_TX;
 
//MODULE RX
sc_in<uint> DIN;
sc_in<uint> SIN;
 
sc_signal<bool> ENABLE_RX;
sc_signal<bool> RESET_RX;
 
sc_signal<bool> RX_CLOCK_IN;
sc_in<bool> BUFFER_READY;
sc_out<sc_uint<9> > DATARX_FLAG;
sc_out<bool> BUFFER_WRITE;
 
sc_out<sc_uint<8> > TIME_OUT;
sc_out<bool> TICK_OUT;
sc_out<bool> CONTROL_FLAG_OUT;
 
sc_in<sc_uint<10> > CLOCK_GEN;
sc_in<bool> E_SEND_DATA;
 
SPW_TX_SC DUT;
SPW_TX_CLOCK_SC DUT1;
 
SPW_RX_SC DUT2;
SPW_RX_CLOCK_RECOVERY_SC DUT3;
 
SPW_FSM_SC DUT4;
 
SPW_TX_SEND_DATA DUT5;
 
SC_CTOR(sc_TOP) : DUT("DUT"),DUT1("DUT1"),DUT2("DUT2"),DUT3("DUT3"),DUT4("DUT4"),DUT5("DUT5")
{
DUT1.CLOCK_GEN(CLOCK_GEN);
DUT1.RESET(RESET);
DUT1.CLOCK_TX_OUT(CLOCK_TX_OUT);
 
DUT.CLOCK_TX(CLOCK_TX_OUT);
DUT.CLOCK_SYS(CLOCK);
DUT.RESET_TX(RESET_TX);
DUT.TICKIN_TX(TICKIN_TX);
DUT.TIMEIN_CONTROL_FLAG_TX(TIMEIN_CONTROL_FLAG_TX);
DUT.TXWRITE_TX(TXWRITE_TX_S);
DUT.TXDATA_FLAGCTRL_TX(TXDATA_FLAGCTRL_TX);
 
DUT.SEND_FCT_NOW(SEND_FCT_NOW_TOP);
DUT.ENABLE_TX(ENABLE_TX);
DUT.SEND_NULL_TX(SEND_NULL_TX);
DUT.SEND_FCT_TX(SEND_FCT_TX);
DUT.SEND_NCHAR_TX(SEND_NCHAR_TX);
DUT.SEND_TIME_CODE_TX(SEND_TIME_CODE_TX);
DUT.GOTFCT_TX(GOT_FCT_RX);
DUT.READY_TX(READY_TX);
 
DUT.READY_TICK(READY_TICK);
DUT.DOUT(DOUT);
DUT.SOUT(SOUT);
DUT.FSM_TX(FSM_TX);
 
DUT3.DIN_REC(DIN);
DUT3.SIN_REC(SIN);
DUT3.RX_CLOCK_OUT(RX_CLOCK_IN);
 
DUT2.RX_CLOCK(RX_CLOCK_IN);
DUT2.DIN(DIN);
DUT2.SIN(SIN);
DUT2.CLOCK_SYS(CLOCK);
DUT2.ENABLE_RX(ENABLE_RX);
DUT2.RESET_RX(RESET_RX);
DUT2.RX_ERROR(RXERROR);
DUT2.RX_CREDIT_ERROR(CREDITERROR_RX);
DUT2.GOT_BIT(GOTBIT_RX);
DUT2.GOT_NULL(GOTNULL_RX);
DUT2.GOT_NCHAR(GOTNCHAR_RX);
DUT2.GOT_TIME_CODE(GOT_TIMECODE_RX);
DUT2.GOT_FCT(GOT_FCT_RX);
DUT2.SEND_FCT_NOW_RX(SEND_FCT_NOW_TOP);
 
DUT2.BUFFER_READY(BUFFER_READY);
DUT2.DATARX_FLAG(DATARX_FLAG);
DUT2.BUFFER_WRITE(BUFFER_WRITE);
DUT2.TIME_OUT(TIME_OUT);
DUT2.TICK_OUT(TICK_OUT);
DUT2.CONTROL_FLAG_OUT(CONTROL_FLAG_OUT);
 
DUT4.CLOCK(CLOCK);
DUT4.RESET(RESET);
DUT4.LINK_START(LINK_START);
DUT4.LINK_DISABLE(LINK_DISABLE);
DUT4.AUTO_START(AUTO_START);
DUT4.FSM_SPW_OUT(FSM_SPW_OUT);
 
DUT4.GOT_FCT_RX(GOT_FCT_RX);
DUT4.GOT_TIMECODE_RX(GOT_TIMECODE_RX);
DUT4.GOTNCHAR_RX(GOTNCHAR_RX);
DUT4.GOTNULL_RX(GOTNULL_RX);
DUT4.GOTBIT_RX(GOTBIT_RX);
DUT4.CREDITERROR_RX(CREDITERROR_RX);
DUT4.RXERROR_RX(RXERROR);
DUT4.ENABLE_RX(ENABLE_RX);
 
DUT4.ENABLE_TX(ENABLE_TX);
DUT4.SEND_NULL_TX(SEND_NULL_TX);
DUT4.SEND_FCT_TX(SEND_FCT_TX);
DUT4.SEND_NCHAR_TX(SEND_NCHAR_TX);
DUT4.SEND_TIMECODE_TX(SEND_TIME_CODE_TX);
DUT4.RESET_TX(RESET_TX);
DUT4.RESET_RX(RESET_RX);
 
DUT5.CLOCK_SEND_DATA(CLOCK);
DUT5.RESET_SEND_DATA(RESET);
DUT5.E_SEND_DATA(E_SEND_DATA);
DUT5.TICKIN_TX_SEND_DATA(TICKIN_TX);
DUT5.TIMEIN_CONTROL_FLAG_TX_SEND_DATA(TIMEIN_CONTROL_FLAG_TX);
DUT5.TXWRITE_TX_SEND_DATA(TXWRITE_TX_S);
DUT5.TXDATA_FLAGCTRL_TX_SEND_DATA(TXDATA_FLAGCTRL_TX);
DUT5.READY_TX_SEND_DATA(READY_TX);
DUT5.READY_TICK_DATA(READY_TICK);
 
cout << "SC_CTOR(sc_TOP)" << endl;
}
 
 
 
};
 
#endif
/systemC/tx_clock.h
0,0 → 1,369
//+FHDR------------------------------------------------------------------------
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//GLADIC Open Source RTL
//-----------------------------------------------------------------------------
//FILE NAME :
//DEPARTMENT : IC Design / Verification
//AUTHOR : Felipe Fernandes da Costa
//AUTHOR’S EMAIL :
//-----------------------------------------------------------------------------
//RELEASE HISTORY
//VERSION DATE AUTHOR DESCRIPTION
//1.0 YYYY-MM-DD name
//-----------------------------------------------------------------------------
//KEYWORDS : General file searching keywords, leave blank if none.
//-----------------------------------------------------------------------------
//PURPOSE : ECSS_E_ST_50_12C_31_july_2008
//-----------------------------------------------------------------------------
//PARAMETERS
//PARAM NAME RANGE : DESCRIPTION : DEFAULT : UNITS
//e.g.DATA_WIDTH [32,16] : width of the DATA : 32:
//-----------------------------------------------------------------------------
//REUSE ISSUES
//Reset Strategy :
//Clock Domains :
//Critical Timing :
//Test Features :
//Asynchronous I/F :
//Scan Methodology :
//Instantiations :
//Synthesizable (y/n) :
//Other :
//-FHDR------------------------------------------------------------------------
 
#ifndef SPW_TX_CLOCK_H
#define SPW_TX_CLOCK_H
 
class CLOCK_WIRE_SC;
 
SC_MODULE(CLOCK_WIRE_SC)
{
sc_in<bool> CLOCK_TX;
sc_in<bool> ENABLE;
sc_out<bool> CLOCK_TX_OUT;
 
void TX_CLOCK_M()
{
if(ENABLE)
CLOCK_TX_OUT = CLOCK_TX;
}
SC_CTOR(CLOCK_WIRE_SC)
{
SC_METHOD(TX_CLOCK_M);
sensitive << CLOCK_TX << ENABLE.pos();
}
};
 
class SPW_TX_CLOCK_SC;
 
SC_MODULE(SPW_TX_CLOCK_SC)
{
 
sc_clock CLOCK_2MHZ;
sc_clock CLOCK_10MHZ;
sc_clock CLOCK_20MHZ;
sc_clock CLOCK_50MHZ;
sc_clock CLOCK_100MHZ;
sc_clock CLOCK_150MHZ;
sc_clock CLOCK_200MHZ;
sc_clock CLOCK_201MHZ;
sc_clock CLOCK_250MHZ;
sc_clock CLOCK_280MHZ;
sc_clock CLOCK_500MHZ;
 
sc_in<sc_uint<10> > CLOCK_GEN;
sc_in<bool> RESET;
sc_out<bool> CLOCK_TX_OUT;
 
CLOCK_WIRE_SC DUT_2MHZ;
sc_signal<bool> CLOCK_TX_OUT_2MHZ_ENABLE;
sc_signal<bool> CLOCK_TX_OUT_2MHZ;
 
CLOCK_WIRE_SC DUT_10MHZ;
sc_signal<bool> CLOCK_TX_OUT_10MHZ_ENABLE;
sc_signal<bool> CLOCK_TX_OUT_10MHZ;
 
CLOCK_WIRE_SC DUT_20MHZ;
sc_signal<bool> CLOCK_TX_OUT_20MHZ_ENABLE;
sc_signal<bool> CLOCK_TX_OUT_20MHZ;
 
CLOCK_WIRE_SC DUT_50MHZ;
sc_signal<bool> CLOCK_TX_OUT_50MHZ_ENABLE;
sc_signal<bool> CLOCK_TX_OUT_50MHZ;
 
CLOCK_WIRE_SC DUT_100MHZ;
sc_signal<bool> CLOCK_TX_OUT_100MHZ_ENABLE;
sc_signal<bool> CLOCK_TX_OUT_100MHZ;
 
CLOCK_WIRE_SC DUT_150MHZ;
sc_signal<bool> CLOCK_TX_OUT_150MHZ_ENABLE;
sc_signal<bool> CLOCK_TX_OUT_150MHZ;
 
CLOCK_WIRE_SC DUT_200MHZ;
sc_signal<bool> CLOCK_TX_OUT_200MHZ_ENABLE;
sc_signal<bool> CLOCK_TX_OUT_200MHZ;
 
CLOCK_WIRE_SC DUT_201MHZ;
sc_signal<bool> CLOCK_TX_OUT_201MHZ_ENABLE;
sc_signal<bool> CLOCK_TX_OUT_201MHZ;
 
CLOCK_WIRE_SC DUT_250MHZ;
sc_signal<bool> CLOCK_TX_OUT_250MHZ_ENABLE;
sc_signal<bool> CLOCK_TX_OUT_250MHZ;
 
CLOCK_WIRE_SC DUT_280MHZ;
sc_signal<bool> CLOCK_TX_OUT_280MHZ_ENABLE;
sc_signal<bool> CLOCK_TX_OUT_280MHZ;
 
void ENABLE()
{
//cout << CLOCK_GEN.read() << endl;
switch(CLOCK_GEN.read())
{
case 1:
CLOCK_TX_OUT_2MHZ_ENABLE = true;
CLOCK_TX_OUT_10MHZ_ENABLE = false;
CLOCK_TX_OUT_20MHZ_ENABLE = false;
CLOCK_TX_OUT_50MHZ_ENABLE = false;
CLOCK_TX_OUT_100MHZ_ENABLE = false;
CLOCK_TX_OUT_150MHZ_ENABLE = false;
CLOCK_TX_OUT_200MHZ_ENABLE = false;
CLOCK_TX_OUT_201MHZ_ENABLE = false;
CLOCK_TX_OUT_250MHZ_ENABLE = false;
CLOCK_TX_OUT_280MHZ_ENABLE = false;
break;
case 2:
CLOCK_TX_OUT_2MHZ_ENABLE = false;
CLOCK_TX_OUT_10MHZ_ENABLE = true;
CLOCK_TX_OUT_20MHZ_ENABLE = false;
CLOCK_TX_OUT_50MHZ_ENABLE = false;
CLOCK_TX_OUT_100MHZ_ENABLE = false;
CLOCK_TX_OUT_150MHZ_ENABLE = false;
CLOCK_TX_OUT_200MHZ_ENABLE = false;
CLOCK_TX_OUT_201MHZ_ENABLE = false;
CLOCK_TX_OUT_250MHZ_ENABLE = false;
CLOCK_TX_OUT_280MHZ_ENABLE = false;
break;
case 4:
CLOCK_TX_OUT_2MHZ_ENABLE = false;
CLOCK_TX_OUT_10MHZ_ENABLE = false;
CLOCK_TX_OUT_20MHZ_ENABLE = true;
CLOCK_TX_OUT_50MHZ_ENABLE = false;
CLOCK_TX_OUT_100MHZ_ENABLE = false;
CLOCK_TX_OUT_150MHZ_ENABLE = false;
CLOCK_TX_OUT_200MHZ_ENABLE = false;
CLOCK_TX_OUT_201MHZ_ENABLE = false;
CLOCK_TX_OUT_250MHZ_ENABLE = false;
CLOCK_TX_OUT_280MHZ_ENABLE = false;
break;
case 8:
CLOCK_TX_OUT_2MHZ_ENABLE = false;
CLOCK_TX_OUT_10MHZ_ENABLE = false;
CLOCK_TX_OUT_20MHZ_ENABLE = false;
CLOCK_TX_OUT_50MHZ_ENABLE = true;
CLOCK_TX_OUT_100MHZ_ENABLE = false;
CLOCK_TX_OUT_150MHZ_ENABLE = false;
CLOCK_TX_OUT_200MHZ_ENABLE = false;
CLOCK_TX_OUT_201MHZ_ENABLE = false;
CLOCK_TX_OUT_250MHZ_ENABLE = false;
CLOCK_TX_OUT_280MHZ_ENABLE = false;
break;
case 16:
CLOCK_TX_OUT_2MHZ_ENABLE = false;
CLOCK_TX_OUT_10MHZ_ENABLE = false;
CLOCK_TX_OUT_20MHZ_ENABLE = false;
CLOCK_TX_OUT_50MHZ_ENABLE = false;
CLOCK_TX_OUT_100MHZ_ENABLE = true;
CLOCK_TX_OUT_150MHZ_ENABLE = false;
CLOCK_TX_OUT_200MHZ_ENABLE = false;
CLOCK_TX_OUT_201MHZ_ENABLE = false;
CLOCK_TX_OUT_250MHZ_ENABLE = false;
CLOCK_TX_OUT_280MHZ_ENABLE = false;
break;
case 32:
CLOCK_TX_OUT_2MHZ_ENABLE = false;
CLOCK_TX_OUT_10MHZ_ENABLE = false;
CLOCK_TX_OUT_20MHZ_ENABLE = false;
CLOCK_TX_OUT_50MHZ_ENABLE = false;
CLOCK_TX_OUT_100MHZ_ENABLE = false;
CLOCK_TX_OUT_150MHZ_ENABLE = true;
CLOCK_TX_OUT_200MHZ_ENABLE = false;
CLOCK_TX_OUT_201MHZ_ENABLE = false;
CLOCK_TX_OUT_250MHZ_ENABLE = false;
CLOCK_TX_OUT_280MHZ_ENABLE = false;
break;
case 64:
CLOCK_TX_OUT_2MHZ_ENABLE = false;
CLOCK_TX_OUT_10MHZ_ENABLE = false;
CLOCK_TX_OUT_20MHZ_ENABLE = false;
CLOCK_TX_OUT_50MHZ_ENABLE = false;
CLOCK_TX_OUT_100MHZ_ENABLE = false;
CLOCK_TX_OUT_150MHZ_ENABLE = false;
CLOCK_TX_OUT_200MHZ_ENABLE = true;
CLOCK_TX_OUT_201MHZ_ENABLE = false;
CLOCK_TX_OUT_250MHZ_ENABLE = false;
CLOCK_TX_OUT_280MHZ_ENABLE = false;
break;
case 128:
CLOCK_TX_OUT_2MHZ_ENABLE = false;
CLOCK_TX_OUT_10MHZ_ENABLE = false;
CLOCK_TX_OUT_20MHZ_ENABLE = false;
CLOCK_TX_OUT_50MHZ_ENABLE = false;
CLOCK_TX_OUT_100MHZ_ENABLE = false;
CLOCK_TX_OUT_150MHZ_ENABLE = false;
CLOCK_TX_OUT_200MHZ_ENABLE = false;
CLOCK_TX_OUT_201MHZ_ENABLE = true;
CLOCK_TX_OUT_250MHZ_ENABLE = false;
CLOCK_TX_OUT_280MHZ_ENABLE = false;
break;
case 256:
CLOCK_TX_OUT_2MHZ_ENABLE = false;
CLOCK_TX_OUT_10MHZ_ENABLE = false;
CLOCK_TX_OUT_20MHZ_ENABLE = false;
CLOCK_TX_OUT_50MHZ_ENABLE = false;
CLOCK_TX_OUT_100MHZ_ENABLE = false;
CLOCK_TX_OUT_150MHZ_ENABLE = false;
CLOCK_TX_OUT_200MHZ_ENABLE = false;
CLOCK_TX_OUT_201MHZ_ENABLE = false;
CLOCK_TX_OUT_250MHZ_ENABLE = true;
CLOCK_TX_OUT_280MHZ_ENABLE = false;
break;
case 512:
CLOCK_TX_OUT_2MHZ_ENABLE = false;
CLOCK_TX_OUT_10MHZ_ENABLE = false;
CLOCK_TX_OUT_20MHZ_ENABLE = false;
CLOCK_TX_OUT_50MHZ_ENABLE = false;
CLOCK_TX_OUT_100MHZ_ENABLE = false;
CLOCK_TX_OUT_150MHZ_ENABLE = false;
CLOCK_TX_OUT_200MHZ_ENABLE = false;
CLOCK_TX_OUT_201MHZ_ENABLE = false;
CLOCK_TX_OUT_250MHZ_ENABLE = false;
CLOCK_TX_OUT_280MHZ_ENABLE = true;
break;
default:
CLOCK_TX_OUT_2MHZ_ENABLE = false;
CLOCK_TX_OUT_10MHZ_ENABLE = true;
CLOCK_TX_OUT_20MHZ_ENABLE = false;
CLOCK_TX_OUT_50MHZ_ENABLE = false;
CLOCK_TX_OUT_100MHZ_ENABLE = false;
CLOCK_TX_OUT_150MHZ_ENABLE = false;
CLOCK_TX_OUT_200MHZ_ENABLE = false;
CLOCK_TX_OUT_201MHZ_ENABLE = false;
CLOCK_TX_OUT_250MHZ_ENABLE = false;
CLOCK_TX_OUT_280MHZ_ENABLE = false;
break;
}
}
 
void CLK_GEN()
{
if(!RESET)
{
CLOCK_TX_OUT = CLOCK_TX_OUT_2MHZ;
}
else
{
if(CLOCK_TX_OUT_2MHZ_ENABLE)
CLOCK_TX_OUT = CLOCK_TX_OUT_2MHZ;
else if(CLOCK_TX_OUT_10MHZ_ENABLE)
CLOCK_TX_OUT = CLOCK_TX_OUT_10MHZ;
else if(CLOCK_TX_OUT_20MHZ_ENABLE)
CLOCK_TX_OUT = CLOCK_TX_OUT_20MHZ;
else if(CLOCK_TX_OUT_50MHZ_ENABLE)
CLOCK_TX_OUT = CLOCK_TX_OUT_50MHZ;
else if(CLOCK_TX_OUT_100MHZ_ENABLE)
CLOCK_TX_OUT = CLOCK_TX_OUT_100MHZ;
else if(CLOCK_TX_OUT_150MHZ_ENABLE)
CLOCK_TX_OUT = CLOCK_TX_OUT_150MHZ;
else if(CLOCK_TX_OUT_200MHZ_ENABLE)
CLOCK_TX_OUT = CLOCK_TX_OUT_200MHZ;
else if(CLOCK_TX_OUT_201MHZ_ENABLE)
CLOCK_TX_OUT = CLOCK_TX_OUT_201MHZ;
else if(CLOCK_TX_OUT_250MHZ_ENABLE)
CLOCK_TX_OUT = CLOCK_TX_OUT_250MHZ;
else if(CLOCK_TX_OUT_280MHZ_ENABLE)
CLOCK_TX_OUT = CLOCK_TX_OUT_280MHZ;
}
#ifdef TESTE
cout << "2MHZ" << " " << CLOCK_TX_OUT_2MHZ_ENABLE <<endl;
cout << "10MHZ" << " " << CLOCK_TX_OUT_10MHZ_ENABLE <<endl;
cout << "20MHZ" << " " << CLOCK_TX_OUT_20MHZ_ENABLE <<endl;
cout << "50MHZ" << " " << CLOCK_TX_OUT_50MHZ_ENABLE <<endl;
cout << "100MHZ" << " " << CLOCK_TX_OUT_100MHZ_ENABLE <<endl;
cout << "150MHZ" << " " << CLOCK_TX_OUT_150MHZ_ENABLE <<endl;
cout << "200MHZ" << " " << CLOCK_TX_OUT_200MHZ_ENABLE <<endl;
cout << "201MHZ" << " " << CLOCK_TX_OUT_201MHZ_ENABLE <<endl;
cout << "250MHZ" << " " << CLOCK_TX_OUT_250MHZ_ENABLE <<endl;
cout << "280MHZ" << " " << CLOCK_TX_OUT_280MHZ_ENABLE <<endl;
#endif
}
 
SC_CTOR(SPW_TX_CLOCK_SC):CLOCK_2MHZ("CLOCK_2MHZ",500,SC_NS),
CLOCK_10MHZ("CLOCK_10MHZ",100,SC_NS),
CLOCK_20MHZ("CLOCK_20MHZ",50,SC_NS),
CLOCK_50MHZ("CLOCK_50MHZ",20,SC_NS),
CLOCK_100MHZ("CLOCK_100MHZ",10,SC_NS),
CLOCK_150MHZ("CLOCK_150MHZ",6.667,SC_NS),
CLOCK_200MHZ("CLOCK_200MHZ",5,SC_NS),
CLOCK_201MHZ("CLOCK_201MHZ",4.975,SC_NS),
CLOCK_250MHZ("CLOCK_250MHZ",4,SC_NS),
CLOCK_280MHZ("CLOCK_280MHZ",3.571,SC_NS),
DUT_2MHZ("DUT_2MHZ"),
DUT_10MHZ("DUT_10MHZ"),
DUT_20MHZ("DUT_20MHZ"),
DUT_50MHZ("DUT_50MHZ"),
DUT_100MHZ("DUT_100MHZ"),
DUT_150MHZ("DUT_150MHZ"),
DUT_200MHZ("DUT_200MHZ"),
DUT_201MHZ("DUT_201MHZ"),
DUT_250MHZ("DUT_250MHZ"),
DUT_280MHZ("DUT_280MHZ")
{
SC_METHOD(ENABLE);
sensitive << CLOCK_GEN << RESET;
 
SC_METHOD(CLK_GEN);
sensitive << CLOCK_500MHZ;
 
DUT_2MHZ.CLOCK_TX(CLOCK_2MHZ);
DUT_2MHZ.ENABLE(CLOCK_TX_OUT_2MHZ_ENABLE);
DUT_2MHZ.CLOCK_TX_OUT(CLOCK_TX_OUT_2MHZ);
 
DUT_10MHZ.CLOCK_TX(CLOCK_10MHZ);
DUT_10MHZ.ENABLE(CLOCK_TX_OUT_10MHZ_ENABLE);
DUT_10MHZ.CLOCK_TX_OUT(CLOCK_TX_OUT_10MHZ);
 
DUT_20MHZ.CLOCK_TX(CLOCK_20MHZ);
DUT_20MHZ.ENABLE(CLOCK_TX_OUT_20MHZ_ENABLE);
DUT_20MHZ.CLOCK_TX_OUT(CLOCK_TX_OUT_20MHZ);
 
DUT_50MHZ.CLOCK_TX(CLOCK_50MHZ);
DUT_50MHZ.ENABLE(CLOCK_TX_OUT_50MHZ_ENABLE);
DUT_50MHZ.CLOCK_TX_OUT(CLOCK_TX_OUT_50MHZ);
 
DUT_100MHZ.CLOCK_TX(CLOCK_100MHZ);
DUT_100MHZ.ENABLE(CLOCK_TX_OUT_100MHZ_ENABLE);
DUT_100MHZ.CLOCK_TX_OUT(CLOCK_TX_OUT_100MHZ);
 
DUT_150MHZ.CLOCK_TX(CLOCK_150MHZ);
DUT_150MHZ.ENABLE(CLOCK_TX_OUT_150MHZ_ENABLE);
DUT_150MHZ.CLOCK_TX_OUT(CLOCK_TX_OUT_150MHZ);
 
DUT_200MHZ.CLOCK_TX(CLOCK_200MHZ);
DUT_200MHZ.ENABLE(CLOCK_TX_OUT_200MHZ_ENABLE);
DUT_200MHZ.CLOCK_TX_OUT(CLOCK_TX_OUT_200MHZ);
 
DUT_201MHZ.CLOCK_TX(CLOCK_201MHZ);
DUT_201MHZ.ENABLE(CLOCK_TX_OUT_201MHZ_ENABLE);
DUT_201MHZ.CLOCK_TX_OUT(CLOCK_TX_OUT_201MHZ);
 
DUT_250MHZ.CLOCK_TX(CLOCK_250MHZ);
DUT_250MHZ.ENABLE(CLOCK_TX_OUT_250MHZ_ENABLE);
DUT_250MHZ.CLOCK_TX_OUT(CLOCK_TX_OUT_250MHZ);
 
DUT_280MHZ.CLOCK_TX(CLOCK_280MHZ);
DUT_280MHZ.ENABLE(CLOCK_TX_OUT_280MHZ_ENABLE);
DUT_280MHZ.CLOCK_TX_OUT(CLOCK_TX_OUT_280MHZ);
}
};
#endif
/systemC/tx_spw.h
0,0 → 1,1322
//+FHDR------------------------------------------------------------------------
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
//GLADIC Open Source RTL
//-----------------------------------------------------------------------------
//FILE NAME :
//DEPARTMENT : IC Design / Verification
//AUTHOR : Felipe Fernandes da Costa
//AUTHOR’S EMAIL :
//-----------------------------------------------------------------------------
//RELEASE HISTORY
//VERSION DATE AUTHOR DESCRIPTION
//1.0 YYYY-MM-DD name
//-----------------------------------------------------------------------------
//KEYWORDS : General file searching keywords, leave blank if none.
//-----------------------------------------------------------------------------
//PURPOSE : ECSS_E_ST_50_12C_31_july_2008
//-----------------------------------------------------------------------------
//PARAMETERS
//PARAM NAME RANGE : DESCRIPTION : DEFAULT : UNITS
//e.g.DATA_WIDTH [32,16] : width of the DATA : 32:
//-----------------------------------------------------------------------------
//REUSE ISSUES
//Reset Strategy :
//Clock Domains :
//Critical Timing :
//Test Features :
//Asynchronous I/F :
//Scan Methodology :
//Instantiations :
//Synthesizable (y/n) :
//Other :
//-FHDR------------------------------------------------------------------------
 
#ifndef SPW_TX_T_H
#define SPW_TX_T_H
 
#define START 0
#define SEND_NULL 1
#define SEND_FCT_NULL 2
#define SEND_TIME_CODE_FCT_NCHAR_NULL 3
 
#define TYPE_TIMECODE 4
#define TYPE_FCT 5
#define TYPE_NCHAR_EOP_EEP 6
#define TYPE_NULL 7
 
class SPW_TX_SC;
 
SC_MODULE(SPW_TX_SC)
{
//SIGNALS
sc_in<bool> CLOCK_TX;
sc_in<bool> RESET_TX;
 
sc_in<bool> CLOCK_SYS;
 
sc_in<bool> TICKIN_TX;
sc_in<sc_uint<8> > TIMEIN_CONTROL_FLAG_TX;
 
sc_in<bool> TXWRITE_TX;
sc_in<sc_uint<9> > TXDATA_FLAGCTRL_TX;
 
sc_in<bool> SEND_FCT_NOW;
 
sc_in<bool> ENABLE_TX;
sc_in<bool> SEND_NULL_TX;
sc_in<bool> SEND_FCT_TX;
sc_in<bool> SEND_NCHAR_TX;
sc_in<bool> SEND_TIME_CODE_TX;
sc_in<bool> GOTFCT_TX;
 
sc_out<bool> READY_TX;
sc_out<bool> READY_TICK;
sc_out<uint> DOUT;
sc_out<uint> SOUT;
sc_out<sc_uint<4> > FSM_TX;
 
//INTERNAL
sc_uint<9> TXDATA_FLAGCTRL_TX_AUX;
sc_uint<9> TXDATA_FLAGCTRL_TX_LAST;
 
sc_uint<8> LAST_TIMEIN_CONTROL_FLAG_TX;
 
sc_uint<4> state_tx;
bool first_time;
bool working;
unsigned int last_type;
unsigned int COUNTER;
unsigned int counter_first_time;
 
uint FCT_COUNTER;
 
uint FCT_SEND = 0;
 
sc_uint<4> ESC;
sc_uint<4> EOP;
sc_uint<4> EEP;
sc_uint<4> FCT;
 
sc_uint<8> NULL_S;
sc_uint<14> TIME_CODE;
 
uint DOUT_LAST;
uint SOUT_LAST;
 
//STATE MACHINE CONTROL
void TYPE_DATA_STATE()
{
//cout << "TYPE_DATA_STATE" << endl;
if(RESET_TX)
{
//cout << "RESETED" << " " << RESET_TX << endl;
state_tx = START;
DOUT_LAST = 0;
COUNTER = 0;
FCT_COUNTER = 0;
counter_first_time = 0;
//FCT_SEND = 0;
 
last_type = TYPE_NULL;
NULL_S[7] = 0;
NULL_S[6] = 1;
NULL_S[5] = 1;
NULL_S[4] = 1;
NULL_S[3] = 0;
NULL_S[2] = 1;
NULL_S[1] = 0;
NULL_S[0] = 0;
 
FCT[3] = 0;
FCT[2] = 1;
FCT[1] = 0;
FCT[0] = 0;
 
TIME_CODE[13] = 0;
TIME_CODE[12] = 1;
TIME_CODE[11] = 1;
TIME_CODE[10] = 1;
TIME_CODE[9] = 1;
TIME_CODE[8] = 0;
TIME_CODE[7] = 0;
TIME_CODE[6] = 0;
TIME_CODE[5] = 0;
TIME_CODE[4] = 0;
TIME_CODE[3] = 0;
TIME_CODE[2] = 0;
TIME_CODE[1] = 0;
TIME_CODE[0] = 0;
 
EOP[3] = 0;
EOP[2] = 1;
EOP[1] = 0;
EOP[0] = 1;
 
EEP[3] = 0;
EEP[2] = 1;
EEP[1] = 1;
EEP[0] = 0;
 
first_time = true;
enable_null = false;
enable_fct = false;
enable_time_code = false;
enable_n_char = false;
}
else
{
FSM_TX = state_tx;
//cout << "STATE TX: " << state_tx << endl;
switch(state_tx)
{
case START:
 
if(SEND_NULL_TX && ENABLE_TX)
{
state_tx = SEND_NULL;
}
break;
case SEND_NULL:
enable_null = true;
enable_fct = false;
state_tx = SEND_NULL;
last_type = TYPE_NULL;
if(SEND_NULL_TX && SEND_FCT_TX && ENABLE_TX && counter_first_time > 0)
{
state_tx = SEND_FCT_NULL;
//cout << enable_fct << endl;
}
break;
case SEND_FCT_NULL:
state_tx = SEND_FCT_NULL;
 
if(SEND_FCT_TX && FCT_COUNTER -1 > 0)
{
state_tx = SEND_TIME_CODE_FCT_NCHAR_NULL;
}else if(SEND_FCT_TX && FCT_SEND > 0 && enable_null == false)
{
enable_fct = true;
}else if(SEND_FCT_TX && enable_fct == false && FCT_SEND == 0)
{
enable_null = true;
}
//cout << enable_null << " " << enable_fct << endl;
break;
case SEND_TIME_CODE_FCT_NCHAR_NULL:
if(TICKIN_TX && enable_n_char == false && enable_fct == false && enable_null == false)
{
enable_time_code = true;
}else if(FCT_SEND > 0 && enable_n_char == false && enable_time_code == false && enable_null == false)
{
enable_fct = true;
}else if(TXWRITE_TX && FCT_COUNTER-1 > 0 && enable_fct == false && enable_time_code == false && enable_null == false)
{
enable_n_char = true;
}else if(enable_fct == false && enable_time_code == false && enable_n_char == false)
{
enable_null = true;
}
break;
}
}
}
 
/*SLOTS OPEN IN OTHER SIDE*/
void FCT_COUNTER_M()
{
if(RESET_TX)
{
FCT_COUNTER = 0;
}
else
{
if(SEND_FCT_TX && GOTFCT_TX)
{
FCT_COUNTER = FCT_COUNTER +8;
//cout << "DATA TO SEND" << " " << FCT_COUNTER <<endl;
}
}
}
 
/*TAKE FCT SEND FASE */
void FCT_COUNTER_SEND()
{
if(RESET_TX)
FCT_SEND=7;
else
{
if(SEND_FCT_NOW)
{
FCT_SEND = FCT_SEND + 1;
//cout << "DATA RECEIVED" <<endl;
}
}
}
 
void ALL_HERE()
{
if(RESET_TX)
{
DOUT = 0;
SOUT = 0;
}
else
{
READY_TX = false;
READY_TICK = false;
EEP_EOP = false;
if(enable_null)//
{
if(COUNTER == 0)
{
if(first_time)
{
DOUT_LAST=DOUT = NULL_S[7];
SOUT=!SOUT;
}else if(last_type == TYPE_NULL)
{
if(DOUT == !(NULL_S[6]^NULL_S[0]^NULL_S[1]))
{
DOUT = !(NULL_S[6]^NULL_S[0]^NULL_S[1]);
SOUT=!SOUT;
}else
{
DOUT = !(NULL_S[6]^NULL_S[0]^NULL_S[1]);
SOUT=SOUT;
}
 
}else if(last_type == TYPE_FCT)
{
if(DOUT == !(NULL_S[6]^FCT[0]^FCT[1]))
{
DOUT = !(NULL_S[6]^FCT[0]^FCT[1]);
SOUT=!SOUT;
}else
{
DOUT = !(NULL_S[6]^FCT[0]^FCT[1]);
SOUT=SOUT;
}
 
}else if(last_type == TYPE_NCHAR_EOP_EEP)
{
if(TXDATA_FLAGCTRL_TX_LAST[8] == 1)
{
EEP_EOP = true;
if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 0)
{
if(DOUT == !(NULL_S[6]^EOP[0]^EOP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(NULL_S[6]^EOP[0]^EOP[1]);
}else if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 1)
{
if(DOUT == !(NULL_S[6]^EEP[0]^EEP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(NULL_S[6]^EEP[0]^EEP[1]);
}
}
else
{
if(DOUT == !(NULL_S[6]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]))
{
DOUT = !(NULL_S[6]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]);
SOUT=!SOUT;
}else
{
DOUT = !(NULL_S[6]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]);
SOUT=SOUT;
}
}
}else if(last_type == TYPE_TIMECODE)
{
if(DOUT == !(NULL_S[6]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]))
SOUT=!SOUT;
else
SOUT=SOUT;
 
DOUT = !(NULL_S[6]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]);
}
}
else if(COUNTER == 1)
{
if(DOUT == NULL_S[6])
{
SOUT=!SOUT;
DOUT = NULL_S[6];
}else
{
SOUT=SOUT;
DOUT = NULL_S[6];
}
}
else if(COUNTER == 2)
{
if(DOUT == NULL_S[5])
{
SOUT=!SOUT;
DOUT = NULL_S[5];
}else
{
SOUT=SOUT;
DOUT = NULL_S[5];
}
}
else if(COUNTER == 3)
{
if(DOUT == NULL_S[4])
{
SOUT=!SOUT;
DOUT = NULL_S[4];
}else
{
SOUT=SOUT;
DOUT = NULL_S[4];
}
}
else if(COUNTER == 4)
{
if(DOUT == NULL_S[3])
{
SOUT=!SOUT;
DOUT = NULL_S[3];
}else
{
SOUT=SOUT;
DOUT = NULL_S[3];
}
}
else if(COUNTER == 5)
{
if(DOUT == NULL_S[2])
{
SOUT=!SOUT;
DOUT = NULL_S[2];
}else
{
SOUT=SOUT;
DOUT = NULL_S[2];
}
}
else if(COUNTER == 6)
{
if(DOUT == NULL_S[1])
{
SOUT=!SOUT;
DOUT = NULL_S[1];
}else
{
SOUT=SOUT;
DOUT = NULL_S[1];
}
}
else if(COUNTER == 7)
{
if(DOUT == NULL_S[0])
{
SOUT=!SOUT;
DOUT = NULL_S[0];
}else
{
SOUT=SOUT;
DOUT = NULL_S[0];
}
}
 
first_time = false;
COUNTER++;
 
if(COUNTER == 8)
{
COUNTER = 0;
enable_null = false;
last_type = TYPE_NULL;
if(state_tx == SEND_NULL)
counter_first_time = counter_first_time + 1;
}
 
}else if(enable_fct)//
{
 
if(COUNTER == 0)
{
if(last_type == TYPE_NULL)
{
if(DOUT == !(FCT[2]^NULL_S[0]^NULL_S[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(FCT[2]^NULL_S[0]^NULL_S[1]);
}else if(last_type == TYPE_FCT)
{
if(DOUT == !(FCT[2]^FCT[0]^FCT[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(FCT[2]^FCT[0]^FCT[1]);
}else if(last_type == TYPE_NCHAR_EOP_EEP)
{
if(TXDATA_FLAGCTRL_TX_LAST[8] == 1)
{
EEP_EOP = true;
if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 0)
{
if(DOUT == !(FCT[2]^EOP[0]^EOP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(FCT[2]^EOP[0]^EOP[1]);
}else if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 1)
{
if(DOUT == !(FCT[2]^EEP[0]^EEP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(FCT[2]^EEP[0]^EEP[1]);
}
}
else
{
if(DOUT == !(FCT[2]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(FCT[2]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]);
}
}else if(last_type == TYPE_TIMECODE)
{
if(DOUT == !(FCT[2]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]))
{
SOUT=!SOUT;
}else
{
SOUT=SOUT;
}
DOUT = !(FCT[2]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]);
}
}
else if(COUNTER == 1)
{
if(DOUT == FCT[2])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = FCT[2];
}
else if(COUNTER == 2)
{
if(DOUT == FCT[1])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = FCT[1];
}
else if(COUNTER == 3)
{
if(DOUT == FCT[0])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = FCT[0];
}
 
COUNTER++;
 
if(COUNTER == 4)
{
COUNTER = 0;
FCT_SEND = FCT_SEND - 1;
enable_fct = false;
last_type = TYPE_FCT;
}
}else if(enable_time_code)//
{
 
TIME_CODE(7,0) = TIMEIN_CONTROL_FLAG_TX;
 
if(COUNTER == 0)
{
if(last_type == TYPE_NULL)
{
if(DOUT == !(TIME_CODE[12]^NULL_S[0]^NULL_S[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TIME_CODE[12]^NULL_S[0]^NULL_S[1]);
}else if(last_type == TYPE_FCT)
{
if(DOUT == !(TIME_CODE[12]^FCT[0]^FCT[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TIME_CODE[12]^FCT[0]^FCT[1]);
}else if(last_type == TYPE_NCHAR_EOP_EEP)
{
if(TXDATA_FLAGCTRL_TX_LAST[8] == 1)
{
EEP_EOP = true;
if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 0)
{
if(DOUT == !(TIME_CODE[12]^EOP[0]^EOP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TIME_CODE[12]^EOP[0]^EOP[1]);
}else if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 1)
{
if(DOUT == !(TIME_CODE[12]^EEP[0]^EEP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TIME_CODE[12]^EEP[0]^EEP[1]);
}
}
else
{
if(DOUT == !(TIME_CODE[12]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TIME_CODE[12]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]);
}
}else if(last_type == TYPE_TIMECODE)
{
if( DOUT == !(TIME_CODE[12]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TIME_CODE[12]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]);
}
}else if(COUNTER == 1)
{
if(DOUT == TIME_CODE[12])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[12];
}
else if(COUNTER == 2)
{
if(DOUT == TIME_CODE[11])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[11];
}
else if(COUNTER == 3)
{
if(DOUT == TIME_CODE[10])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[10];
}
else if(COUNTER == 4)
{
if(DOUT == TIME_CODE[9])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[9];
}
else if(COUNTER == 5)
{
if(DOUT == TIME_CODE[8])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[8];
}
else if(COUNTER == 6)
{
if(DOUT == TIME_CODE[0])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[0];
}
else if(COUNTER == 7)
{
if(DOUT == TIME_CODE[1])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[1];
}
else if(COUNTER == 8)
{
if(DOUT == TIME_CODE[2])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[2];
}
else if(COUNTER == 9)
{
if(DOUT == TIME_CODE[3])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[3];
}
else if(COUNTER == 10)
{
if(DOUT == TIME_CODE[4])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[4];
}
else if(COUNTER == 11)
{
if(DOUT == TIME_CODE[5])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[5];
}
else if(COUNTER == 12)
{
if(DOUT == TIME_CODE[6])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[6];
}
else if(COUNTER == 13)
{
if(DOUT == TIME_CODE[7])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TIME_CODE[7];
}
 
 
COUNTER++;
 
if(COUNTER == 14)
{
COUNTER = 0;
READY_TICK = true;
enable_time_code = false;
last_type = TYPE_TIMECODE;
LAST_TIMEIN_CONTROL_FLAG_TX = TIMEIN_CONTROL_FLAG_TX;
}
 
}else if(enable_n_char)//
{
 
TXDATA_FLAGCTRL_TX_AUX = TXDATA_FLAGCTRL_TX;
 
if(TXDATA_FLAGCTRL_TX_AUX[8])//EOP-EEP
{
 
if(TXDATA_FLAGCTRL_TX_AUX(1,0) == 0) //EOP
{
if(COUNTER == 0)
{
if(last_type == TYPE_NULL)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^NULL_S[0]^NULL_S[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^NULL_S[0]^NULL_S[1]);
}else if(last_type == TYPE_FCT)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^FCT[0]^FCT[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^FCT[0]^FCT[1]);
}else if(last_type == TYPE_NCHAR_EOP_EEP)
{
if(TXDATA_FLAGCTRL_TX_LAST[8] == 1)
{
EEP_EOP = true;
if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 0)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^EOP[0]^EOP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^EOP[0]^EOP[1]);
}else if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 1)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^EEP[0]^EEP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^EEP[0]^EEP[1]);
}
}
else
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]);
}
}else if(last_type == TYPE_TIMECODE)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]);
}
}
else if(COUNTER == 1)
{
if(DOUT == EOP[2])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = EOP[2];
}
else if(COUNTER == 2)
{
if(DOUT == EOP[1])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = EOP[1];
}
else if(COUNTER == 3)
{
if(DOUT == EOP[0])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = EOP[0];
}
 
COUNTER++;
 
if(COUNTER == 4)
{
COUNTER = 0;
READY_TX = true;
TXDATA_FLAGCTRL_TX_LAST = TXDATA_FLAGCTRL_TX_AUX;
FCT_COUNTER = FCT_COUNTER - 1;
enable_n_char = false;
last_type = TYPE_NCHAR_EOP_EEP;
}
}
else if(TXDATA_FLAGCTRL_TX_AUX(1,0) == 1)//EEP
{
if(COUNTER == 0)
{
if(last_type == TYPE_NULL)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^NULL_S[0]^NULL_S[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^NULL_S[0]^NULL_S[1]);
}else if(last_type == TYPE_FCT)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^FCT[0]^FCT[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^FCT[0]^FCT[1]);
}else if(last_type == TYPE_NCHAR_EOP_EEP)
{
if(TXDATA_FLAGCTRL_TX_LAST[8] == 1)
{
EEP_EOP = true;
if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 0)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^EOP[0]^EOP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^EOP[0]^EOP[1]);
}else if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 1)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^EEP[0]^EEP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^EEP[0]^EEP[1]);
}
}
else
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]);
}
}else if(last_type == TYPE_TIMECODE)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]);
}
}
else if(COUNTER == 1)
{
if(DOUT == EEP[2])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = EEP[2];
}
else if(COUNTER == 2)
{
if(DOUT == EEP[1])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = EEP[1];
}
else if(COUNTER == 3)
{
if(DOUT == EOP[0])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = EOP[0];
}
 
COUNTER++;
 
if(COUNTER == 4)
{
COUNTER = 0;
READY_TX = true;
TXDATA_FLAGCTRL_TX_LAST = TXDATA_FLAGCTRL_TX_AUX;
FCT_COUNTER = FCT_COUNTER - 1;
enable_n_char = false;
last_type = TYPE_NCHAR_EOP_EEP;
}
}
 
}
else //DATA
{
if(COUNTER == 0)
{
if(last_type == TYPE_NULL)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^NULL_S[0]^NULL_S[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^NULL_S[0]^NULL_S[1]);
}else if(last_type == TYPE_FCT)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^FCT[0]^FCT[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^FCT[0]^FCT[1]);
}else if(last_type == TYPE_NCHAR_EOP_EEP)
{
if(TXDATA_FLAGCTRL_TX_LAST[8] == 1)
{
EEP_EOP = true;
if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 0)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^EOP[0]^EOP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^EOP[0]^EOP[1]);
}else if(TXDATA_FLAGCTRL_TX_LAST(1,0) == 1)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^EEP[0]^EEP[1]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^EEP[0]^EEP[1]);
}
}
else
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^TXDATA_FLAGCTRL_TX_LAST[0]^TXDATA_FLAGCTRL_TX_LAST[1]^TXDATA_FLAGCTRL_TX_LAST[2]^TXDATA_FLAGCTRL_TX_LAST[3]^ TXDATA_FLAGCTRL_TX_LAST[4]^TXDATA_FLAGCTRL_TX_LAST[5]^TXDATA_FLAGCTRL_TX_LAST[6]^TXDATA_FLAGCTRL_TX_LAST[7]);
}
}else if(last_type == TYPE_TIMECODE)
{
if(DOUT == !(TXDATA_FLAGCTRL_TX_AUX[8]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]))
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = !(TXDATA_FLAGCTRL_TX_AUX[8]^LAST_TIMEIN_CONTROL_FLAG_TX[7]^LAST_TIMEIN_CONTROL_FLAG_TX[6]^LAST_TIMEIN_CONTROL_FLAG_TX[5]^LAST_TIMEIN_CONTROL_FLAG_TX[4]^LAST_TIMEIN_CONTROL_FLAG_TX[3]^LAST_TIMEIN_CONTROL_FLAG_TX[2]^LAST_TIMEIN_CONTROL_FLAG_TX[1]^LAST_TIMEIN_CONTROL_FLAG_TX[0]);
}
}
else if(COUNTER == 1)
{
if(DOUT == TXDATA_FLAGCTRL_TX_AUX[8])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TXDATA_FLAGCTRL_TX_AUX[8];
}
else if(COUNTER == 2)
{
if(DOUT == TXDATA_FLAGCTRL_TX_AUX[0])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TXDATA_FLAGCTRL_TX_AUX[0];
}
else if(COUNTER == 3)
{
if(DOUT == TXDATA_FLAGCTRL_TX_AUX[1])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TXDATA_FLAGCTRL_TX_AUX[1];
}
else if(COUNTER == 4)
{
if(DOUT == TXDATA_FLAGCTRL_TX_AUX[2])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TXDATA_FLAGCTRL_TX_AUX[2];
}
else if(COUNTER == 5)
{
if(DOUT == TXDATA_FLAGCTRL_TX_AUX[3])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TXDATA_FLAGCTRL_TX_AUX[3];
}
else if(COUNTER == 6)
{
if(DOUT == TXDATA_FLAGCTRL_TX_AUX[4])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TXDATA_FLAGCTRL_TX_AUX[4];
}
else if(COUNTER == 7)
{
if(DOUT == TXDATA_FLAGCTRL_TX_AUX[5])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TXDATA_FLAGCTRL_TX_AUX[5];
}
else if(COUNTER == 8)
{
if(DOUT == TXDATA_FLAGCTRL_TX_AUX[6])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TXDATA_FLAGCTRL_TX_AUX[6];
}
else if(COUNTER == 9)
{
if(DOUT == TXDATA_FLAGCTRL_TX_AUX[7])
{
SOUT=!SOUT;
}
else
{
SOUT=SOUT;
}
DOUT = TXDATA_FLAGCTRL_TX_AUX[7];
}
 
COUNTER++;
 
if(COUNTER == 10)
{
COUNTER = 0;
READY_TX = true;
TXDATA_FLAGCTRL_TX_LAST = TXDATA_FLAGCTRL_TX_AUX;
FCT_COUNTER = FCT_COUNTER - 1;
enable_n_char = false;
last_type = TYPE_NCHAR_EOP_EEP;
}
}
 
}
 
}
}//END METHOD
 
 
SC_CTOR(SPW_TX_SC)
{
SC_METHOD(FCT_COUNTER_SEND);
sensitive << CLOCK_SYS.pos();
 
SC_METHOD(FCT_COUNTER_M);
sensitive << CLOCK_SYS.pos();
 
SC_METHOD(ALL_HERE);
sensitive << CLOCK_TX.pos();
 
SC_METHOD(TYPE_DATA_STATE);
sensitive << CLOCK_TX.pos();
}
};
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.