/* * 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); }
/* * 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); }