From 1afdaf161a7e2e83fd1ed6b07729f39978f24a07 Mon Sep 17 00:00:00 2001 From: hades Date: Fri, 10 Mar 2006 13:17:42 +0000 Subject: [PATCH] iobuf and ACK creation working, Ingo --- Makefile | 2 +- basic.h | 160 ++++++++++++----------------------------------------- hubtest.cc | 38 +++++++++---- ibufcx.cc | 139 ++++++++++++++++++++++++++++++++++++++++++++++ ibufcx.h | 47 ++++++++++++++++ iobufcx.cc | 40 ++++++++++++++ iobufcx.h | 54 ++++++++++++++++++ obufcx.cc | 43 ++++++++++++++ obufcx.h | 39 +++++++++++++ 9 files changed, 424 insertions(+), 138 deletions(-) create mode 100644 ibufcx.cc create mode 100644 ibufcx.h create mode 100644 iobufcx.cc create mode 100644 iobufcx.h create mode 100644 obufcx.cc create mode 100644 obufcx.h diff --git a/Makefile b/Makefile index 366263c..85b3f03 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ .SUFFIXES: .cc -OBJS = bufcx.o hubtest.o +OBJS = ibufcx.o obufcx.o iobufcx.o hubtest.o basic.o CXX = g++ CXXFLAGS = -g -O3 -Wall -fPIC diff --git a/basic.h b/basic.h index 457c200..d2c6de5 100644 --- a/basic.h +++ b/basic.h @@ -40,6 +40,11 @@ using namespace std; #define ERRORMODE 7 +#define OBUF_FREEMODE 1 +#define OBUF_CLEARMODE 2 +#define OBUF_WAITINGMODE 3 + + #define STATUSBITS 24,26 #define HEADER_HEADER 0x0 #define HEADER_TERM 0x1 @@ -52,59 +57,19 @@ using namespace std; class STD_LOGIC_ARRAY { public: - STD_LOGIC_ARRAY(int mysize) { - cont= new int[mysize]; - size=mysize; - }; - STD_LOGIC_ARRAY() { - size=0; - } - - unsigned int get_value(int a, int b) { - unsigned int bla=0; - - 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 operator=(const unsigned int & bla){ -// for (int i=0;i=0;i--) { - if (bla >= val) { - bla -= val; - cont[i]=1; - //cout << 1; - } else { - cont[i]=0; - //cout << 0; - } - //cout << endl; - val /=2; - - } - - } - - void operator=(const STD_LOGIC_ARRAY & other){ - for (int i=0;iSIGOUT; + buffer->SIGIN = SIGIN; + + if (WRITE == 1) { //BUGBUG check if fifo is not full + buffer->WRITE = 1; + } else{ //BUGBUG check if fifo is not full + buffer->WRITE = 0; + } + + if ((!(buffer->EMPTY))) { //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 + header.WRITE = 1; + headerterm.WRITE = 0; + DATAREADY = 1; + if (READ) + nextstate = TRANSFERMODE; + else + nextstate = FREEMODE; + } else if (buffer->SIGOUT.get_value(STATUSBITS) == HEADER_TERM) { //TERM transfer + buffer->READ = 1; //clean TERM + header.WRITE = 0; + headerterm.WRITE = 1; // + DATAREADY = 0; + if (READ) + nextstate = TERMMODE; + else + nextstate = FREEMODE; + } else { //something is wrong...first word MUST be header or TERM + buffer->READ = 1; //clean wrong word + header.WRITE = 0; + headerterm.WRITE = 0; + DATAREADY = 0; + nextstate = ERRORMODE; + } + } //FREEMODE + else if (mystate==TRANSFERMODE) { + if (buffer->SIGOUT.get_value(STATUSBITS) == HEADER_HEADER) { //word to be read is a header + buffer->READ = READ; //yes, read header + //cout << "a" << endl; + header.WRITE = 1; + headerterm.WRITE = 0; + 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; // + DATAREADY = 0; + nextstate = TERMMODE; + } else if (buffer->SIGOUT.get_value(STATUSBITS) == HEADER_BUF) { //ask for new buffer + buffer->READ = 1; //clean TERM + header.WRITE = 0; + headerterm.WRITE = 0; //I do not keep BUF header? + DATAREADY = 0; + nextstate = WAITINGMODE; + } else if (buffer->SIGOUT.get_value(STATUSBITS) == HEADER_DATA) { + buffer->READ = READ; + header.WRITE = 0; + headerterm.WRITE = 0; + DATAREADY = 1; + nextstate = TRANSFERMODE; + } + }//TRANSFER + else if ((mystate==TERMMODE) || (mystate==WAITINGMODE)) { //after TERM, wait for CLEAR + buffer->READ = 0; + header.WRITE = 0; + headerterm.WRITE = 0; //I do not keep BUF header? + DATAREADY = 0; + if (CLEAR) + nextstate = FREEMODE; + else + nextstate = mystate; + } + } // BUFFER is not EMPTY + else { //BUFFER IS EMPTY + if (mystate==FREEMODE) { + buffer->READ = 0; + header.WRITE = 0; + headerterm.WRITE = 0; + DATAREADY = 0; + nextstate = FREEMODE; + } else if (mystate==TRANSFERMODE) { + buffer->READ = 0; + header.WRITE = 0; + headerterm.WRITE = 0; + DATAREADY = 0; + nextstate = TRANSFERMODE; + } else if (mystate==WAITINGMODE) { + buffer->READ = 0; + header.WRITE = 0; + headerterm.WRITE = 0; + DATAREADY = 0; + if (CLEAR) + nextstate = FREEMODE; + else + nextstate = WAITINGMODE; + } else if (mystate==TERMMODE) { + buffer->READ = 0; + header.WRITE = 0; + headerterm.WRITE = 0; + DATAREADY = 0; + if (CLEAR) + nextstate = FREEMODE; + else + nextstate = TERMMODE; + } + } + + + buffer->Logic(); + header.Logic(); + headerterm.Logic(); +}; + +void IBUFCX::NextCLK(void){ + mystate = nextstate; + buffer->NextCLK(); + header.NextCLK(); + headerterm.NextCLK(); +} + + +void IBUFCX::Dump(void) { + + cout << "W=" << WRITE << " R=" << READ << " DR=" << DATAREADY << " st=" << mystate + << " EMP=" << buffer->EMPTY + << " buf=" << std::hex << buffer->SIGOUT.get_value(0,27) + + << endl; +} diff --git a/ibufcx.h b/ibufcx.h new file mode 100644 index 0000000..4a51f9d --- /dev/null +++ b/ibufcx.h @@ -0,0 +1,47 @@ +#ifndef BUFCX +#define BUFCX + + +#include "basic.h" + +// +// input buffer for ONE channel and ONE port +// + + +class IBUFCX { +public: + IBUFCX() {RESET();}; + void RESET() { + buffer = new FIFO28(16); + buffer->RESET(); + WRITE=READ=DATAREADY=CLEAR=0; + mystate=FREEMODE; + }; + in WRITE,READ,RESENDHEADER,CLEAR; + out DATAREADY; //means that data can be transferred + // out TERM; //TERM header arrived + // out BUFFEREND; //ACK cycle has to be done + + void Logic(void); + + in STATEIN; + out STATEOUT; + in_vector28 SIGIN; + out_vector28 SIGOUT,HEADER,TERMHEADER; + + + void NextCLK(void); + + void Dump(void); + + + FIFO28 * buffer; + private: + + state mystate, nextstate; + REG28 header, headerterm; + +}; + +#endif diff --git a/iobufcx.cc b/iobufcx.cc new file mode 100644 index 0000000..f5a316f --- /dev/null +++ b/iobufcx.cc @@ -0,0 +1,40 @@ +#include "iobufcx.h" + + +void IOBUFCX::Logic(void){ + + //connect ibuf to obuf direct partner + myobuf.IBUF_STATEIN = myibuf.STATEOUT; + myibuf.CLEAR = myobuf.CLEAR_OUT; + + //connect obuf to streaming partner + myobuf.SIGIN = SIGIN_INT; + myobuf.DATAREADY_IN = DATAREADY_IN_INT; + READ_OUT_INT = myobuf.READ_OUT; + myibuf.READ = READ_IN_INT; + myibuf.RESENDHEADER = RESENDHEADER_IN_INT; + DATAREADY_OUT_INT = myibuf.DATAREADY; + + + //connect to media + SIGOUT = myobuf.SIGOUT; + myibuf.SIGIN = SIGIN; + myobuf.READ = READ; + DATAREADY = myobuf.DATAREADY; + myibuf.WRITE = WRITE; + + + myibuf.Logic(); + myobuf.Logic(); + +}; + +void IOBUFCX::NextCLK(void){ + myibuf.NextCLK(); + myobuf.NextCLK(); +} + + +void IOBUFCX::Dump(void) { + +} diff --git a/iobufcx.h b/iobufcx.h new file mode 100644 index 0000000..2ec451d --- /dev/null +++ b/iobufcx.h @@ -0,0 +1,54 @@ +#ifndef IOBUFCX_H +#define IOBUFCX_H + + + +#include "basic.h" +#include "ibufcx.h" +#include "obufcx.h" + +// +// output buffer for ONE channel and ONE port +// + + +class IOBUFCX { + public: + IOBUFCX() {RESET();}; + void RESET() { + }; + + void Logic(void); + + in_vector28 SIGIN_INT; //internal data + out_vector28 SIGOUT_INT; + + in_vector28 SIGIN; + out_vector28 SIGOUT; + + in READ_IN_INT; //Internal logic can read buffer + out READ_OUT_INT; //IOBUF is activating internal logic + out DATAREADY_OUT_INT; //means that data can be transferred + in DATAREADY_IN_INT; //from other IBUF (stream partner) + out READ_OUT; //read from other IBUF (stream partner) + + in RESENDHEADER_IN_INT; //in-streaming have to resend header + in WRITE; //media is putting data into IBUF + out READ; //media is reading data + out DATAREADY; //media knows that I have somthing to offer + + + void NextCLK(void); + + void Dump(void); + + IBUFCX myibuf; + OBUFCX myobuf; + + + private: + + +}; + +#endif diff --git a/obufcx.cc b/obufcx.cc new file mode 100644 index 0000000..1db71db --- /dev/null +++ b/obufcx.cc @@ -0,0 +1,43 @@ +#include "obufcx.h" + + +void OBUFCX::Logic(void){ + if ((mystate==OBUF_FREEMODE) || (mystate==OBUF_WAITINGMODE)) { + if (IBUF_STATEIN == WAITINGMODE) { + //partner has got EOB and we should send an ACK + SIGOUT.set(HEADER_TERM << 24); //prepare ACK + if (READ) + nextstate = OBUF_CLEARMODE; + else + nextstate = OBUF_WAITINGMODE; + DATAREADY = 1; + READ_OUT = 0; + CLEAR_OUT = 0; + } + else { + //simply forward what I got + SIGOUT = SIGIN; + nextstate = OBUF_FREEMODE; + DATAREADY = DATAREADY_IN; + READ_OUT = READ; + CLEAR_OUT = 0; + } + } else if (mystate==OBUF_CLEARMODE) { + //simply forward what I got + SIGOUT = SIGIN; + nextstate = OBUF_FREEMODE; + DATAREADY = DATAREADY_IN; + READ_OUT = READ; + CLEAR_OUT = 1; //In addition, clear my partner + } + +}; + +void OBUFCX::NextCLK(void){ + mystate = nextstate; +} + + +void OBUFCX::Dump(void) { + cout << "ST: " << mystate << " R " << READ << " DR "<< DATAREADY << endl; +} diff --git a/obufcx.h b/obufcx.h new file mode 100644 index 0000000..8dab8e1 --- /dev/null +++ b/obufcx.h @@ -0,0 +1,39 @@ +#ifndef OBUFCX_H +#define OBUFCX_H + + +#include "basic.h" + +// +// output buffer for ONE channel and ONE port +// + + +class OBUFCX { + public: + OBUFCX() {RESET();}; + void RESET() { + mystate=OBUF_FREEMODE; + READ=DATAREADY=READ_OUT=CLEAR_OUT=0; + }; + + void Logic(void); + + in IBUF_STATEIN; //I have to know what my partner is doing + in_vector28 SIGIN; + out_vector28 SIGOUT; + in READ; + out DATAREADY; //means that data can be transferred + in DATAREADY_IN; //from other IBUF (stream partner) + out READ_OUT; //read from other IBUF (stream partner) + out CLEAR_OUT; //clear my direct partner + + void NextCLK(void); + + void Dump(void); + + private: + state mystate, nextstate; +}; + +#endif -- 2.43.0