Ich habe mir ja nun erfolgreich die Crc32 eines eingehenden Paketes berechnet. Nun befindet sich ja am Ende noch die mitgesendete crc32 information. Nun muss ich doch die Errechnete mit der Angehängten vergleichen? Oder wie macht man das wenn man Prüfen will ob ein Paket richtig empfangen wurde? Bastel ich mir da n comparator? Oder wie ist der einfachste Weg?
Das wäre eine Lösung. Falls es sich hier um Ethernet Pakete handelt mit dem standard CRC-Polynom, eine andere übliche Lösung ist, die letzten vier Bytes auch durch die CRC-Logik fliessen zu lassen und zu prüfen, dass das Endergebnis die sog. 'Magic Number' 0xC704DD7B entspricht (gilt wie gesagt nur für Ethernet CRC). Hier wäre auch aufzupassen, dass die letzten vier Bytes mit MSB (genauer, MS Bit des MS Byte) zuerst übertragen werden. Grüße, Charles
Ja es handelt sich um ein Ethernet Paket. Also werden die Daten nach der SFD bis hin zu den letzten 4 Bytes durch die CRC-Logik geschoben. Was ist hier genau zu beachten? Bei dem Standard Polynom oder was ist anders zum reversed Polynom. Was wird hier beim einlesen der gesamten Daten am Ende erwartet bzw ist beim durchschieben zu beachten?
Hallo, also um nochmal detailieter nachzufragen ein paar mehr Infos. Ich verwende das gedrehte Polynom also LSB first weil ich ein Ethernet Paket empfange was ich überprüfen möchte. Wie weit lasse ich nun alles nach der SFD durch die Logik laufen? Inklusive der letzten vier Bytes der angehängten Crc32? Schiebe ich einfach alles so durch die Logik oder wie muss hier was gedreht werden? Das ist noch unklar. Was werde ich dann am Ausgang erwarten? Die Magic Number oder 0 bei einem erfolgreich empfangenden Paket? Die Ziel Mac brauch ich ja durch Verwendung des reversed Polynoms nicht invertieren bzw auch durch die initialisierung mit 0xFFFFFFFF bei dem ersten Reset.
Hallo Thorben, beim prüfen des CRCs, einfach die Bytes entgegennehmen so wie Du sie bekommst bis einschliesslich das letzte FCS (aka CRC) Byte. Das Ergebnis muesste dann 0xC704DD7B sein. Wie Du gesagt hast, CRC am Anfang mit 0xFFFFFFFF initialisieren. Als Beispiel, angenommen Dein CRC Checker arbeitet Byteweise (lass Dir den VHDL Code z.B. von www.easics.com/webtools/crctool generieren) und die letzten neun Bytes (fuenf Payload + vier CRC) sind 0x6a, 0x6b, 0x6c, 0x6d, 0x6e; 0xb0, 0x11, 0x66, 0x47. Diese erscheinen wie folgt auf der Leitung (aelter) 0101_0110, 1101_0110, 0011_0110, 1011_0110, 0111_0110; 0000_1101, 1000_1000, 0110_0110, 1110_0010 (neuer) genau so werden die auch in den CRC geführt ('aeltestes' Bit von der Leitung ist 'links') Falls, Du z.B. das o.g. CRC Tool verwendest, bekommst Du eine Funktion nextCRC32_D8. die Aufruffolge wäre . . . . . . . crc <= nextCRC32_D8(0x56, crc); crc <= nextCRC32_D8(0xD6, crc); crc <= nextCRC32_D8(0x36, crc); crc <= nextCRC32_D8(0xB6, crc); crc <= nextCRC32_D8(0x76, crc); crc <= nextCRC32_D8(0x0D, crc); crc <= nextCRC32_D8(0x88, crc); crc <= nextCRC32_D8(0x66, crc); crc <= nextCRC32_D8(0xE2, crc); Zum Schluss muss crc gleich 0xC704DD7B sein. Beim Senden, geht das MS Bit des MS Bytes zuerst auf die Reise. Beim Payload ist das anders herum.
Und wie sieht das aus wenn ich das mit dem Crc-Checker Wordweise einlesen möchte? Bis jetzt hab ich noch nicht die Magic Number erhalten nach gefühlten 1000 tests. Ich wollt diesen Crc-Checker benutzen
1 | -- ########################################################################
|
2 | -- CRC Engine RTL Design
|
3 | -- Copyright (C) www.ElectronicDesignworks.com
|
4 | -- Source code generated by ElectronicDesignworks IP Generator (CRC).
|
5 | -- Documentation can be downloaded from www.ElectronicDesignworks.com
|
6 | -- ********************************
|
7 | -- License
|
8 | -- ********************************
|
9 | -- This source file may be used and distributed freely provided that this
|
10 | -- copyright notice, list of conditions and the following disclaimer is
|
11 | -- not removed from the file.
|
12 | -- Any derivative work should contain this copyright notice and associated disclaimer.
|
13 | -- This source code file is provided "AS IS" AND WITHOUT ANY WARRANTY,
|
14 | -- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
15 | -- PARTICULAR PURPOSE.
|
16 | -- ********************************
|
17 | -- Specification
|
18 | -- ********************************
|
19 | -- File Name : CRC32_DATA16.vhd
|
20 | -- Description : CRC Engine ENTITY
|
21 | -- Clock : Positive Edge
|
22 | -- Reset : Active Low
|
23 | -- First Serial : LSB
|
24 | -- Data Bus Width : 16 bits
|
25 | -- Polynomial : (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)
|
26 | -- Date : 11-Apr-2011
|
27 | -- Version : 1.0
|
28 | -- ########################################################################
|
29 | |
30 | LIBRARY IEEE ; |
31 | USE ieee.std_logic_1164.all ; |
32 | USE ieee.std_logic_arith.all ; |
33 | USE ieee.std_logic_unsigned.all ; |
34 | |
35 | ENTITY crc_gen IS |
36 | PORT( |
37 | clock : IN STD_LOGIC; |
38 | reset : IN STD_LOGIC; |
39 | soc : IN STD_LOGIC; |
40 | data : IN STD_LOGIC_VECTOR(15 DOWNTO 0); |
41 | data_valid : IN STD_LOGIC; |
42 | eoc : IN STD_LOGIC; |
43 | crc : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); |
44 | crc_valid : OUT STD_LOGIC |
45 | );
|
46 | END crc_gen; |
47 | |
48 | ARCHITECTURE behave OF crc_gen IS |
49 | |
50 | SIGNAL crc_r : STD_LOGIC_VECTOR(31 DOWNTO 0); |
51 | SIGNAL crc_c : STD_LOGIC_VECTOR(31 DOWNTO 0); |
52 | SIGNAL crc_i : STD_LOGIC_VECTOR(31 DOWNTO 0); |
53 | SIGNAL crc_const : STD_LOGIC_VECTOR(31 DOWNTO 0) := "11111111111111111111111111111111"; |
54 | |
55 | BEGIN
|
56 | |
57 | |
58 | crc_i <= crc_const when soc = '1' else |
59 | crc_r; |
60 | |
61 | crc_c(0) <= data(15) XOR data(9) XOR data(6) XOR data(5) XOR crc_i(16) XOR crc_i(26) XOR crc_i(25) XOR data(3) XOR crc_i(22) XOR crc_i(28); |
62 | crc_c(1) <= data(15) XOR data(14) XOR data(8) XOR data(4) XOR crc_i(17) XOR crc_i(27) XOR data(2) XOR crc_i(23) XOR crc_i(29) XOR data(9) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR data(3) XOR crc_i(22) XOR crc_i(28); |
63 | crc_c(2) <= data(15) XOR data(14) XOR data(13) XOR data(7) XOR crc_i(18) XOR data(1) XOR crc_i(24) XOR crc_i(30) XOR data(8) XOR crc_i(17) XOR data(2) XOR crc_i(23) XOR crc_i(29) XOR data(9) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR crc_i(22); |
64 | crc_c(3) <= data(14) XOR data(13) XOR data(12) XOR data(6) XOR crc_i(19) XOR data(0) XOR crc_i(25) XOR crc_i(31) XOR data(7) XOR crc_i(18) XOR data(1) XOR crc_i(24) XOR crc_i(30) XOR data(8) XOR data(5) XOR crc_i(17) XOR crc_i(26) XOR crc_i(23); |
65 | crc_c(4) <= data(15) XOR data(13) XOR data(12) XOR data(11) XOR crc_i(20) XOR crc_i(19) XOR data(0) XOR crc_i(31) XOR data(7) XOR data(4) XOR crc_i(18) XOR crc_i(27) XOR crc_i(24) XOR data(9) XOR crc_i(16) XOR data(3) XOR crc_i(22) XOR crc_i(28); |
66 | crc_c(5) <= data(15) XOR data(14) XOR data(12) XOR data(11) XOR data(10) XOR crc_i(21) XOR crc_i(20) XOR crc_i(19) XOR data(8) XOR crc_i(17) XOR data(2) XOR crc_i(23) XOR crc_i(29) XOR data(9) XOR data(5) XOR crc_i(16) XOR crc_i(26) XOR crc_i(22); |
67 | crc_c(6) <= data(14) XOR data(13) XOR data(11) XOR data(10) XOR data(9) XOR crc_i(22) XOR crc_i(21) XOR crc_i(20) XOR data(7) XOR crc_i(18) XOR data(1) XOR crc_i(24) XOR crc_i(30) XOR data(8) XOR data(4) XOR crc_i(17) XOR crc_i(27) XOR crc_i(23); |
68 | crc_c(7) <= data(15) XOR data(13) XOR data(12) XOR data(10) XOR data(8) XOR crc_i(23) XOR crc_i(21) XOR crc_i(19) XOR data(0) XOR crc_i(31) XOR data(7) XOR crc_i(18) XOR crc_i(24) XOR data(5) XOR crc_i(16) XOR crc_i(26); |
69 | crc_c(8) <= data(15) XOR data(14) XOR data(12) XOR data(11) XOR data(7) XOR crc_i(24) XOR crc_i(20) XOR crc_i(19) XOR data(4) XOR crc_i(17) XOR crc_i(27) XOR data(5) XOR crc_i(16) XOR crc_i(26) XOR data(3) XOR crc_i(28); |
70 | crc_c(9) <= data(14) XOR data(13) XOR data(11) XOR data(10) XOR data(6) XOR crc_i(25) XOR crc_i(21) XOR crc_i(20) XOR data(3) XOR crc_i(18) XOR crc_i(28) XOR data(4) XOR crc_i(17) XOR crc_i(27) XOR data(2) XOR crc_i(29); |
71 | crc_c(10) <= data(15) XOR data(13) XOR data(12) XOR data(10) XOR crc_i(21) XOR data(2) XOR crc_i(19) XOR crc_i(29) XOR crc_i(18) XOR data(1) XOR crc_i(30) XOR data(6) XOR crc_i(16) XOR crc_i(25); |
72 | crc_c(11) <= data(15) XOR data(14) XOR data(12) XOR data(11) XOR data(1) XOR crc_i(20) XOR crc_i(30) XOR crc_i(19) XOR data(0) XOR crc_i(31) XOR crc_i(17) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR data(3) XOR crc_i(28); |
73 | crc_c(12) <= data(15) XOR data(14) XOR data(13) XOR data(11) XOR data(10) XOR data(0) XOR crc_i(21) XOR crc_i(31) XOR crc_i(20) XOR crc_i(18) XOR crc_i(17) XOR data(2) XOR crc_i(29) XOR data(9) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR data(3) XOR crc_i(22) XOR crc_i(28); |
74 | crc_c(13) <= data(14) XOR data(13) XOR data(12) XOR data(10) XOR data(9) XOR crc_i(22) XOR crc_i(21) XOR crc_i(19) XOR crc_i(18) XOR data(1) XOR crc_i(30) XOR data(8) XOR data(5) XOR crc_i(17) XOR crc_i(26) XOR data(2) XOR crc_i(23) XOR crc_i(29); |
75 | crc_c(14) <= data(13) XOR data(12) XOR data(11) XOR data(9) XOR data(8) XOR crc_i(23) XOR crc_i(22) XOR crc_i(20) XOR crc_i(19) XOR data(0) XOR crc_i(31) XOR data(7) XOR data(4) XOR crc_i(18) XOR crc_i(27) XOR data(1) XOR crc_i(24) XOR crc_i(30); |
76 | crc_c(15) <= data(12) XOR data(11) XOR data(10) XOR data(8) XOR data(7) XOR crc_i(24) XOR crc_i(23) XOR crc_i(21) XOR crc_i(20) XOR data(6) XOR data(3) XOR crc_i(19) XOR crc_i(28) XOR data(0) XOR crc_i(25) XOR crc_i(31); |
77 | crc_c(16) <= data(15) XOR data(11) XOR data(10) XOR data(7) XOR crc_i(0) XOR crc_i(24) XOR crc_i(21) XOR data(2) XOR crc_i(20) XOR crc_i(29) XOR crc_i(16) XOR data(3) XOR crc_i(28); |
78 | crc_c(17) <= data(14) XOR data(10) XOR data(9) XOR data(6) XOR crc_i(1) XOR crc_i(25) XOR crc_i(22) XOR data(1) XOR crc_i(21) XOR crc_i(30) XOR crc_i(17) XOR data(2) XOR crc_i(29); |
79 | crc_c(18) <= data(13) XOR data(9) XOR data(8) XOR data(5) XOR crc_i(2) XOR crc_i(26) XOR crc_i(23) XOR data(0) XOR crc_i(22) XOR crc_i(31) XOR crc_i(18) XOR data(1) XOR crc_i(30); |
80 | crc_c(19) <= data(12) XOR data(8) XOR data(7) XOR data(4) XOR crc_i(3) XOR crc_i(27) XOR crc_i(24) XOR crc_i(23) XOR crc_i(19) XOR data(0) XOR crc_i(31); |
81 | crc_c(20) <= data(11) XOR data(7) XOR data(6) XOR data(3) XOR crc_i(4) XOR crc_i(28) XOR crc_i(25) XOR crc_i(24) XOR crc_i(20); |
82 | crc_c(21) <= data(10) XOR data(6) XOR data(5) XOR data(2) XOR crc_i(5) XOR crc_i(29) XOR crc_i(26) XOR crc_i(25) XOR crc_i(21); |
83 | crc_c(22) <= data(15) XOR data(4) XOR data(1) XOR crc_i(6) XOR crc_i(30) XOR crc_i(27) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR data(3) XOR crc_i(28); |
84 | crc_c(23) <= data(15) XOR data(14) XOR data(0) XOR crc_i(7) XOR crc_i(31) XOR crc_i(17) XOR data(2) XOR crc_i(29) XOR data(9) XOR data(6) XOR crc_i(16) XOR crc_i(25) XOR crc_i(22); |
85 | crc_c(24) <= data(14) XOR data(13) XOR crc_i(8) XOR crc_i(18) XOR data(1) XOR crc_i(30) XOR data(8) XOR data(5) XOR crc_i(17) XOR crc_i(26) XOR crc_i(23); |
86 | crc_c(25) <= data(13) XOR data(12) XOR crc_i(9) XOR crc_i(19) XOR data(0) XOR crc_i(31) XOR data(7) XOR data(4) XOR crc_i(18) XOR crc_i(27) XOR crc_i(24); |
87 | crc_c(26) <= data(15) XOR data(12) XOR data(11) XOR crc_i(10) XOR crc_i(20) XOR crc_i(19) XOR data(9) XOR data(5) XOR crc_i(16) XOR crc_i(26) XOR crc_i(22); |
88 | crc_c(27) <= data(14) XOR data(11) XOR data(10) XOR crc_i(11) XOR crc_i(21) XOR crc_i(20) XOR data(8) XOR data(4) XOR crc_i(17) XOR crc_i(27) XOR crc_i(23); |
89 | crc_c(28) <= data(13) XOR data(10) XOR data(9) XOR crc_i(12) XOR crc_i(22) XOR crc_i(21) XOR data(7) XOR data(3) XOR crc_i(18) XOR crc_i(28) XOR crc_i(24); |
90 | crc_c(29) <= data(12) XOR data(9) XOR data(8) XOR crc_i(13) XOR crc_i(23) XOR crc_i(22) XOR data(6) XOR data(2) XOR crc_i(19) XOR crc_i(29) XOR crc_i(25); |
91 | crc_c(30) <= data(11) XOR data(8) XOR data(7) XOR crc_i(14) XOR crc_i(24) XOR crc_i(23) XOR data(5) XOR data(1) XOR crc_i(20) XOR crc_i(30) XOR crc_i(26); |
92 | crc_c(31) <= data(10) XOR data(7) XOR data(6) XOR crc_i(15) XOR crc_i(25) XOR crc_i(24) XOR data(4) XOR data(0) XOR crc_i(21) XOR crc_i(31) XOR crc_i(27); |
93 | |
94 | |
95 | crc_gen_process : PROCESS(clock, reset) |
96 | BEGIN
|
97 | IF(reset = '0') THEN |
98 | crc_r <= "11111111111111111111111111111111" ; |
99 | ELSIF( clock 'EVENT AND clock = '1') THEN |
100 | IF(data_valid = '1') THEN |
101 | crc_r <= crc_c; |
102 | END IF; |
103 | END IF; |
104 | END PROCESS crc_gen_process; |
105 | |
106 | |
107 | crc_valid_gen : PROCESS(clock, reset) |
108 | BEGIN
|
109 | IF(reset = '0') THEN |
110 | crc_valid <= '0'; |
111 | ELSIF( clock 'EVENT AND clock = '1') THEN |
112 | IF(data_valid = '1' AND eoc = '1') THEN |
113 | crc_valid <= '1'; |
114 | ELSE
|
115 | crc_valid <= '0'; |
116 | END IF; |
117 | END IF; |
118 | END PROCESS crc_valid_gen; |
119 | |
120 | crc <= crc_r; |
121 | |
122 | END behave; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.