Forum: FPGA, VHDL & Co. Andere Crc32 Frage


von Thorben (Gast)


Lesenswert?

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?

von cfgardiner (Gast)


Lesenswert?

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

von Thorben (Gast)


Lesenswert?

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?

von Thorben (Gast)


Lesenswert?

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.

von cfgardiner (Gast)


Lesenswert?

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.

von Thorben (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.