CRC Byteweise

Gast #1998894
Hallo zusammen.

Ich hätte da mal eine Frage bezüglich der CRC-Prüfung. Ich bekomme Daten 
Byteweise geliefert und schreibe sie Byte für Byte in meinen Ram auf dem 
FPGA. Die Daten Enden mit einem 16Bit CRC.
Wie kann ich nun sozusagen on the fly meinen CRC Prüfung machen, ohne 
die Daten bitweise durch ein Schieberegister zu schieben. Es muss doch 
die Möglichkeit geben, immer das aktuell angekommene Byte zu verrechnen 
und dann wenn alles im Ram steht bleibt Null übrig. Irgendwie so hatte 
ich mir das gedacht. Geht das?

Danke schonmal!
Gast
Jan M. schrieb:
> Ja, das funktioniert so wie du das beschrieben hast. Am einfachsten
>
> lässt du dir den benötigten VHDL-Code automatisch generieren, dafür gibt
>
> es mehrere Online-Tools. Google am besten mal nach "vhdl crc generator".

Bei google findet man viel. Aber nichts konkretes, leider. Ich will/muss 
das selber schreiben.
Wenn jemand einen Link hätte wie es funktioniert wäre ich ja schon 
zufrieden.
Gast
1
crc_c(0) <= data(0) XOR data(1) XOR crc_i(8) XOR crc_i(9); 
2
crc_c(1) <= data(0) XOR data(2) XOR crc_i(10) XOR crc_i(8); 
3
crc_c(2) <= data(0) XOR data(3) XOR crc_i(11) XOR crc_i(8); 
4
crc_c(3) <= data(0) XOR data(4) XOR crc_i(12) XOR crc_i(8); 
5
crc_c(4) <= data(0) XOR data(5) XOR crc_i(13) XOR crc_i(8); 
6
crc_c(5) <= data(0) XOR data(6) XOR crc_i(14) XOR crc_i(8); 
7
crc_c(6) <= data(0) XOR data(7) XOR crc_i(15) XOR crc_i(8); 
8
crc_c(7) <= data(0) XOR crc_i(8); 
9
crc_c(8) <= data(0) XOR crc_i(0) XOR crc_i(8); 
10
crc_c(9) <= data(0) XOR crc_i(1) XOR crc_i(8); 
11
crc_c(10) <= data(0) XOR crc_i(2) XOR crc_i(8); 
12
crc_c(11) <= data(0) XOR crc_i(3) XOR crc_i(8); 
13
crc_c(12) <= data(0) XOR crc_i(4) XOR crc_i(8); 
14
crc_c(13) <= data(0) XOR crc_i(5) XOR crc_i(8); 
15
crc_c(14) <= data(0) XOR crc_i(6) XOR crc_i(8); 
16
crc_c(15) <= data(0) XOR crc_i(7) XOR crc_i(8);

etwas in dieser Richtung finde ich öfter. ich weiß aber nicht sicher was 
es damit aufsich hat.
Gast
Hi Sim,

zu dem Ergebnis oben kommt man indem man die acht (für byteweise 
Operation) Einzelschritte aufschreibt und dann boolisch optimiert. Die 
Faktoren 1 bis 7 werden als Ableitung von Zustand 0 formuliert.

Es ist im Wesentlichen nur eine Fleissarbeit. In meinem Siemens Leben, 
vor ungefähr 10 Jahren, hatte ich einen pfiffigen Diplomand aus 
Frankreich, der das in ein Paar Tagen samt Simulation hingebracht hat. 
Sein Text habe ich aber leider nicht mehr.

Wenn Du es lieber direkt in VHDL schreibst, würde ich zunächst das 
Polymon für Bitweis als Funktion schreiben. Dann, pro Taktzyklus die 
Funktion in einer 'for i in 0 to 7 loop' Schleife aufrufen. Der 
Rückgabewert der Funktion aus Schritt 'n' ist der Eingabewert für 
Schritt 'n+1'.

Viel Erfolg.
(Firma: www.dossmatik.de)
> Es ist im Wesentlichen nur eine Fleissarbeit. In meinem Siemens Leben,
> vor ungefähr 10 Jahren, hatte ich einen pfiffigen Diplomand aus
> Frankreich, der das in ein Paar Tagen samt Simulation hingebracht hat.
> Sein Text habe ich aber leider nicht mehr.

Man schreibt eine Funktion, die Optimierung macht die Fittersoftware. 
Dann ist es keine Fleißarbeit mehr und der Code wird kürzer und lesbarer 
als diese von Hand optimierten Logikgleichungen.

Hier ein Beispiel für CRC32
1
--------------------------------------------------------------------
2

3
function crc (data_in:std_logic_vector (7 downto 0); crc_value:std_logic_vector(31 downto 0))  return std_logic_vector is
4

5
--http://de.wikipedia.org/wiki/Zyklische_Redundanzpruefung
6
--sehr gutes C Beispiel!!!!!
7

8
--G(X)=x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1
9

10
variable crc_out: std_logic_vector(31 downto 0);
11

12

13
begin
14
   crc_out:=crc_value;
15

16
  for k in 0 to 7 loop 
17
    if crc_out(0) /=data_in(k) then
18
      crc_out:=('0'& crc_out(31 downto 1)) xor X"EDB88320";
19
    else
20
      crc_out:=('0'& crc_out(31 downto 1));
21
    end if;
22

23
  end loop;
24
  return crc_out;
25

26
end crc;
27

28

29

30

31
--Anwendung im Prozess
32

33
if clk'event and clk='1' then
34
.....
35
if wr='1' then 
36

37
    crc32<=crc(data_in,crc32);  
38

39
........
Gast
Ich habe es jetzt anders gelöst.

Wenn es noch jemanden interessiert, es ging um die implementierung des 
MODBUS CRC.
Ich habe jetzt den Implementierungsvorschlag aus "MODBUS over serial 
line specification and implementation guide V1.0" auf Seite 42 genommen 
und diesen in einer vhdl-Funktion umgesetzt. Etwas abgewandelt zwar, 
aber im Prinzip das gleiche. Die Tabellen sind in genanntem Dokument 
bereits gegeben und können direkt verwendet werden.

Vielen Dank für die vielen Vorschläge.
Gruß sim

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.