]> jspc29.x-matter.uni-frankfurt.de Git - trbnet.git/commitdiff
first state machine
authorhades <hades>
Thu, 9 Mar 2006 17:53:41 +0000 (17:53 +0000)
committerhades <hades>
Thu, 9 Mar 2006 17:53:41 +0000 (17:53 +0000)
basic.h
bufcx.cc
hubtest.cc

diff --git a/basic.h b/basic.h
index 033879d425cc3a108181174bfa5e3a0b4e254e33..457c200f60f6b3f0343220c7b45d4bacc2571b37 100644 (file)
--- a/basic.h
+++ b/basic.h
@@ -40,7 +40,7 @@ using namespace std;
 
 #define ERRORMODE   7
 
-#define STATUSBITS    0,1
+#define STATUSBITS    24,26
 #define HEADER_HEADER 0x0
 #define HEADER_TERM   0x1
 #define HEADER_BUF    0x2
@@ -62,8 +62,10 @@ class STD_LOGIC_ARRAY {
 
     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;
     };
@@ -74,15 +76,17 @@ class STD_LOGIC_ARRAY {
 //    };
 
     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;
  
        }
@@ -205,14 +209,23 @@ public:
     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;
@@ -225,7 +238,10 @@ public:
            pointer_read++;
            if (pointer_read == depth) pointer_read=0;
        }
-       for (int i=0;i<depth;i++) regarray[i].NextCLK();
+
+
+       
+
     }
  private:
     unsigned int counter, depth;
index 352203ae0f0147bbd5bb549ce7fbc0823bdb7606..d1ef63473ad7b161f3601e9cbf560a39b94bc2f0 100644 (file)
--- a/bufcx.cc
+++ b/bufcx.cc
@@ -13,8 +13,7 @@ void IBUFCX::Logic(void){
        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
@@ -45,6 +44,7 @@ void IBUFCX::Logic(void){
                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;  //
@@ -59,9 +59,9 @@ void IBUFCX::Logic(void){
            } 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
@@ -102,7 +102,7 @@ void IBUFCX::Logic(void){
            if (CLEAN) 
                nextstate = FREEMODE;
            else
-               nextstate = WAITINGMODE;
+               nextstate = TERMMODE;
        }
     }
 
@@ -124,7 +124,7 @@ void IBUFCX::Dump(void) {
     
     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;
 }
index 5544f5a76391e57d9366dea75294da60f4492ba9..992644312752eb2ad284b5a44f79c8c8f5573a60 100644 (file)
@@ -10,17 +10,29 @@ int main(void) {
        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();