Forum: FPGA, VHDL & Co. Test Applikation für UDP/IP Core


von Sebastian (Gast)


Lesenswert?

Hallo,

ich benutze den UDP/IP Core von Opencores.org (auch hier zu finden: 
http://wwwkramer.in.tum.de/exelixis/software.html)

Mein Problem ist, eine minimale Testapplikation für eine "best effort" 
Übertragung FPGA->PC zu bauen. Momentan sieht das Modul, das direkt am 
UDP-Core hängt und möglichst schnell immer die gleichen Daten übertragen 
soll, wie folgt aus:

send_proc : process (ctrl_clk)
  begin
  if rising_edge(ctrl_clk) then
    if ctrl_reset = '0' then -- global reset
        datagram_length <= MAX_DGRAM_LENGTH;
        if cnt < datagram_length then
          if ctrl_tx_phase_on = '1' then
            dgram_sent <= '0';
            ctrl_tx_data_out <= "01010101";
            cnt <= cnt + 1;
          else
            cnt <= 0;
          end if;
        else
          dgram_sent <= '1';
          cnt <= 0;
        end if;
    end if; -- reset
  end if; --clk
  end process send_proc;

  enable_proc : process(ctrl_clk)--frame_buf_valid, cnt)
    variable i : integer := 0;
    variable k : integer := 0;
  begin
    if rising_edge(ctrl_clk) then
      if dgram_sent = '1' and i = 0 then
        if k < 100000 then
          k := k + 1;
        else
          i := i + 1;
          ctrl_tx_start_enable <= '1';
        end if;
      else
        k := 0;
        i := 0;
        ctrl_tx_start_enable <= '0';
      end if;
    end if;
  end process enable_proc;

Im Sendeprocess wird einfach immer das gleiche UDP-Datagramm geschickt 
und im enable Prozess wird das start-enable zum UDP-Core gesetzt, wenn 
ein neues Datagram gesendet werden kann. Außerdem habe ich dort mithilfe 
der variable k ein delay zwischen 2 Datagrammen eingebaut - damit 
funktioniert die Übertragung fehlerfrei. Wenn ich dieses delay weglasse 
(-> best effort), kann ich fehlerhafte Datagramme in Wireshark 
beobachten, was konkret heißt, dass in der payload nicht die korrekte 
anzahl an datanbytes ist (i.d.R. immer zu wenige datenbytes vorhanden).
Kann mir jemand einen Tipp geben wo mein Fehler liegt bzw. wie man so 
eine Funktionalität richtig angeht?
Auf PC-Seite habe ich für den Empfang einfach ein C-Programm mit einem 
UDP Socket und recvfrom() in einer Endlosschleife.

Besten Dank im Voraus!
Sebastian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.