Forum: FPGA, VHDL & Co. RGMII mit Cyclone IV + Probleme mit SignalTrap


von nuts (Gast)


Angehängte Dateien:

Lesenswert?

Moin Jungs,
ihr könnt mir bestimmt helfen, da ihr bestimmt auch schon auf solche 
Phänomene getroffen seid.

Ich wollte die letzte Zeit bisschen Ethernet mit meinem FPGA (speedgrade 
7) machen (welcher mit einem Mavell 88E1111 quatschen soll). MII 100M 
hab ich implementiert - geht auch. RGMII 100M hab ich implementiert und 
geht auch. Es gibt keine Widersprüche zwischen Modelsim, Signaltrap und 
Wireshark. Funktioniert alles soweit.
Ich hab allerdings jetzt beim Gigabit meine Probleme.

Weil 1GE mit RGMII ja gezeitmultiplext werden muss und kein 
doppelflankengesteuertes FF vorhanden ist, kann man ja entweder mit --> 
"case clk is when 1/0 => dann blaa;" multiplexen oder zwei Zähler, wobei 
der eine bei rising und der andere bei falling edge zählt, nehmen. Bei 
den Zählern hab ich dann eine "case ($Wert mod 2) is" angehängt.
Der Frame ist schon fertig in der architecure als vektor hinterlegt. 
Erste Variante sieht dann z.B. so aus :
1
transmit_data_muxed : process (tx_clk, frame_counter, start_tx, error_tx)
2
begin
3
  if start_tx = '1' then
4
    case tx_clk is 
5
      when '0' => 
6
        tx_data <= framedata_neu  (to_integer(frame_counter)*8 + 3 downto (to_integer(frame_counter)*8));
7
      when '1' =>
8
        tx_en <= '1';
9
        tx_data <= framedata_neu  (to_integer(frame_counter)*8 + 7 downto (to_integer(frame_counter)*8+4));
10
      when others =>
11
    end case;
12
  else 
13
    if tx_clk = '1' then 
14
      tx_en <= '0';
15
    end if;
16
  end if;
17
end process;

Die Startbedingung und Abbruchbedingung wird von einer FSM aus einem 
anderen Prozess gemacht.
1
when txSTATE =>
2
  if frame_counter = unsigned(framelength_in) then 
3
    tx_successful <= '1';
4
    start_tx <= '0';
5
    nextstate <= ifgSTATE;
6
  else 
7
    if start_tx = '1' then 
8
      frame_counter <= frame_counter + 1;
9
    end if;
10
    start_tx <= '1';
11
  end if;


tx_clk ist via PLL auf 125MHz geschraubt und der gtx_clk der am PHY 
anliegt ist um +90° Phasenverschoben 125MHz.

Nun sieht die ModelSim(ulation) auch sehr gut aus - tx_en geht mit der 
ersten x"5" an und hört mit dem letzten CRC-Nibbel auf.

Wireshark hat allerdings kein Paket empfangen, sondern lediglich CRC 
Fehler gemeldet, weswegen ich mit Signaltrap nach geschaut habe.

Mit Signaltrap messe ich eigentlich nur die Signale am PHY. Wenn ich nun 
Signaltrap mit 25MHz gtx_clk und 100MHz Referenztakt laufen lasse, sieht 
die Messung wie im Modelsim aus (siehe Bild). Sollte also passen.
Wenn ich aber auf 125MHz hoch gehe und als Referenztakt 250MHz angebe 
(ich muss ja bei steigender und bei fallender Flanke vom Sendetakt was 
messen/abtasten) kommt nur noch Bullshit raus. Ich schätze mal der 
Signaltrap macht da Scheiße und meine Ergebisse sind nicht brauchbar ?!


Ja, genau -
mich verwirren die Ergebnisse vom SignalTrap. Sind die wirklich kacke, 
oder ich einfach zu doof?
Seht ihr auf anhieb, warum mein RGMII nich funktionieren mag?

lg

von Marius W. (mw1987)


Lesenswert?

Wieso nimmst du zur Ausgabe keinen DDR-Buffer? Das ist doch genau das, 
was du brauchst?! Also ein ALTDDIO_OUT... Kannst du dir im Megawizard 
erstellen.

Gruß
Marius

von PittyJ (Gast)


Lesenswert?

Ich habe das auch mit einem vom Megawizard erstellten DDR Out Port 
gemacht.
Funktionierte am besten.


  -- this component is generated by the megawizard
  -- 3 downto 0 is the data nibble,
  -- 4 is the TX_Enable bit
  component DDR_OUT IS
    PORT
    (
      datain_h    : IN STD_LOGIC_VECTOR (4 DOWNTO 0);
      datain_l    : IN STD_LOGIC_VECTOR (4 DOWNTO 0);
      outclock    : IN STD_LOGIC ;
      dataout    : OUT STD_LOGIC_VECTOR (4 DOWNTO 0)
    );
  END Component DDR_OUT;



  DDROutport : DDR_OUT
  port map
  (
    datain_h(3 downto 0) => OutByte(3 downto 0),    -- lower data nibble
    datain_h(4)          => TXOut,            -- tx out
    datain_l(3 downto 0) => OutByte(7 downto 4),    -- upper data nibble
    datain_l(4)          => TXOut,            -- tx out
    outclock             => Clock_125MHz,        -- 125 mhz
    dataout(3 downto 0)   => NibbleOut,          -- data to the phy
    dataout(4)           => TX_CTL            -- tx enable to the phy
  );

von nuts (Gast)


Lesenswert?

ah Interessant. Von dem ALTDDIO hab ich im Alterapaper schon was gelesen 
und wollte das auch irgendwann mal noch ausprobieren. Werd ich wohl nun 
sicher machen ^^

Hehe, ich steh halt immer auf das "selber schreiben" aber bei 1GE weiß 
ich nicht woran es hängt und hab auch noch keine Idee wie ich es heraus 
finden kann.


Un zu SignalTrap - scheint nicht das Non-Plus-Ultra zu sein (zumindest 
wenn ich mich bei der Anwendung nicht zu blöd angestellt habe)


Grüße

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.