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!
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.
Du könntest auch in diesem Forum nach CRC suchen. Ja, Du bist nicht der Erste der das Fragt!
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".
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.
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.
Die kenne ich schon. Aber Danke. Wie komme ich auf oben genannte Verknüpfungen? Dazu muss es doch ein Vorgehen geben.
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.
> 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 | ........
|
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.