Hi! Ich möchte zwei FPGA Boards über einen Switch miteinander verbinden. Damit die Daten im Switch nicht verworfen werden, schick ich einen Ethernet Frame im Format 802.3 inkl. FCS. Blöderweise versuch ich schon seit Tagen eine korrekte CRC zu berechnen, aber es will einfach nicht funktionieren. Ich hab mir mit dem Tool auf http://www.easics.com/webtools/crctool eine CRC als VHDL Funktion generieren lassen, aber die CRC stimmt einfach nicht. Jetzt habe ich schon versucht die Bits umzudrehen, bevor ich die Daten der CRC Funktion übergebe. Ich habe versucht die ersten 32 Bit des Frames zu invertieren und ich habe versucht die Bits des Low und High Nibbles zu verdrehen. Leider hat das absolut nichts gebracht. Hat von euch schon jemand ähnliche Probleme gehabt und diese gelöst?
Gast
#1573880
Laut http://de.wikipedia.org/wiki/Ethernet wird bei der CRC Prüfsumme jedes byte reverse übertragen.
Naja, das hätte ich ja eigentlich schon ausprobiert, aber ohne Erfolg. An anderer Stelle habe ich gelesen, dass die ersten 32 Bit invertiert gehören... war aber auch nicht hilfreich. Setzt ihr mit euren VHDL Designs auf einem höheren Level an? Kaum zu glauben, dass man im Netz nichts brauchbares findet.
Nachdem ich jetzt haufenweise Kombination ausprobiert habe und das Ergebnis mit einem Packet Sniffer überprüft habe, weiß ich wie man die CRC richtig berechnet. Hier eine kurze Einführung, falls jemand einmal vor selbigem Problem stehen sollte... 1. CRC Modul mit http://www.easics.com/webtools/crctool generieren. 2. Bevor die Daten an das CRC Modul übergeben werden (in meinem Fall über den Funktionsaufruf nextCRC32_D8), müssen die Bits vertauscht werden. Übergeben werden Daten von Target MAC bis letztes Byte der Payload, MSB zuerst. Die ersten 32Bit der Target MAC müssen invertiert werden.
1 | |
2 | |
3 | |
4 | |
3. Am Ende der Payload muss der komplette CRC Wert invertiert werden und die Bits anschließend wieder vertauscht werden. 4. Die CRC wird mit dem LSB Byte zuerst an das Ende des Frames gestellt.
Gast
#2387268
Nachdem ich auch mehrere Tage am CRC gesessen habe, hier die Schritte, wie es bei mit geklappt hat. Die CRC Funktion habe ich mir bei OutputLogic.com generieren lassen. Allerdings habe ich sie erweitert, so dass sie auch gleich das Inverse berechnet, weil das später benutzt wird.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
Es gibt noch den Hinweis, dass die ersten 32 Bit der MAC-Adresse invertiert werden müssen. Das hat bei mir damit nicht geklappt. Ich habe sie normal in den CRC geschoben. Vielleicht hilft das ja jemanden. Ich kann jedenfalls damit die Pakete über RGMII und einen Marvel 88E1111 verschicken. Entwickelt wurde alles auf einem DE2-115 Board mit einem Cyclone 4.
Hier wurde die CRC schon mal gelöst. Der Code des Anfangspostings hat noch ein paar kleine Fehler die im Thread gelöst werden. Es ist eine GMII Interface, der CRC ist der Gleiche. Beitrag "Ethernet GMII"
Verständnisfrage dazu: Warum müssen die Bits gedreht werden, wie beschrieben steht? Inwiefern gehen Ethernet-Implementierung und CRC-Tool da von verdrehten Bits aus?
Gast
#2694269
Robert K. schrieb: > Verständnisfrage dazu: Warum müssen die Bits gedreht werden, wie > beschrieben steht? Beim Ethernet kommt das LSB zuerst (im Gegensatz zu z.B. I2C). D.h. das Byte 0x12 (b00010010) kommt als Datenstrom "01001000" rein. Daher muß man swappen.
Wenn der CRC aber doch für Ethernet ausglegt war, sollte es doch von vorn herin gestimmt haben, oder?
Gast
#5650065
PittyJ schrieb: > Es gibt noch den Hinweis, dass die ersten 32 Bit der MAC-Adresse > invertiert werden müssen. > Das hat bei mir damit nicht geklappt. Ich habe sie normal in den CRC > geschoben. Die Erklärung warum er die MAC-Adresse nicht extra invertieren muß ist, sein Schieberegister in der CRC Berechnung wird vor jedem neuen Ethernet-Frame mit 0xFFFF initialisiert, das invertiert die ersten 32 Bit!
Gast
#5652616
Weiß jemand, wozu das so gemacht wird?
Gast
#5654385
Edi M. schrieb: > Weiß jemand, wozu das so gemacht wird? Du meinst das Invertieren? Um führende und angehängte Nullen abbilden zu können. Siehe hier https://en.wikipedia.org/wiki/Mathematics_of_cyclic_redundancy_checks#Variations
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.