mikrocontroller.net

Forum: FPGA, VHDL & Co. Open Cores MAC mit Avalon Schnittstelle auf NIOSII EPM Demo Board


Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich weiss das viele Ähnliche fragen dieser Art schon beantwortet 
wurden, aber ein Forenbeitrag hilft mir machmal meine Probleme zu lösen.

ich versuche schon seit einiger Zeit den
Avalon OpenCores 10/100 Ethernet MAC:
http://www.niosforum.com/pages/project_details.php...

auf meinen NIOS-II EPM Demo Board zu betreiben.

Der MAC auf deisem Board ist zum glück mit MII angebunden, aber ich
habe immer noch probleme ihn anzuklemmen:

1. Ich weiss nciht wozu der ausgang padOE gedacht ist (den gibt es im 
Schaltplan
des Demo Board nicht.)- kann ich den einfach offen lassen?
2. MDIO ist ein Bidirektionaler pin, wie wurstel ich den an den
ip-Core(Md_pad_from_ocm und Md_pad_to_ocm).

Liebe Grüsse

Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Kompilieren bekomme ich die Fehlermeldung:

Error: Cannot use value BYPASS of parameter CLOCK_ENABLE_INPUT_A with 
device family Cyclone in altsyncram megafunction

Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok- er will den altsyncram für den Speicher des MAC auf eine weise 
initialisieren wie so mein alter
Cyclone 1 nicht unterstützt:

altsyncram  altsyncram_component (
    .wren_a         (wren_a     ),
    .clock0         (clock      ),
    .wren_b         (wren_b     ),
    .address_a      (address_a  ),
    .address_b      (address_b  ),
    .data_a         (data_a     ),
    .data_b         (data_b     ),
    .q_a            (q_a        ),
    .q_b            (q_b        ),
    .aclr0          (1'b0       ),
    .aclr1          (1'b0       ),
    .addressstall_a (1'b0       ),
    .addressstall_b (1'b0       ),
    .byteena_a      (1'b1       ),
    .byteena_b      (1'b1       ),
    .clock1         (1'b1       ),
    .clocken0       (1'b1       ),
    .clocken1       (1'b1       ),
    .clocken2       (1'b1       ),
    .clocken3       (1'b1       ),
    .eccstatus      (           ),
    .rden_a         (1'b1       ),
    .rden_b         (1'b1       )
);

was wäre eine alternative?

Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah-- jetz komm ich der sache shcon näher:

unter "defparam" habe ich  altsyncram_component.intended_device_family = 
"Cyclone" gesetzt aber ich weiss nicht wodurch ich die BYPASS ersetzt 
soll-
die Dokumentation für Cyclon1 macht mich auch nciht schlauer....

 defparam
       CLOCK0_component.address_reg_b = "CLOCK0",
        altsyncram_component.clock_enable_input_a = "BYPASS",
        altsyncram_component.clock_enable_input_b = "BYPASS",
        altsyncram_component.clock_enable_output_a = "BYPASS",
        altsyncram_component.clock_enable_output_b = "BYPASS",
        altsyncram_component.indata_reg_b = "CLOCK0",
        altsyncram_component.intended_device_family = "Cyclone",
        altsyncram_component.lpm_type = "altsyncram",
        altsyncram_component.numwords_a = DEPTH,
        altsyncram_component.numwords_b = DEPTH,
        altsyncram_component.operation_mode = "BIDIR_DUAL_PORT",
        altsyncram_component.outdata_aclr_a = "NONE",
        altsyncram_component.outdata_aclr_b = "NONE",
        altsyncram_component.outdata_reg_a = "UNREGISTERED",
        altsyncram_component.outdata_reg_b = "UNREGISTERED",
        altsyncram_component.power_up_uninitialized = "FALSE",
        altsyncram_component.read_during_write_mode_mixed_ports = 
"DONT_CARE",
        altsyncram_component.widthad_a = clogb2(DEPTH-1),
        altsyncram_component.widthad_b = clogb2(DEPTH-1),
        altsyncram_component.width_a = 32,
        altsyncram_component.width_b = 32,
        altsyncram_component.width_byteena_a = 1,
        altsyncram_component.width_byteena_b = 1,
        altsyncram_component.wrcontrol_wraddress_reg_b = "CLOCK0";

Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt einfach mal die "Bypass" durch "Normal" ersetzt:

 altsyncram_component.clock_enable_input_a = "NORMAL",
 altsyncram_component.clock_enable_input_b = "NORMAL",
 altsyncram_component.clock_enable_output_a = "NORMAL",
 altsyncram_component.clock_enable_output_b = "NORMAL",

Ich behersche keine Verilog und weiss nciht was das für auswirkungen 
haben kann.
Die Zeile
 CLOCK0_component.address_reg_b = "CLOCK0",
hatte ich falsch gepostet, es muss
altsyncram_component.address_reg_b = "CLOCK0",
  heissen.

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klappts?

Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja- die synthese klpappt jetzt mit diesen
einstellungen ... nun muss ich den Ethernet Stack zum laufen bringen

Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm jetzt hänge ich an der nächsten stellt-
es geht um einen Treiber für den TDK 78Q2120C Phy um ihn mit dem 
OpenCores MAC zubetreiben.... hat da jemand erfahrungen mit?

Laut dokumentation werden ja nur diese 4 Phys von dieser 
eth_ocm_phy_init();
auf anhiep unterstütz:

1.The Intel LXT972A 10/100 Ethernet PHY.
2.The Marvell 88E1111 10/100/1000 Ethernet PHY (used on the StratixIIGX 
Audio/Video development board).
3.The National Semiconductor DP83848C 10/100 PHY (used on the Cyclone 
III embedded development kit).
4.The Vitesse 8641 10/100/1000 Ethernet PHY.

Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok- ich versuche jetzt selbst einen treiber zu schreiben-
dabei ist mir aufgefallen das ich die register des Phy nicht
auslesen kann.
Diese werden doch über die diesen MDIO gelesen, der
eigendlich wie eine sPI schnittstelle funktioniert.

da der OpenCores MAC keinen Bidirektionalen MDIO hat,
sondern einen MDI und MDO wird wohl dieser MDOE nach dem ich
oben gefragt hatte, dafür
sein festzulegen wann geschrieben wird, und wann gelesen wir (????)

ich habs jetzt einfach mal mit VHDL so verdrahtet:
if (mOE = '0') then mio <= mO; else mI <= mio;  end if;

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich habs jetzt einfach mal mit VHDL so verdrahtet:
> if (mOE = '0') then mio <= mO; else mI <= mio;  end if;

das funktioniert so nicht, da der Ausgangstreiber nicht abgeschaltet
wird.

Mach es so, als concurrent statement:
MI <= mio;
mio <= mO when mOE = '0' else 'Z';

Cheers, Roger

Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh-- danke das war mir nicht richtig klar..
es wurde zwar übersetzt, aber der wert den ich dann aus dem
register gelesen habe war  immer 1 ... :-P

wenn ich ihn hochomig schalt wie du geraten hast bekomm ich aber
trotzdem einen festen wert (7FEF) für alle register... ?!??!

ich vermute ich hab da noch einen groben fehler....

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bist du sicher dass dein output enable low aktiv ist?
wenns direkt vom OC EMAC kommt dann:
mio <= mO when mOE = '1' else 'Z';

Cheers, Roger

Autor: David -- (davidmg0815)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ja genau- es muss eine 1 sein-
bekomme aber trotzdem nur FFFF aus dem register geliefert , da
er immer die selbe adresse liest....

mI <= mio;
mio <= mO when mOE = '1' else 'Z';

führt zu folgendem ergebniss-
das kann doch nicht ganz sein.... oder?

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nach dem trace zu urteilen ist der Ausgang bei mOE = '0' eingeschaltet, 
was ja eben falsch ist.

Cheers, Roger

Autor: David -- (davidmg0815)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

entschuldige die späte Rückmeldung- aber ich musste erst ein paar Sachen 
austesten-
Ich bin fast ab verzweifeln.

Oben der Trace war falsch-  wenn ich allerdings auf moE='1' reagiere
sieht das ergebnis- nicht besser aus (Anhang)

Das komische ist, das es hin und wieder funktioniert- ich hab schon das
Datenblatt von dem Phy rauf und runter gelesen, und alles mögliche 
versucht...
Es geht mal, und mal liest er nur 0xFFFF aus dem Phy Register.

Ich hab sogar mal ein Oszi an den MIO angeschlossen, und da kommt 
wirklich nichts raus,
genau wie im trace -- komisch ist nur, das ich zwischen takt 382 und 408
so ein komisches rauschen  (bis 50 mVolt)auf dem MIO pin hab - wo er ja 
eigentlich auf "hochohmig" geschaltet sein sollte...

ich denke mal es liegt am Phy? ich hab schon den resetausgang von dem
Phy auf den Ausgang geführt, und den Mac und den Phy gleichzeitig 
Resetet.
Ich habe verschiedene Netzteile probiert... ich weiß nicht mehr was ich 
noch testen soll...

Als ausgangstandart für MIO hab ich LVTTL 3,3 Volt ... könnte es damit
irgendwie zusammenhängen?
Im Phy Datenblatt steht CMOS....

Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

jetzt hab ich die lösung gefunden --> eine kombination aus falschem 
datenblatt
und meiner Dummheit.

Die haben den quarz für den 25 Mhz takt von dem Phy einfach waggelassen 
(im datenblatt ist er aber eingezeichnet!)
wenn ich ihn mit ner PPL vom FPGA takte geht es dann ohne probleme....

...ich fragm ich nur warum es vorher auch manchmal funktioniert hat... 
;o)

Autor: David -- (davidmg0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sieht schonmal ganz gut aus....

eth_ocm_phy_init(&ETHCHIP)

meldet:

[eth_ocm_phy_init] Found THK 78Q2120C PHY.
[eth_ocm_phy_init] Waiting on PHY link...OK. x=5558, PHY STATUS=782d
[eth_ocm_phy_init] Full Duplex is 0


ich frag mich jetzt wie es weiter geht----

Bevor ich einen Stack darauf aufsetzte sollte ich da nicht
besser versuchen von hand ein packet zu verschicken und
es z.B mit etherReal zu emfangen.....

Autor: david0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche jetzt den Niche-Stack zum laufen zu bringen,
aber ich beomme einen Transmit error geliefert:
  alt_iniche_init();
  netmain();


Copyright 1996-2008 by InterNiche Technologies. All rights reserved. 
eth_ocm_prep
Could not locate flash sector with MAC address.
prepped 1 interface, initializing...
[eth_ocm_init]
[eth_ocm_phy_init] PHY ID 0x0 e 70c5
[eth_ocm_phy_init] LXT972A not found!
[eth_ocm_phy_init] Found THK 78Q2120C PHY.
[eth_ocm_phy_init] Marvell 88E1111 PHY not found!
[eth_ocm_phy_init] DP83848C PHY not found!
[eth_ocm_phy_init] Waiting on PHY link...OK. x=18188, PHY STATUS=782d
[eth_ocm_phy_init] Full Duplex is 0

[eth_ocm_init] Configuring MAC address 26:d6:3f:10:3a:88

Opencores MAC post-init: MODER = 0x0000a003
IP address of et1 : 192.168.1.234
[eth_ocm_tx_isr] Transmit error 0x1627901



Ich denke mal das liegt an diesem selbsteingefügen   THK  phy...

bisher führe ich folgende befehle in ocm_phy_init aus:
 if (phyid == ETH_OCM_PHYID_TDK){
        found = 1;
        #if(ETH_OCM_DBG_LVL > 0)
        printf("[eth_ocm_phy_init] Found THK 78Q2120C PHY.\n");
        #endif
         
        // Restart autonegotiation
        dat = eth_ocm_read_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_CONTROL);
        dat |=  PCS_CTL_an_restart;
        eth_ocm_write_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_CONTROL, dat);
    }
    else{
        #if(ETH_OCM_DBG_LVL > 0)
        printf("[eth_ocm_phy_init] THK 78Q2120C not found!\n");
        #endif
    }
    #endif //ifdef ETH_OCM_PHYID_MVL

Autor: david0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so- ich hatte das controllregister des TDK phy falsch beschrieben?

ich habe ihn jetzt auf halb Duplex und 100 Mbit/s gestellt- dann ist 
zumindest dieser fehler weg- aber das ergebniss ist das selbe, es gibt
irgendwann einen pufferüberlauf:

[eth_ocm_phy_init] Found THK 78Q2120C PHY.
[eth_ocm_phy_init] Waiting on PHY link... Autoneg FAILED, continuing anyway ...
OK. x=100002, PHY STATUS=780d
[eth_ocm_phy_init] Full Duplex is 0
[eth_ocm_init] Configuring MAC address 00:00:00:00:00:00

Opencores MAC post-init: MODER = 0x0000a003
IP address of et1 : 192.168.1.234
[eth_ocm_rx_isr] No free RX buffers (Swamping the NicheStack)
[eth_ocm_rx_isr] No free RX buffers (Swamping the NicheStack)
[eth_ocm_rx_isr] No free RX buffers (Swamping the NicheStack)
.
.
.
.


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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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