With so much of our day-to-day networking done wirelessly these days, it can be easy to forget about Ethernet. But it’s a useful standard and can be a great way to add a reliable high-throughput network link to your projects. To that end, [Robert Feranec] and [Stacy Rieck] whipped up a tutorial on how to work with Ethernet on FPGAs.
As [Robert] explains, “many people would like to transfer data from FPGA boards to somewhere else.” That basically sums up why you might be interested in doing this. The duo spend over an hour stepping through doing Ethernet at a very low level, without using pre-existing IP blocks to make it easier. The video explains the basic architecture right down to the physical pins on the device and what they do, all the way up to the logic blocks inside the device that do all the protocol work.
If you just want to get data off an embedded project, you can always pull in some existing libraries to do the job. But if you want to really understand Ethernet, this is a great place to start. There’s no better way to learn than doing it yourself. Files are on GitHub for the curious.
I highly, highly, highly recommend Alex Forencich’s Ethernet implementation.
https://github.com/alexforencich/verilog-ethernet
He’s just insanely responsive for a free project and there are implementations up to 25G (!). I’ve found it incredibly easy to add handlers for various UDP ports using a tiny softcore-like processors (PicoBlaze or similar), so adding things like retransmission, DHCP, etc. are all relatively easy.
Honestly though if you’re doing any FPGA work you should just have his GitHub link bookmarked.
thx, M8, appreciate it ;) looks very nice!
Bookmarked
we waiting pine64 with this ethernet or similar
I hate blobs
Alex Forencich’s rechaces up to 100G https://github.com/corundum/corundum
The 100G mode for Corundum is just using the stock IP cores. It’s not the same as this. The verilog-ethernet repo (used for lower speeds) is this.
How does a microprocessor start at the right place in the hard code upon power up? E.g. what is the physical circuit design that always makes it start executing machine code exactly where you want / need it to?