By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
459,952 Members | 1,785 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 459,952 IT Pros & Developers. It's quick & easy.

problem with creating new levels of logic

P: n/a
I am having a lot of problem with following code. To start with
I have a working sets of code and the top level SystemC code looks
like this:

----------working main.cpp start here -------------------

#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "stimulus.h"
#include "display.h"
#include "fir.h"
#include "ParametizedDelay.h"

int sc_main (int argc , char *argv[]) {
sc_clock clock;
sc_signal<bool> reset;
sc_signal<bool> input_valid;
sc_signal<int> ADC_Data;
sc_signal<int> Filter_Out;
sc_signal<int> Line1_Out,Line2_Out,Line3_Out,Line4_Out;

stimulus stimulus("stimulus");
fir fir("fir");
fir.SetCoefs(13, 0, "LPF.Coeff");
display display ("display");

stimulus.CLK(clock.signal());
stimulus.reset(reset);
stimulus.ADC_Data(ADC_Data);

fir.CLK(clock.signal());
fir.reset(reset);
fir.ipData(ADC_Data);
fir.opData(Filter_Out);

ParametizedDelay Line1 ("line1");
ParametizedDelay Line2 ("line2");
ParametizedDelay Line3 ("line3");
ParametizedDelay Line4 ("line4");

Line1.SetDelay(500);
Line1.CLK(clock.signal());
Line1.reset(reset);
Line1.ipData(ADC_Data);
Line1.opData(Line1_Out);

Line2.SetDelay(500);
Line2.CLK(clock.signal());
Line2.reset(reset);
Line2.ipData(Line1_Out);
Line2.opData(Line2_Out);

Line3.SetDelay(500);
Line3.CLK(clock.signal());
Line3.reset(reset);
Line3.ipData(Line2_Out);
Line3.opData(Line3_Out);

Line4.SetDelay(500);
Line4.CLK(clock.signal());
Line4.reset(reset);
Line4.ipData(Line3_Out);
Line4.opData(Line4_Out);

display.CLK(clock.signal());
display.lpf(Filter_Out);
display.Line1(Line1_Out);
display.Line2(Line2_Out);
display.Line3(Line3_Out);
display.Line4(Line4_Out);

sc_start(clock, -1);
return 0;
}
--------------End of main.cpp ------------------

Basically, the stimulus module read in a data file and feed it(the
ADC_Data) to the fir module which is simply a FIR filter(the filter
coefficient is defined by LPF.Coeff text file). At the same time
stimulus also feed into a 4 separate Line delays each with a delay of
500 clocks. Now, the code is working but what I would like to do is to
create a new module that contains only the 4 Lines at the top level.
When done, I like it to look like the following.

-------------the new main.cpp -------------------

#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "stimulus.h"
#include "display.h"
#include "fir.h"
#include "ParametizedDelay.h"
#include "FourInOne.h"

int sc_main (int argc , char *argv[]) {

sc_clock clock;
sc_signal<bool> reset;
sc_signal<bool> input_valid;
sc_signal<int> ADC_Data;
sc_signal<int> Filter_Out;
sc_signal<int> Line1_Out,Line2_Out,Line3_Out,Line4_Out;

stimulus stimulus("stimulus");
fir fir("fir");
fir.SetCoefs(13, 0, "LPF.Coeff");
display display ("display");
FourInOne FourInOne("FourInOne"); // This would be the new module
added here.

stimulus.CLK(clock.signal());
stimulus.reset(reset);
stimulus.ADC_Data(ADC_Data);

fir.CLK(clock.signal());
fir.reset(reset);
fir.ipData(ADC_Data);
fir.opData(Filter_Out);

ParametizedDelay Line1 ("line1");
ParametizedDelay Line2 ("line2");
ParametizedDelay Line3 ("line3");
ParametizedDelay Line4 ("line4");

FourInOne.SetDelay(500); //Added
FourInOne.CLK(clock.signal()); //Added
FourInOne.reset(reset); //Added
FourInOne.ipBotLine(ADC_Data); //Added
FourInOne.opCurLine(Line1_Out); //Added
FourInOne.opCurLine(Line2_Out); //Added
FourInOne.opCurLine(Line3_Out); //Added
FourInOne.opTopLine(Line4_Out); //Added

display.CLK(clock.signal());
display.lpf(Filter_Out);
display.Line1(Line1_Out);
display.Line2(Line2_Out);
display.Line3(Line3_Out);
display.Line4(Line4_Out);

sc_start(clock, -1);
return 0;
}

---------------end of desired main.cpp ---------------------

As you can see, my purpose is to be able to create new levels of logic
as design gets bigger. But the code doesn't work and can not compile.

In the following, I listed all the revelent .h and .cpp code.

-----------stimulus.h---------------
SC_MODULE(stimulus) {

sc_out<bool> reset;
sc_out<int> ADC_Data;
sc_in<bool> CLK;

unsigned CLK_COUNT;
FILE* ifp;
char line[80];
int FileReadData;

SC_CTOR(stimulus)
{
SC_METHOD(Read_Data_File);
dont_initialize();
sensitive_pos(CLK);
CLK_COUNT = 0;
ifp = fopen("C:/SystemC/Hardware-Model/InputData/cnn1.vec","r");
}
void Read_Data_File();
};

-------------- stimulus.cpp -------------------
#include "stdio.h"
#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "stimulus.h"

void stimulus::Read_Data_File() {

if(fgets(line, 80, ifp)== NULL) {sc_stop();}
sscanf(line, "%x", &FileReadData);

CLK_COUNT++;
if (CLK_COUNT<4){
reset.write(true);
} else {
reset.write(false);
ADC_Data.write((int)FileReadData);
}
}

----------fir.h-----------------
SC_MODULE(fir){

sc_in_clk CLK;
sc_in<bool> reset;
sc_in<int> ipData;
sc_out<int> opData;

int TAP;
int DELAY;
int *filter_flops;
int *delay_flops;
int *coefs;

SC_CTOR(fir) {
SC_CTHREAD(filter, CLK.pos());
watching(reset.delayed() == true);
TAP = 0;
DELAY = 0;
coefs = new int[TAP];
filter_flops = new int[TAP];
delay_flops = new int[DELAY];
}

void SetCoefs(int NumTaps, int Delay, char *FileName);
void filter();
};
---------------fir.cpp-------------------
#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "fir.h"

void fir::filter() {
int acc;
int DataIn;
int i;
int delay_out;

for(i=0; i<=(TAP-1); i++) filter_flops[i] = 0;
for(i=0; i<=(DELAY-1); i++) delay_flops[i] = 0;
opData.write(0);
wait();

while(1){
DataIn = ipData.read();
acc = ipData*coefs[0];
for(i=(TAP-2); i>=0; i--) {
acc += filter_flops[i]*coefs[i+1];
};
for(i=(TAP-2); i>=0; i--) {
filter_flops[i+1] = filter_flops[i];
};
filter_flops[0] = DataIn;
acc /=256;

delay_out = (DELAY==0) ? acc : delay_flops[0];

for(i=0; i<DELAY-1; i++) {
delay_flops[i] = delay_flops[i+1];
};

delay_flops[DELAY-1] = acc;
opData.write(delay_out);

// opData.write(acc);
wait();
};
}

void fir::SetCoefs(int NumTaps, int Delay, char *FileName) {
FILE *ifp;
int i;
char line[80];

TAP = NumTaps;
DELAY = Delay;
coefs = new int[TAP];
filter_flops = new int[TAP-1];
delay_flops = new int[DELAY];
ifp = fopen(FileName, "r");

for (i=0; i<TAP; i++)
{
if(fgets(line, 80, ifp) != NULL)
*(coefs+i)= atoi(line);
}
}
------------ParameterizedDelay.h--------------------

SC_MODULE(ParametizedDelay){

sc_in_clk CLK;
sc_in<bool> reset;
sc_in<int> ipData;
sc_out<int> opData;
int DELAY;
int *delay_flops;
int rPoint;

SC_CTOR(ParametizedDelay) {
SC_CTHREAD(DelayIt, CLK.pos());
watching(reset.delayed() == true);
DELAY = 0;
delay_flops = new int[DELAY];
}

void SetDelay(int Delay);
void DelayIt();
};
---------------ParameterizedDelay.cpp--------------------
#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "ParametizedDelay.h"

void ParametizedDelay::DelayIt() {
int DataIn;
int delay_out;

while(1){
DataIn = ipData.read();
delay_out = *(delay_flops+rPoint);
*(delay_flops+rPoint) = DataIn;
opData.write(delay_out);
rPoint++;
rPoint %=DELAY;
// cout << rPoint <<":"<<DataIn<<endl;
wait();
};
}

void ParametizedDelay::SetDelay(int Delay) {
int i;
DELAY = Delay-1;
delay_flops = new int[DELAY];
for (i=0;i<=DELAY-1; i++)delay_flops[i]=0;
rPoint = 0;
}

-----------------display.h---------------------
SC_MODULE(display) {
sc_in<int> lpf;
sc_in<int> Line1;
sc_in<int> Line2;
sc_in<int> Line3;
sc_in<int> Line4;
sc_in<bool> CLK;

FILE *ofp_lpf;
FILE *ofp_line1;
FILE *ofp_line2;
FILE *ofp_line3;
FILE *ofp_line4;

SC_CTOR(display)
{
SC_METHOD(Monitor);
dont_initialize();
sensitive_pos(CLK);
ofp_lpf = fopen("lpf.hex","w");
ofp_line1 = fopen("line1.hex","w");
ofp_line2 = fopen("line2.hex","w");
ofp_line3 = fopen("line3.hex","w");
ofp_line4 = fopen("line4.hex","w");
}

void Monitor();
};

-----------display.cpp---------------------

#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "display.h"

void display::Monitor(){
fprintf(ofp_lpf, "%03x\n", lpf.read());
fprintf(ofp_line1, "%03x\n", Line1.read());
fprintf(ofp_line2, "%03x\n", Line2.read());
fprintf(ofp_line3, "%03x\n", Line3.read());
fprintf(ofp_line4, "%03x\n", Line4.read());
}

------------LPF.Coeff----------
1
9
12
21
18
33
54
33
18
21
12
9
1

Finally, the FourInOne is the one that I am having problem creating,
can someone help? Thanks
Jul 22 '05 #1
Share this Question
Share on Google+
1 Reply


P: n/a
"David Li" <me*******@yahoo.com> wrote in message
news:c4**************************@posting.google.c om...
FourInOne FourInOne("FourInOne"); // This would be the new module
added here. [snip] FourInOne.SetDelay(500); //Added
FourInOne.CLK(clock.signal()); //Added
FourInOne.reset(reset); //Added
FourInOne.ipBotLine(ADC_Data); //Added
FourInOne.opCurLine(Line1_Out); //Added
FourInOne.opCurLine(Line2_Out); //Added
FourInOne.opCurLine(Line3_Out); //Added
FourInOne.opTopLine(Line4_Out); //Added
It looks like you want FourInOne to be a class, but you did not provide your
code for FourInOne. Why are you trying to create an instance of FourInOne
called FourInOne? Do you really want some static methods? Are you merely
trying to move some logic into another source file?
As you can see, my purpose is to be able to create new levels of logic
as design gets bigger. But the code doesn't work and can not compile.


The compiler's diagnostic message would be helpful.

--
David Hilsee
Jul 22 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.