Parallele CRC-Berechnung in VHDL
CRC-Werte für die zyklische Redundanzprüfung können mit programmierbarer Logik sehr einfach mit einem rückgekoppelten Schieberegister erzeugt werden, wenn die Nutzdaten in bit-serieller Form vorliegen. Meist liegen die Daten allerdings in Form von Datenworten verschiedener Länge vor. Auch in diesen Fällen lässt sich die CRC mit programmierbarer Logik berechnen. Mit passender Kombinatorik ist das in einem Taktzyklus pro Datenwort möglich.
Der CRC-Typ ist durch folgende Parameter definiert:
- Polynomlänge = CRC Länge in Bits
- das binäre Generator-Polynom
- CRC Startwert
- Nutzdaten revers oder nicht revers
- CRC revers oder nicht revers
- CRC am Ende invertiert oder nicht
Weiterhin muss die Datenwortbreite definiert sein, wenn die Kombinatorik für die parallele CRC-Erzeugung entwickelt werden soll.
Überblick zu CRC-Typen: Catalogue of parametrised CRC algorithms
Für die CRC-Erzeugung aus Nutzdatenbytes hat sich die Anwendung einer VHDL-Funktion nach dem folgenden Prinzip bewährt:
crc16 <= CRC16_Initial;
loop for all data bytes
crc16 <= NewCRC(crc16, DBYTE);
loop end
crc16 <= crc16 xor CRC16_Final;
Die Funktion"NewCRC" enthält die Kombinatorik zur parallelen CRC-Erzeugung. Diese Funktion und die Konstanten "CRC16_Initial" und "CRC16_Final" sind abhängig vom CRC-Typ. Sie werden in einem Package definiert, welches in einem separaten File im Quellverzeichnis des Projekts liegt. Damit können sie über die Library "work" eingebunden werden. Das Package File muss zuerst compiliert werden.
Wie die Funktion"NewCRC" in einer State Machine verwendet werden kann sehen sie hier.
Wie die Kombinatorik in Abhängigkeit vom CRC-Typ erzeugt werden kann ist hier beschrieben:
Parallel CRC Generation (IEEE Micro, Vol 10 Issue 5, September 1990)
A Practical Parallel CRC Generation Method (Circuit Cellar, January 2010)