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.
1 | Startwert | 24Bit Daten | Anhängende Nullen
|
2 | 0101 | 000000000100001111111111 | 0000
|
3 | 01010000000001000011111111110000 / 11101
|
4 | 00100100000001000011111111110000
|
5 | 00011110000001000011111111110000
|
6 | 00000011000001000011111111110000
|
7 | 00000000101001000011111111110000
|
8 | 00000000010011000011111111110000
|
9 | 00000000001110000011111111110000
|
10 | 00000000000000100011111111110000
|
11 | 00000000000000011001111111110000
|
12 | 00000000000000000100111111110000
|
13 | 00000000000000000011101111110000
|
14 | 00000000000000000000000111110000
|
15 | 00000000000000000000000000100000
|
16 | 00000000000000000000000000011010
|
17 | 00000000000000000000000000000111 --> CRC-Wert 0111
|
mein Programm errechnet aber --> 0001
Ich wollte bei meinem Programm die Methode mit FlipFlops und XORs
verwenden.
Das ist es:
1 | entity CRCModul is
|
2 | generic(Nibbleanzahl: natural := 6);
|
3 | port(clk : in bit;
|
4 | Reset : in bit;
|
5 | NibbleData : in bit_vector(0 to (4*Nibbleanzahl)-1);
|
6 | NewNibbles : in bit;
|
7 | CRCValue : out bit_vector(0 to 3);
|
8 | CRCFinish : out bit);
|
9 | end CRCModul;
|
10 |
|
11 | architecture Behavioral of CRCModul is
|
12 | signal CRCBuffer : bit_vector(0 to 3);
|
13 | signal NibbleBuffer : bit_vector(0 to (4*Nibbleanzahl)-1);
|
14 | signal Finish : bit;
|
15 | signal count : integer range 0 to (Nibbleanzahl*4)+4;
|
16 | begin
|
17 |
|
18 | CRCFinish <= Finish;
|
19 |
|
20 | CRC: process(Reset, clk, NibbleData)
|
21 | begin
|
22 | if Reset = '1' then --asynchron Reset
|
23 | count <= 0;
|
24 | CRCBuffer <= "0101"; -- Seed-Value|Startwert "0101"
|
25 | NibbleBuffer <= NibbleData;
|
26 | Finish <= '0';
|
27 | elsif clk = '1' and clk'event then
|
28 | if count = (Nibbleanzahl*4)+4 then -- Wenn Berechnung Fertig
|
29 | Finish <= '1'; -- Finishflag setzen
|
30 | CRCValue <= CRCBuffer; -- Errechneter Wert an Ausgang übergeben
|
31 | count <= 0; -- Zähler zurücksetzen
|
32 | elsif Finish = '0' then -- Wenn Berechnung noch nicht Fertig
|
33 | count <= count + 1; -- Hochzählen
|
34 | end if;
|
35 |
|
36 | if Finish = '1' and NewNibbles = '1' then -- Wenn Berechnung fertig war und ein neuer Wert berechnet werden soll.
|
37 | CRCBuffer <= "0101"; -- Seed-Value|Startwert "0101"
|
38 | NibbleBuffer <= NibbleData; -- Daten vom Ausgang zwischenspeichern
|
39 | Finish <= '0'; -- Finish Flag zurücksetzen
|
40 | else
|
41 | -- Polynom x^4+x^3+x^2+1 realisierung
|
42 | CRCBuffer(0) <= CRCBuffer(3) XOR NibbleBuffer(0);
|
43 | CRCBuffer(1) <= CRCBuffer(0);
|
44 | CRCBuffer(2) <= CRCBuffer(3) XOR CRCBuffer(1);
|
45 | CRCBuffer(3) <= CRCBuffer(3) XOR CRCBuffer(2);
|
46 | NibbleBuffer <= NibbleBuffer(1 to (4*Nibbleanzahl)-1) & '0';
|
47 | end if;
|
48 | end if;
|
49 | end process CRC;
|
50 | end Behavioral;
|
Wäre super, wenn mir jemand weiter helfen könnte, ich sitze daran schon
eine halbe Ewigkeit.