Forum: FPGA, VHDL & Co. CRC-Wert Berechnung mit VHDL falsch


von Wolfgang S. (bugston)


Lesenswert?

Hallo,
ich weiß, es gibt hier schon ein paar Threads mit CRC-Berechnung, aber 
irgendwie bringen die mich nicht ganz weiter.
Einerseits habe ich Probleme mit dem Startwert einer CRC-Berechnung und 
andererseits mit den nachführenden Nullen, die man anhängen muss.
Ich habe ein VHDL-Programm geschrieben, dass mir aus einem 24 Bit 
Datenwert, mit Startwert ("0101") und Generatorpolynom x^4+x^3+x^2+1 
("11101"), den CRC-Wert berechnen soll. Irgendwie komme ich nie auf das 
gleiche Ergebnis, wenn ich es auch von Hand ausrechne. Ich weiß nur 
nicht, ob das Programm oder meine Rechnung falsch ist.
z.B.
1
Startwert |       24Bit Daten        | Anhängende Nullen
2
0101      | 000000000100001111111111 | 0000 
3
01010000000001000011111111110000 / 11101
4
00100100000001000011111111110000
5
00011110000001000011111111110000
6
00000011000001000011111111110000
7
00000000101001000011111111110000
8
00000000010011000011111111110000
9
00000000001110000011111111110000
10
00000000000000100011111111110000
11
00000000000000011001111111110000
12
00000000000000000100111111110000
13
00000000000000000011101111110000
14
00000000000000000000000111110000
15
00000000000000000000000000100000
16
00000000000000000000000000011010
17
00000000000000000000000000000111 --> CRC-Wert 0111
mein Programm errechnet aber --> 0001
Ich wollte bei meinem Programm die Methode mit FlipFlops und XORs 
verwenden.
Das ist es:
1
entity CRCModul is
2
  generic(Nibbleanzahl: natural := 6);
3
  port(clk : in bit;
4
      Reset : in bit;
5
      NibbleData : in bit_vector(0 to (4*Nibbleanzahl)-1);
6
      NewNibbles : in bit;
7
      CRCValue : out bit_vector(0 to 3);
8
      CRCFinish : out bit);
9
end CRCModul;
10
11
architecture Behavioral of CRCModul is
12
signal CRCBuffer : bit_vector(0 to 3);
13
signal NibbleBuffer : bit_vector(0 to (4*Nibbleanzahl)-1);
14
signal Finish : bit;
15
signal count : integer range 0 to (Nibbleanzahl*4)+4;
16
begin
17
18
CRCFinish <= Finish;
19
20
CRC: process(Reset, clk, NibbleData)
21
begin
22
  if Reset = '1' then --asynchron Reset
23
      count <= 0;
24
      CRCBuffer <= "0101"; -- Seed-Value|Startwert "0101"
25
      NibbleBuffer <= NibbleData;
26
      Finish <= '0';
27
  elsif clk = '1' and clk'event then
28
    if count =  (Nibbleanzahl*4)+4 then -- Wenn Berechnung Fertig
29
      Finish <= '1'; -- Finishflag setzen
30
      CRCValue <= CRCBuffer; -- Errechneter Wert an Ausgang übergeben
31
      count <= 0; -- Zähler zurücksetzen
32
    elsif Finish = '0' then -- Wenn Berechnung noch nicht Fertig
33
      count <= count + 1; -- Hochzählen
34
    end if;
35
    
36
    if Finish = '1' and NewNibbles = '1' then -- Wenn Berechnung fertig war und ein neuer Wert berechnet werden soll.
37
      CRCBuffer <= "0101"; -- Seed-Value|Startwert "0101"
38
      NibbleBuffer <= NibbleData; -- Daten vom Ausgang zwischenspeichern
39
      Finish <= '0'; -- Finish Flag zurücksetzen
40
    else    
41
      -- Polynom x^4+x^3+x^2+1 realisierung
42
      CRCBuffer(0) <= CRCBuffer(3) XOR NibbleBuffer(0);
43
      CRCBuffer(1) <= CRCBuffer(0);
44
      CRCBuffer(2) <= CRCBuffer(3) XOR CRCBuffer(1);
45
      CRCBuffer(3) <= CRCBuffer(3) XOR CRCBuffer(2);
46
      NibbleBuffer <= NibbleBuffer(1 to (4*Nibbleanzahl)-1) & '0';
47
    end if;
48
  end if;
49
end process CRC;
50
end Behavioral;
Wäre super, wenn mir jemand weiter helfen könnte, ich sitze daran schon 
eine halbe Ewigkeit.

von Schrotty (Gast)


Lesenswert?

es gibt ganz nette Tools im Netz, die einem den fix-fertigen VHDL Code 
generieren:

z.B.

http://www.electronicdesignworks.com/utilities/crc_generator/crc_generator.htm

von Wolfgang S. (bugston)


Lesenswert?

Danke Schrotty,
hab zwar schon Programme gefunden aber das ist bis jetzt das Beste.
Konnte jetzt etwas rum probieren und anscheinend ist meine Rechnung 
falsch.
Sollte glaub ich so sein:
1
000000000100001111111111 Ersten 4 Bit XOR StartWert "0101" =>
2
010100000100001111111111
3
0101000001000011111111110000 Nullen anhängen
4
0010010001000011111111110000
5
0001111001000011111111110000
6
0000001101000011111111110000
7
0000000011100011111111110000
8
0000000000001011111111110000
9
0000000000000101011111110000
10
0000000000000010001111110000
11
0000000000000001100111110000
12
0000000000000000010011110000
13
0000000000000000001110110000
14
0000000000000000000000010000
15
0000000000000000000000001101 --> CRC Wert 1101
Warum mein Programm das nicht ausgibt muss ich noch heraus finden.

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.