mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL: RMII und CRS_DV


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: D. C. (gnd)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Community,

ich versuche gerade RMII in VHDL umzusetzen (GHDL und Gtkwave).
Dabei bin ich gerade über etwas gestolpert, bei dem ich aufgrund meiner
noch fehlenden Expertise gar nicht weiß ob das überhaupt möglich ist.

Also ich möchte aus dem RMII Signal CRS_DV (Rev 1.2) das Signal RX_DV
extrahieren (wie im Bild).

Eine Lösung wäre erst nach der letzten fallenden Flanke von CRS_DV (Rev
1.2) die nächste fallende Flanke von REF_CLK abzuwarten und dann dort
auszuwerten ob
if falling_edge(REF_CLK) then
   if (CRS = '0') AND (CRS_DV = '0') AND (DIBIT = das richtige) then
     RX_DV <= '0';
   end if;
end if;
Damit wäre aber RX_DV synchron zur fallenden Flanke von REF_CLK und 
damit einen halben Takt zu spät.

Damit ich nun RX_DV wirklich synchron zur steigenden Flanke von REF_CLK
setzen kann (wie im Bild), müsste ich zeitgleich bei der steigenden
Flanke von REF_CLK prüfen ob CRS_DV gerade auch eine steigende Flanke 
hat.

Ist das möglich? Oder gibt es eine andere Lösung?

PS: RMII Spezifikation habe ich voll verstanden nur alle Möglichkeiten
von VHDL sind mir noch unklar :-)
PS2: Aus den RXD Daten oder der Anzahl der Bits kann man keine 
Rückschlüsse
ziehen, es könnten auch noch viele weitere Flanken beim CRS_DV folgen.


Vielen Dank im Voraus.

Autor: User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das DV (rdv_qq) Signal lässt sich zurückgewinnen indem man folgendes 
macht

   process(clk_i)
   begin
      if rising_edge(clk_i) then
            crsdv_q     <= crsdv_i;
            crsdv_qq    <= crsdv_q;
            crsdv_qqq   <= crsdv_qq;
         end if;
      end if;
   end process;

   rdv_qq <= (crsdv_q or crsdv_qq) and (crsdv_qq or crsdv_qqq);
   crs_qq <= (crsdv_q and crsdv_qq) or (crsdv_qq and crsdv_qqq);

die crs_qq und rdv_qq Signale sind jetzt um 2 Takte verschoben, somit 
müssen die Daten auch um 2 Takte verzögert werden damit alle Signale zur 
Verfügung stehen.

Autor: D. C. (gnd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
User schrieb:
> jetzt um 2 Takte verschoben

Das macht es ja leider nur schlimmer.

Autor: User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und die Daten auch um 2 Takte zu verzögern ist nicht möglich?

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was willst du simulieren Senden oder Empfangen?

CRS ist Carrier sense und ist asynchron und wird nur bei Halbduplex 
benötigt ob der Transportweg blockiert ist. Bei einem LAN Kabel ist 
alles Duplex.
Es sei du willst eine Eindraht oder Funkübertragung realisieren.

Autor: D. C. (gnd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
User schrieb:
> Und die Daten auch um 2 Takte zu verzögern ist nicht möglich?

Es geht mir nur derzeit darum ob es theoretisch überhaupt möglich ist.

Autor: D. C. (gnd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René D. schrieb:
> Was willst du simulieren Senden oder Empfangen?
>
> CRS ist Carrier sense und ist asynchron und wird nur bei Halbduplex
> benötigt ob der Transportweg blockiert ist. Bei einem LAN Kabel ist
> alles Duplex.
> Es sei du willst eine Eindraht oder Funkübertragung realisieren.

Es geht mir doch gar nicht um CRS.
Laut IEEE 802.3 existiert Half-Duplex auch für 100BASE-TX (auch wenn es 
nur in Spezialfällen verwendet wird.
Zudem kommt bald 10BASE-T1S:
"Supporting point-to-point half-duplex operation over the 15 m link 
segment"

Autor: D. C. (gnd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke ich habe die Lösung gefunden:
if rising_edge(REF_CLK) then
   if (CRS = '0') AND (CRS_DV = '0') AND (RXD = "00") AND (dibit_counter = "01") then
     RX_DV <= '0';
   end if;
end if;

Das hatte ich mehrfach überlesen:
" RXD[1:0] shall be “00” to indicate idle when CRS_DV is deasserted"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.