#define ERRORMODE 7
-#define STATUSBITS 0,1
+#define STATUSBITS 24,26
#define HEADER_HEADER 0x0
#define HEADER_TERM 0x1
#define HEADER_BUF 0x2
unsigned int get_value(int a, int b) {
unsigned int bla=0;
- for (int i=a,j=1;i<b;i++,j*=2) {
- if (cont[i]) bla+=j;
+
+ for (int i=a,j=1;i<=b;i++,j*=2) {
+ //cout << "cont" << cont[i] << endl;
+ if (cont[i]==1) bla+=j;
}
return bla;
};
// };
void set(unsigned int bla) {
- unsigned int val = pow(2.,size);
+ unsigned int val = (unsigned int) pow(2.,size-1);
for (int i=(size-1);i>=0;i--) {
if (bla >= val) {
bla -= val;
cont[i]=1;
+ //cout << 1;
} else {
cont[i]=0;
+ //cout << 0;
}
-
+ //cout << endl;
val /=2;
}
out_vector28 SIGOUT;
void Logic(void){
+ regarray[pointer_write].WRITE=WRITE;
if (counter) EMPTY=0; else EMPTY=1;
for (int i=0;i<28;i++) {
(regarray[pointer_write].SIGIN(i))=(SIGIN(i));
(SIGOUT(i))=(regarray[pointer_read].SIGOUT(i));
}
+
+ //cout << pointer_write << ":" << pointer_read << ":" << SIGIN.get_value(0,27) << endl;
+
}
void NextCLK(void){
+
+ for (unsigned int i=0;i<depth;i++) regarray[i].NextCLK();
+
+ //cout << pointer_write << ":" << pointer_read << ":" << SIGIN.get_value(0,27) << endl;
+ //cout << regarray[pointer_write].SIGIN.get_value(0,27) << ":" << regarray[pointer_read].SIGOUT.get_value(0,27) << endl;
if (WRITE) {
counter++;
//cout << "ac=" << counter << endl;
pointer_read++;
if (pointer_read == depth) pointer_read=0;
}
- for (int i=0;i<depth;i++) regarray[i].NextCLK();
+
+
+
+
}
private:
unsigned int counter, depth;
buffer->WRITE = 0;
}
-
- if ((!(buffer->EMPTY)) || (WRITE)) { //BUFFER has data
+ if ((!(buffer->EMPTY)) && READ) { //BUFFER has data
if (mystate==FREEMODE) {
if (buffer->SIGOUT.get_value(STATUSBITS) == HEADER_HEADER) { //word to be read is a header
buffer->READ = READ; //yes, read header
DATAREADY = 1;
nextstate = TRANSFERMODE;
} else if (buffer->SIGOUT.get_value(STATUSBITS) == HEADER_TERM) { //TERM transfer
+ //cout << buffer->SIGOUT.get_value(STATUSBITS) << endl;
buffer->READ = 1; //clean TERM
header.WRITE = 0;
headerterm.WRITE = 1; //
} else if (buffer->SIGOUT.get_value(STATUSBITS) == HEADER_DATA) {
buffer->READ = READ;
header.WRITE = 0;
- headerterm.WRITE = 0; //I do not keep BUF header?
+ headerterm.WRITE = 0;
DATAREADY = 0;
- nextstate = WAITINGMODE;
+ nextstate = TRANSFERMODE;
}
}//TRANSFER
else if ((mystate==TERMMODE) || (mystate==WAITINGMODE)) { //after TERM, nothing should be inside
if (CLEAN)
nextstate = FREEMODE;
else
- nextstate = WAITINGMODE;
+ nextstate = TERMMODE;
}
}
cout << "W=" << WRITE << " R=" << READ << " DR=" << DATAREADY << " st=" << mystate
<< " EMP=" << buffer->EMPTY
- << " buf=" << buffer->SIGOUT.get_value(0,27)
+ << " buf=" << std::hex << buffer->SIGOUT.get_value(0,27)
<< endl;
}
if (i==0) {
//write a word into buf
buf.WRITE=1;
- buf.READ=1;
- buf.SIGIN.set(0x0000u); // empty header
- }
- else if (i==1) {
- buf.READ=0;
- buf.WRITE=0;
+ buf.SIGIN.set(0x00000000u); // empty header
}
- else {
- buf.READ=0;
- buf.WRITE=0;
+ else if (i==1) {
+ buf.WRITE=1;
+ buf.SIGIN.set(0x03000000u); // data word
}
+ else if (i==2) {
+ buf.WRITE=1;
+ buf.SIGIN.set(0x01000000u); // term word
+ }
+
+
+ else buf.WRITE=0;
+
+ if (i==2)
+ buf.READ=1;
+ else if (i==4)
+ buf.READ=1;
+ else if (i==6)
+ buf.READ=1;
+ else buf.READ=0;
+
+
for (int l=0;l<100;l++) buf.Logic();