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