I've been successfully using Ethernet port A on the Max 10 Dev Kit 10M50 for a while now without issues. However, I now want to use port B as well as Port A and and although I've I can receive data on it, I can't get the transmit side to work at all.
In my design, I have a Nios II processor with two Triple Speed Ethernet modules set to 1G Small MAC. I can use the processor to send data to the two PHY chips via the MDIO link to set them up. This communication seems to be working correctly.
I then have some verilog code which monitors the incoming data and responds to ARP and PING packets as appropriate. This code is duplicated for the two channels.
By using Signal Tap, I can see data coming into and out of Port A successfully. However, on Port B, I can see data coming out of Port B and my code responding to the ARP commands correctly. Unfortunately, these outgoing packets aren't being transmitted and I don't see them on Wireshark on the receiving PC.
As far as I can make out, the only difference between Port A and Port B is the address of the second PHY chip on the MDIO lines. I've taken this into account and as I've said above, I appear to be able to communicate with the port B PHY chip correctly via MDIO.
To rule out my code, I've also swapped the pin locations for Port A and Port B as a test. The problem staying with the Port B hardware suggesting that my code for the second channel is fine.
The only example code I've been able to find that uses the Port B ethernet port is the Board Update Portal supplied here: https://www.intel.com/content/dam/altera-www/global/en_US/support/boards-kits/max10/max10_10m50daf48...
Unfortunately, although this code works fine for Port A, I can't get the Port B version of this code to work either. This initially made me think that I have a hardware fault on my board but I've now got two more dev kits and these perform identically. i.e. I now have three dev kits which I can't get Port B of the dev kit to work were as Port A works fine.
Anybody have any ideas? Thanks.
To debug, I've changed my code so that the dev board generates ping requests once a second to my PC from each of the Ethernet ports. i.e. I'm just using the transmit part of the cores. Port A ping requests get through fine but there is no sign of the Port B pings. The transmit LEDs on the ethernet sockets light when the ping requests are sent on both Port A and Port B so something is happening.
I've also dumped the contents of the two Triple Speed Ethernet cores registers for comparison as well as the contents of the registers in the two PHYs. In both cases they are identical apart from where you would expect differences.
I'm at a bit of a loss as to what else I could try and I really need to get this working. Help!
It turns out to be a timing issue. I've added 1ns of extra delay in the Ethenet Port B GTX clock line and this has solved the problem. Note: I've not tuned the delay to find the optimum value, 1ns was just the first value I found that worked.
As far as I can make out, this isn't mentioned anywhere in the documentation and there is no additional delay in the Board Update Portal Port B example code as far as I can make out. This may explain why it doesn't work for me either.