CRC Testbench + axr_crc architecture
This commit is contained in:
+152
-113
@@ -1,114 +1,153 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// Berechnen einer 8 Bit CRC-Pruefsumme
|
||||
uint8_t crc8(uint8_t* data, size_t size);
|
||||
|
||||
// Berechnen einer 32 Bit CRC-Pruefsumme
|
||||
uint32_t crc32(uint8_t* inBytes, size_t size, uint32_t polynomial);
|
||||
|
||||
// Check einer 32 Bit CRC-Pruefsumme
|
||||
int checkCrc32(uint8_t* data, size_t size, uint32_t crc, uint32_t polynomial);
|
||||
|
||||
int main()
|
||||
{
|
||||
char msg[] = "Hello World!\0\0\0\0";
|
||||
uint32_t crc = crc32((uint8_t*) msg, strlen(msg)+4, 0x4C11DB7);
|
||||
printf("CRC32 of '%s': 0x%08x\n\n", msg, crc);
|
||||
|
||||
int crcValid = checkCrc32((uint8_t*) msg, strlen(msg), crc, 0x4C11DB7);
|
||||
// String einlesen und CRC32 ausgeben
|
||||
// char input[1024];
|
||||
// printf("String eingeben:\n");
|
||||
// while (1)
|
||||
// {
|
||||
// // Liest eine Zeile von stdin ein und speichert sie in 'eingabe'
|
||||
// if (fgets(input, sizeof(input), stdin) != NULL) {
|
||||
// // Entfernt das Newline-Zeichen, das fgets hinzufügt
|
||||
// size_t laenge = strlen(input);
|
||||
// if (laenge > 0 && input[laenge - 1] == '\n') {
|
||||
// input[laenge - 1] = '\0';
|
||||
// }
|
||||
// }
|
||||
|
||||
// crc = crc32((uint8_t*) input, strlen(input));
|
||||
// printf("'%s' -> 0x%08x\n\n", input, crc);
|
||||
// }
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t crc8(uint8_t* inBytes, size_t size)
|
||||
{
|
||||
uint8_t crc = 0x0; // initial value
|
||||
uint8_t polynomial = 0x7;
|
||||
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
for (int bit = 7; bit >= 0; bit--) {
|
||||
// get next bit
|
||||
uint8_t inBit = (inBytes[i] & (1<<bit)) ? 1 : 0;
|
||||
|
||||
// check if MSB is set
|
||||
uint8_t MSB_high = crc & 0x80;
|
||||
|
||||
// input Bit reinschieben
|
||||
crc = (uint8_t) (crc << 1);
|
||||
crc ^= inBit;
|
||||
|
||||
if (MSB_high) {
|
||||
crc ^= polynomial;
|
||||
}
|
||||
// for (int in = 0; in < 8; in++) {
|
||||
// printf("%d", !!((crc << in) & 0x80));
|
||||
// }
|
||||
// printf("\n");
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint32_t crc32(uint8_t* inBytes, size_t size, uint32_t polynomial)
|
||||
{
|
||||
uint32_t crc = 0x0; // initial value
|
||||
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
for (int bit = 7; bit >= 0; bit--) {
|
||||
// get next bit
|
||||
uint8_t inBit = (inBytes[i] & (1<<bit)) ? 1 : 0;
|
||||
|
||||
// check if MSB is set
|
||||
uint32_t MSB_high = crc & 0x80000000;
|
||||
|
||||
// input Bit reinschieben
|
||||
crc <<= 1;
|
||||
crc ^= inBit;
|
||||
|
||||
if (MSB_high) {
|
||||
crc ^= polynomial;
|
||||
}
|
||||
// for (int in = 0; in < 8; in++) {
|
||||
// printf("%d", !!((crc << in) & 0x80));
|
||||
// }
|
||||
// printf("\n");
|
||||
}
|
||||
// printf("0x%x\n", crc);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
int checkCrc32(uint8_t* data, size_t size, uint32_t crc, uint32_t polynomial)
|
||||
{
|
||||
// Daten und CRC zusammenhaengend in den HEAP Speicher kopieren
|
||||
uint8_t *dataCrc = malloc(size + 4);
|
||||
memcpy_s(dataCrc, size+4, data, size);
|
||||
for (uint32_t i = 0; i < 4; i++) {
|
||||
dataCrc[size+i] = (crc >> (24 - 8 * i)) & 0xFF; // Extract the MSB first
|
||||
}
|
||||
|
||||
// CRC von Daten mit CRC-Pruefsumme berechnen
|
||||
// Bei validen Daten bzw. Pruefsumme kommt Null heraus
|
||||
if (crc32(dataCrc, size+4, polynomial) == 0) return 1;
|
||||
else return 0;
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// Berechnen einer 8 Bit CRC-Pruefsumme
|
||||
uint8_t crc8(uint8_t* data, size_t size);
|
||||
|
||||
// Berechnen einer 32 Bit CRC-Pruefsumme
|
||||
uint32_t crc32(uint8_t* inBytes, size_t size, uint32_t polynomial, uint32_t initialValue);
|
||||
|
||||
// Check einer 32 Bit CRC-Pruefsumme
|
||||
int checkCrc32(uint8_t* data, size_t size, uint32_t crc, uint32_t polynomial);
|
||||
|
||||
// Berechnung der Pruefsummen fuer crc_tb
|
||||
void calc_testcases();
|
||||
|
||||
int main()
|
||||
{
|
||||
// Testweise Pruefsumme berechnen und ausgeben
|
||||
char msg[] = "Hello World!\0\0\0\0";
|
||||
uint32_t crc = crc32((uint8_t*) msg, strlen(msg)+4, 0x4C11DB7, 0x0);
|
||||
printf("CRC32 of '%s': 0x%08x\n\n", msg, crc);
|
||||
|
||||
int crcValid = checkCrc32((uint8_t*) msg, strlen(msg), crc, 0x4C11DB7);
|
||||
|
||||
calc_testcases();
|
||||
|
||||
// String einlesen und CRC32 ausgeben
|
||||
// char input[1024];
|
||||
// printf("String eingeben:\n");
|
||||
// while (1)
|
||||
// {
|
||||
// // Liest eine Zeile von stdin ein und speichert sie in 'eingabe'
|
||||
// if (fgets(input, sizeof(input), stdin) != NULL) {
|
||||
// // Entfernt das Newline-Zeichen, das fgets hinzufügt
|
||||
// size_t laenge = strlen(input);
|
||||
// if (laenge > 0 && input[laenge - 1] == '\n') {
|
||||
// input[laenge - 1] = '\0';
|
||||
// }
|
||||
// }
|
||||
|
||||
// crc = crc32((uint8_t*) input, strlen(input));
|
||||
// printf("'%s' -> 0x%08x\n\n", input, crc);
|
||||
// }
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Berechnung der Pruefsummen fuer crc_tb
|
||||
void calc_testcases()
|
||||
{
|
||||
// CRC-Pruefsummen fuer Testbench crc_tb berechnen
|
||||
uint8_t testcases[11][11] = {
|
||||
{8, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}, // CRC_tb
|
||||
{8, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x11}, // CRC_tb
|
||||
{8, 0x12, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDE}, // CRC_tb
|
||||
};
|
||||
|
||||
uint32_t testPolynomials[3] = {
|
||||
0x4C11DB7,
|
||||
0x1EDC6F41,
|
||||
0xA833982B,
|
||||
};
|
||||
|
||||
uint32_t initalValues[2] = {
|
||||
0x0,
|
||||
0xFFFFFFFF,
|
||||
};
|
||||
|
||||
for (int testcase = 0; testcase < 3; testcase++) {
|
||||
for (int polynomial = 0; polynomial < 3; polynomial++) {
|
||||
for (int intialValue = 0; intialValue < 2; intialValue++) {
|
||||
uint32_t checksum;
|
||||
checksum = crc32(testcases[testcase]+1, testcases[testcase][0], testPolynomials[polynomial], initalValues[intialValue]);
|
||||
printf("Testfall %d, polynom %d, iV %d: x\"%08x\"\n", testcase, polynomial, intialValue, checksum);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t crc8(uint8_t* inBytes, size_t size)
|
||||
{
|
||||
uint8_t crc = 0x0; // initial value
|
||||
uint8_t polynomial = 0x7;
|
||||
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
for (int bit = 7; bit >= 0; bit--) {
|
||||
// get next bit
|
||||
uint8_t inBit = (inBytes[i] & (1<<bit)) ? 1 : 0;
|
||||
|
||||
// check if MSB is set
|
||||
uint8_t MSB_high = crc & 0x80;
|
||||
|
||||
// input Bit reinschieben
|
||||
crc = (uint8_t) (crc << 1);
|
||||
crc ^= inBit;
|
||||
|
||||
if (MSB_high) {
|
||||
crc ^= polynomial;
|
||||
}
|
||||
// for (int in = 0; in < 8; in++) {
|
||||
// printf("%d", !!((crc << in) & 0x80));
|
||||
// }
|
||||
// printf("\n");
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint32_t crc32(uint8_t* inBytes, size_t size, uint32_t polynomial, uint32_t initialValue)
|
||||
{
|
||||
uint32_t crc = initialValue;
|
||||
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
for (int bit = 7; bit >= 0; bit--) {
|
||||
// get next bit
|
||||
uint8_t inBit = (inBytes[i] & (1<<bit)) ? 1 : 0;
|
||||
|
||||
// check if MSB is set
|
||||
uint32_t MSB_high = crc & 0x80000000;
|
||||
|
||||
// input Bit reinschieben
|
||||
crc <<= 1;
|
||||
crc ^= inBit;
|
||||
|
||||
if (MSB_high) {
|
||||
crc ^= polynomial;
|
||||
}
|
||||
// for (int in = 0; in < 8; in++) {
|
||||
// printf("%d", !!((crc << in) & 0x80));
|
||||
// }
|
||||
// printf("\n");
|
||||
}
|
||||
// printf("0x%x\n", crc);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
int checkCrc32(uint8_t* data, size_t size, uint32_t crc, uint32_t polynomial)
|
||||
{
|
||||
// Daten und CRC zusammenhaengend in den HEAP Speicher kopieren
|
||||
uint8_t *dataCrc = malloc(size + 4);
|
||||
memcpy_s(dataCrc, size+4, data, size);
|
||||
for (uint32_t i = 0; i < 4; i++) {
|
||||
dataCrc[size+i] = (crc >> (24 - 8 * i)) & 0xFF; // Extract the MSB first
|
||||
}
|
||||
|
||||
// CRC von Daten mit CRC-Pruefsumme berechnen
|
||||
// Bei validen Daten bzw. Pruefsumme kommt Null heraus
|
||||
if (crc32(dataCrc, size+4, polynomial, 0x0) == 0) return 1;
|
||||
else return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user