CRC Byteweise

Gast #1998894
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!
Gast #1998973
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.
Gast #1999007
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.
Gast #1999310
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.
(Firma: www.dossmatik.de) #1999643
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
........
Gast #2000340
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren