Forum: FPGA, VHDL & Co. CRC Byteweise


von sim (Gast)


Lesenswert?

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!

von guest (Gast)


Lesenswert?

ja, das geht
mache ich auch so. ;-)

von sim (Gast)


Lesenswert?

Und Wie (-:

von sim (Gast)


Lesenswert?

guest schrieb:
> ja, das geht
>
> mache ich auch so. ;-)

Es würde mir sehr helfen wenn du mir sagen könntest wie du das machst. 
(-:
Bitte.

von ... (Gast)


Lesenswert?

Mit einer Tabelle.

von sim (Gast)


Lesenswert?

Ok, könntest du es etwas ausführlicher beschreiben?

von Volker Z. (vza)


Lesenswert?

Du könntest auch in diesem Forum nach CRC suchen.
Ja, Du bist nicht der Erste der das Fragt!

von Jan M. (mueschel)


Lesenswert?

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".

von sim (Gast)


Lesenswert?

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.

von sim (Gast)


Lesenswert?

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.

von cfgardiner (Gast)


Lesenswert?

Hallo sim,

ich kann folgende Seite empfehlen:
http://www.easics.com/webtools/crctool

Grüße,
Charles

von sim (Gast)


Lesenswert?

Die kenne ich schon. Aber Danke.
Wie komme ich auf oben genannte Verknüpfungen? Dazu muss es doch ein 
Vorgehen geben.

von cfgardiner (Gast)


Lesenswert?

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.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

> 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
........

von sim (Gast)


Lesenswert?

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

von Jannulis T. (tembridis)


Lesenswert?

Auch wenn du es schon gelöst hast, ich hatte mal ein ähnliches Problem 
und habe dazu diesen Artikel gefunden:

http://www.repairfaq.org/filipg/LINK/F_crc_v3.html

von Johann (Gast)


Lesenswert?

Sim kannst Du nicht ein Link zu dem Dokument angeben.

von sim (Gast)


Lesenswert?

Johann schrieb:
> Sim kannst Du nicht ein Link zu dem Dokument angeben.


Klar (-:

http://www.modbus.org/docs/Modbus_over_serial_line_V1.pdf

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.