oblicz (i sprawdź) Ethernet FCS (crc32) w vhdl

UżywamZestaw startowy Spartan 3E i próbuję odbierać ramki Ethernet przez łącze 100MBit.

Dla tych, którzy nie wiedzą, płyta zawiera chip PHY, odsłaniając zegar odbiorczy z częstotliwością 25 MHz. Sprawdziłem (prawie), że odbieranie działa poprawnie, buforując odebrane ramki i wysyłając je ponownie poprzez łącze szeregowe.

Ponadto używamGenerator CRC32 z outputlogic.com. Łączę otrzymane nybbles z bajtami i przekazuję je do CRC. Na końcu ramki zatrzaskuję wygenerowany CRC i wyświetlaję go na wyświetlaczu LCD wraz z CRC, które znalazłem w ramce ethernetowej.

Jednak (jak można się domyślić) te dwie liczby się nie zgadzają.

527edb0d  -- FCS extracted from the frame
43a4d833  -- calculated using the CRC32 generator

Pierwszy z nich można również zweryfikować, uruchamiając pakiet za pomocą funkcji pythons crc32, zarówno z ramką przechwyconą przez wireshark, jak i ramką przechwyconą i pobraną przez port szeregowy z FPGA.

Myślę, że to musi być coś mniej lub bardziej banalnego.Wkleiłem tutaj proces odbioru. Zdjąłem wszystko, co nie było konieczne. Podczas przechwytywania danych wyjściowych przez port szeregowy dodałem fifo (łatwo utworzoną jednostkę z Xilinx), który zatrzasnął się w tym samym czasie co generator CRC, aby uzyskać dokładnie te same bajty.

Czy ktoś ma pojęcie, co w tym złego?

questionAnswers(2)

yourAnswerToTheQuestion