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


von David -. (davidmg0815)


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?p_id=115&t_id=18

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

von David -. (davidmg0815)


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

von David -. (davidmg0815)


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?

von David -. (davidmg0815)


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";

von David -. (davidmg0815)


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.

von Jonas (Gast)


Lesenswert?

Klappts?

von David -. (davidmg0815)


Lesenswert?

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

von David -. (davidmg0815)


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.

von David -. (davidmg0815)


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;

von Roger S. (edge)


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:
1
MI <= mio;
2
mio <= mO when mOE = '0' else 'Z';

Cheers, Roger

von David -. (davidmg0815)


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....

von Roger S. (edge)


Lesenswert?

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

Cheers, Roger

von David -. (davidmg0815)


Angehängte Dateien:

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?

von Roger S. (edge)


Lesenswert?

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

Cheers, Roger

von David -. (davidmg0815)


Angehängte Dateien:

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....

von David -. (davidmg0815)


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)

von David -. (davidmg0815)


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.....

von david0815 (Gast)


Lesenswert?

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


1
Copyright 1996-2008 by InterNiche Technologies. All rights reserved. 
2
eth_ocm_prep
3
Could not locate flash sector with MAC address.
4
prepped 1 interface, initializing...
5
[eth_ocm_init]
6
[eth_ocm_phy_init] PHY ID 0x0 e 70c5
7
[eth_ocm_phy_init] LXT972A not found!
8
[eth_ocm_phy_init] Found THK 78Q2120C PHY.
9
[eth_ocm_phy_init] Marvell 88E1111 PHY not found!
10
[eth_ocm_phy_init] DP83848C PHY not found!
11
[eth_ocm_phy_init] Waiting on PHY link...OK. x=18188, PHY STATUS=782d
12
[eth_ocm_phy_init] Full Duplex is 0
13
14
[eth_ocm_init] Configuring MAC address 26:d6:3f:10:3a:88
15
16
Opencores MAC post-init: MODER = 0x0000a003
17
IP address of et1 : 192.168.1.234
18
[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:
1
 if (phyid == ETH_OCM_PHYID_TDK){
2
        found = 1;
3
        #if(ETH_OCM_DBG_LVL > 0)
4
        printf("[eth_ocm_phy_init] Found THK 78Q2120C PHY.\n");
5
        #endif
6
         
7
        // Restart autonegotiation
8
        dat = eth_ocm_read_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_CONTROL);
9
        dat |=  PCS_CTL_an_restart;
10
        eth_ocm_write_phy_reg(base, phyadd, ETH_OCM_PHY_ADDR_CONTROL, dat);
11
    }
12
    else{
13
        #if(ETH_OCM_DBG_LVL > 0)
14
        printf("[eth_ocm_phy_init] THK 78Q2120C not found!\n");
15
        #endif
16
    }
17
    #endif //ifdef ETH_OCM_PHYID_MVL

von david0815 (Gast)


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:
1
[eth_ocm_phy_init] Found THK 78Q2120C PHY.
2
[eth_ocm_phy_init] Waiting on PHY link... Autoneg FAILED, continuing anyway ...
3
OK. x=100002, PHY STATUS=780d
4
[eth_ocm_phy_init] Full Duplex is 0
5
[eth_ocm_init] Configuring MAC address 00:00:00:00:00:00
6
7
Opencores MAC post-init: MODER = 0x0000a003
8
IP address of et1 : 192.168.1.234
9
[eth_ocm_rx_isr] No free RX buffers (Swamping the NicheStack)
10
[eth_ocm_rx_isr] No free RX buffers (Swamping the NicheStack)
11
[eth_ocm_rx_isr] No free RX buffers (Swamping the NicheStack)
12
.
13
.
14
.
15
.

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.