Forum: GNU Radio problem with start/end of burst inband FPGA code

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
George N. (Guest)
on 2007-08-02 01:00
(Received via mailing list)
Hey all,

We're looking for someone to look over our shoulder on an inband FPGA
problem we've been stuck on for a couple days now.

The problem is that we never had code that throws out additional packets
in a burst if the initial packet had a timestamp that expired.  When an
m-block message is fragmented into multiple USB packets, the packets are
considered a single burst, where the first packet has the start of burst
flag set and the last packet has the end of burst flag set.  The first
packet has the timestamp set to the desired timestamp, and each
additional packet in the burst is given the 'NOW' timestamp.

The problem was that our code would throw away the first packet if the
timestamp expired, but the additional packets in the burst had a
timestamp of 'NOW' so they would be sent... but they shouldn't be since
they are part of an 'expired' burst.

Ok, so on to the code:
http://gnuradio.org/trac/browser/gnuradio/branches...

The logic needs to be "if the packet with the start of burst flag was
thrown away, throw away all packets until we see the end of burst flag."

If we see the start of burst flag, we set 'burst' to be 1.
http://gnuradio.org/trac/browser/gnuradio/branches...

If the timestamp has expired on the packet, set 'trash' to 1, and 'skip'
set to 1:
http://gnuradio.org/trac/browser/gnuradio/branches...

Finally, if we get a packet that does not have start of burst set, it
*must* be an intermediate packet or the last packet in a burst... either
way it does not matter.  If 'trash' is set to 1, we want to skip it:
http://gnuradio.org/trac/browser/gnuradio/branches...

If we see the end of burst flag, 'burst' is reset:
http://gnuradio.org/trac/browser/gnuradio/branches...

If the next packet has a correct timestamp, we set trash back to 0.  We
could just set trash to 0 when end of burst is read, but it doesn't
really matter:
http://gnuradio.org/trac/browser/gnuradio/branches...

So... as you can guess, this doesn't work.  This hasn't been our only
attempt.  We've trashed the code and re-written it a couple different
times with no success.

To test this we've been setting all packets to have a timestamp of 0.
This means we should get no sine wave on an oscope when transmitting,
regardless of the number of packet sin the burst.  However, we see
chunks of the wave here and there when the number of packets in the
burst is greater than 1.  If we set it so that a single m-block message
only creates 1 USB packet, it works... everything is thrown away.

We'd greatly appreciate any help, thanks!

- George, Leo
Jeff B. (Guest)
on 2007-08-02 01:25
(Received via mailing list)
George-

> We'd greatly appreciate any help, thanks!

I started to take a look at your Verilog code and see if I could find
something, then
stopped.  Can you repost it with correct indent/alignment?  It's hard to
read when
you've got something like this:


                    if  (fifodata[`STARTOFBURST] == 1
                       && fifodata[`ENDOFBURST] == 1)
                       burst <= 0;
                    else if (fifodata[`STARTOFBURST] == 1)
                        burst <= 1;
                    else if (fifodata[`ENDOFBURST] == 1)
                        burst <= 0;

                                    //Check trash
                                    if (trash == 1 &&
fifodata[`STARTOFBURST] == 0)
                                    begin
                                            trash <= 1;
                                            skip <= 1;
                                            reader_state <= IDLE;
                                    end
                                    else
                                    begin
                            payload_len <= fifodata[`PAYLOAD] ;
                            read_len <= 0;
                        reader_state <= TIMESTAMP;
                        rdreq <= 1;
                                    end
                end

which should be:

                    if  (fifodata[`STARTOFBURST] == 1 &&
fifodata[`ENDOFBURST] == 1)
                       burst <= 0;
                    else if (fifodata[`STARTOFBURST] == 1)
                       burst <= 1;
                    else if (fifodata[`ENDOFBURST] == 1)
                       burst <= 0;

                  //Check trash
                    if (trash == 1 && fifodata[`STARTOFBURST] == 0)
                    begin
                       trash <= 1;
                       skip <= 1;
                       reader_state <= IDLE;
                    end
                    else
                    begin
                       payload_len <= fifodata[`PAYLOAD] ;
                       read_len <= 0;
                       reader_state <= TIMESTAMP;
                       rdreq <= 1;
                   end

Maybe one of your guys is using tabs and another isn't, or something
like that.  If
so it might help to establish some basic source code rules for a
multi-person
project.

-Jeff
Brian P. (Guest)
on 2007-08-02 02:08
(Received via mailing list)
On 8/1/07, George N. <removed_email_address@domain.invalid> wrote:
> Ok, so on to the code:
> 
http://gnuradio.org/trac/browser/gnuradio/branches...

As a general rule, you shouldn't have dangling if-else statements
meaning where there's an if, there's an else.  Otherwise, the hardware
isn't sure what is the default thing to do.  Try to write your
statements so you end everything with an else.

Second, does this code have a testbench?  If not, it really should.

Lastly, diagram it out.  Even if it's just for documents sake, make an
ASM chart of the process you are trying to accomplish.  There are some
things in the code which are too complicated, and this might help you
out.

ASM Chart link:
    http://uhaweb.hartford.edu/jmhill/suppnotes/AsmCha...

Complicated thing:

                   //Check Start/End burst flag
                   if  (fifodata[`STARTOFBURST] == 1 &&
fifodata[`ENDOFBURST] == 1)
                       burst <= 0;
                   else if (fifodata[`STARTOFBURST] == 1)
                       burst <= 1;
                   else if (fifodata[`ENDOFBURST] == 1)
                       burst <= 0;

A burst is started when there is a start of burst, or if we're already
in a burst and it's not the end of a burst, right?  Otherwise, we're
not bursting?  I could very well be wrong, but definitely setup the
flow chart - diagram what you want it to do.

Jeff has a point as well - try to stick with spaces OR tabs, but don't
mix them both (I like 4 spaces myself), but stick to one and go with
it.

Good luck.

Brian
Eric B. (Guest)
on 2007-08-02 04:49
(Received via mailing list)
On Wed, Aug 01, 2007 at 06:07:07PM -0400, Brian P. wrote:
> On 8/1/07, George N. <removed_email_address@domain.invalid> wrote:
> > Ok, so on to the code:
> > 
http://gnuradio.org/trac/browser/gnuradio/branches...
>
>
> Jeff has a point as well - try to stick with spaces OR tabs, but don't
> mix them both (I like 4 spaces myself), but stick to one and go with
> it.

Tab characters in the file must expand to 8.

Eric
This topic is locked and can not be replied to.