www.mikrocontroller.net

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


Autor: Wolfgang Saginet (bugston)
Datum:

Bewertung
0 lesenswert
nicht 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.
Startwert |       24Bit Daten        | Anhängende Nullen
0101      | 000000000100001111111111 | 0000 
01010000000001000011111111110000 / 11101
00100100000001000011111111110000
00011110000001000011111111110000
00000011000001000011111111110000
00000000101001000011111111110000
00000000010011000011111111110000
00000000001110000011111111110000
00000000000000100011111111110000
00000000000000011001111111110000
00000000000000000100111111110000
00000000000000000011101111110000
00000000000000000000000111110000
00000000000000000000000000100000
00000000000000000000000000011010
00000000000000000000000000000111 --> CRC-Wert 0111
mein Programm errechnet aber --> 0001
Ich wollte bei meinem Programm die Methode mit FlipFlops und XORs 
verwenden.
Das ist es:
entity CRCModul is
  generic(Nibbleanzahl: natural := 6);
  port(clk : in bit;
      Reset : in bit;
      NibbleData : in bit_vector(0 to (4*Nibbleanzahl)-1);
      NewNibbles : in bit;
      CRCValue : out bit_vector(0 to 3);
      CRCFinish : out bit);
end CRCModul;

architecture Behavioral of CRCModul is
signal CRCBuffer : bit_vector(0 to 3);
signal NibbleBuffer : bit_vector(0 to (4*Nibbleanzahl)-1);
signal Finish : bit;
signal count : integer range 0 to (Nibbleanzahl*4)+4;
begin

CRCFinish <= Finish;

CRC: process(Reset, clk, NibbleData)
begin
  if Reset = '1' then --asynchron Reset
      count <= 0;
      CRCBuffer <= "0101"; -- Seed-Value|Startwert "0101"
      NibbleBuffer <= NibbleData;
      Finish <= '0';
  elsif clk = '1' and clk'event then
    if count =  (Nibbleanzahl*4)+4 then -- Wenn Berechnung Fertig
      Finish <= '1'; -- Finishflag setzen
      CRCValue <= CRCBuffer; -- Errechneter Wert an Ausgang übergeben
      count <= 0; -- Zähler zurücksetzen
    elsif Finish = '0' then -- Wenn Berechnung noch nicht Fertig
      count <= count + 1; -- Hochzählen
    end if;
    
    if Finish = '1' and NewNibbles = '1' then -- Wenn Berechnung fertig war und ein neuer Wert berechnet werden soll.
      CRCBuffer <= "0101"; -- Seed-Value|Startwert "0101"
      NibbleBuffer <= NibbleData; -- Daten vom Ausgang zwischenspeichern
      Finish <= '0'; -- Finish Flag zurücksetzen
    else    
      -- Polynom x^4+x^3+x^2+1 realisierung
      CRCBuffer(0) <= CRCBuffer(3) XOR NibbleBuffer(0);
      CRCBuffer(1) <= CRCBuffer(0);
      CRCBuffer(2) <= CRCBuffer(3) XOR CRCBuffer(1);
      CRCBuffer(3) <= CRCBuffer(3) XOR CRCBuffer(2);
      NibbleBuffer <= NibbleBuffer(1 to (4*Nibbleanzahl)-1) & '0';
    end if;
  end if;
end process CRC;
end Behavioral;
Wäre super, wenn mir jemand weiter helfen könnte, ich sitze daran schon 
eine halbe Ewigkeit.

Autor: Schrotty (Gast)
Datum:

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

z.B.

http://www.electronicdesignworks.com/utilities/crc...

Autor: Wolfgang Saginet (bugston)
Datum:

Bewertung
0 lesenswert
nicht 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:
000000000100001111111111 Ersten 4 Bit XOR StartWert "0101" =>
010100000100001111111111
0101000001000011111111110000 Nullen anhängen
0010010001000011111111110000
0001111001000011111111110000
0000001101000011111111110000
0000000011100011111111110000
0000000000001011111111110000
0000000000000101011111110000
0000000000000010001111110000
0000000000000001100111110000
0000000000000000010011110000
0000000000000000001110110000
0000000000000000000000010000
0000000000000000000000001101 --> CRC Wert 1101
Warum mein Programm das nicht ausgibt muss ich noch heraus finden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.