コード例 #1
0
        /*
         * Function: RecvFrame
         * Description: Receive and buffer an entire Ethernet frame.
         */
        public static uint RecvFrame(CircularFrameBuffer cfb)
        {
            // The start condition
            var doneReading = false;

            // Local variables - counters
            var  cnt   = 0U;
            uint psize = 0;

            while (!doneReading)
            {
                if (Emu.s_axis_tvalid && cfb.CanPush() && Emu.s_axis_tready) // Receive data
                {
                    cfb.PushData.Tkeep    = Emu.s_axis_tkeep;
                    cfb.PushData.Tlast    = Emu.s_axis_tlast;
                    cfb.PushData.Tdata0   = Emu.s_axis_tdata_0;
                    cfb.PushData.Tdata1   = Emu.s_axis_tdata_1;
                    cfb.PushData.Tdata2   = Emu.s_axis_tdata_2;
                    cfb.PushData.Tdata3   = Emu.s_axis_tdata_3;
                    cfb.PushData.TuserHi  = Emu.s_axis_tuser_hi;
                    cfb.PushData.TuserLow = Emu.s_axis_tuser_low;

                    Emu.s_axis_tready = !Emu.s_axis_tlast;

                    cfb.Push(cfb.PushData);

                    psize = cnt++;
                    // Condition to stop receiving data
                    doneReading = Emu.s_axis_tlast || !Emu.s_axis_tvalid;


                    if (!cfb.CanPush()) // Buffer is full, stop receiving data
                    {
                        Emu.s_axis_tready = false;
                    }
                }
                else if (!cfb.CanPush()) // Buffer is still full
                {
                    Emu.s_axis_tready = false;
                }
                else if (!Emu.s_axis_tready) // Restart receiving data
                {
                    Emu.s_axis_tready = true;
                }

                //Kiwi.Pause();
            }

            Emu.PktIn++;

            Emu.s_axis_tready = false;
            return(psize);
        }
コード例 #2
0
        /*
         * Function: RecvOne
         * Description: Receive and buffer a single segment of the ethernet frame.
         */
        public static bool RecvOne(CircularFrameBuffer cfb, bool stop, bool wait = false)
        {
            Emu.s_axis_tready = false;
            Emu.Status        = 1;
            while (wait)
            {
                wait = !Emu.s_axis_tvalid;
            }
            bool cont = !stop;

            if (Emu.s_axis_tvalid && cfb.CanPush())
            {
                Emu.s_axis_tready     = true;
                cfb.PushData.Tkeep    = Emu.s_axis_tkeep;
                cfb.PushData.Tlast    = Emu.s_axis_tlast;
                cfb.PushData.Tdata0   = Emu.s_axis_tdata_0;
                cfb.PushData.Tdata1   = Emu.s_axis_tdata_1;
                cfb.PushData.Tdata2   = Emu.s_axis_tdata_2;
                cfb.PushData.Tdata3   = Emu.s_axis_tdata_3;
                cfb.PushData.TuserHi  = Emu.s_axis_tuser_hi;
                cfb.PushData.TuserLow = Emu.s_axis_tuser_low;

                Emu.s_axis_tready = cont;

                cfb.Push(cfb.PushData);

                Emu.Status = 2;

                //Kiwi.Pause();
                return(true);
            }

            Emu.s_axis_tready = false;
            return(false);
        }