-
LAS
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 6
-
Спасибо получено: 0
-
-
|
Прочитал статью
marsohod.org/projects/marsohod2/263-rtl-recv
.
Решил написать калькулятор CRC 8 с полиномом x^8 + x^5 + x^4 + 1. Воспользовался генератором кода
www.easics.be/webtools/crctool
. Получил следующее:
function [7:0] nextCRC8_D8;
input [7:0] Data;
input [7:0] crc;
reg [7:0] d;
reg [7:0] c;
reg [7:0] newcrc;
begin
d = Data;
c = crc;
newcrc[0] = d[6] ^ d[4] ^ d[3] ^ d[0] ^ c[0] ^ c[3] ^ c[4] ^ c[6];
newcrc[1] = d[7] ^ d[5] ^ d[4] ^ d[1] ^ c[1] ^ c[4] ^ c[5] ^ c[7];
newcrc[2] = d[6] ^ d[5] ^ d[2] ^ c[2] ^ c[5] ^ c[6];
newcrc[3] = d[7] ^ d[6] ^ d[3] ^ c[3] ^ c[6] ^ c[7];
newcrc[4] = d[7] ^ d[6] ^ d[3] ^ d[0] ^ c[0] ^ c[3] ^ c[6] ^ c[7];
newcrc[5] = d[7] ^ d[6] ^ d[3] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[3] ^ c[6] ^ c[7];
newcrc[6] = d[7] ^ d[4] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[4] ^ c[7];
newcrc[7] = d[5] ^ d[3] ^ d[2] ^ c[2] ^ c[3] ^ c[5];
nextCRC8_D8 = newcrc;
end
endfunction
Проверил в моделсиме - результаты не совпадают с рассчитанными в онлайн калькуляторе crccalc.com/.
Что нужно сделать с данными до отправки в функцию генерации CRC8 и что после? Например, нужно посчитать CRC8 для байта данных 8'hAA. Судя по статье нужно сделать следующее:
1) сдвигаем байт данных: 8'hAA = 8'b10101010;
после сдвига получаем 8'b01010101
2) отправляем полученное значение в функцию расчёта CRC8. Получаем значение: 8'b10001011.
3) сдвигаем байт данных, после сдвига получаем 8'b11010001.
4) инвертируем байт, получаем 8'b00101110 = 8'h2E
В калькуляторе crccalc.com/ мой полином обозначается CRC-8/MAXIM, и для числа 8'hAA CRC8 должна быть равна 0xD1.
Правильную последовательность я описал?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
nckm
-
-
Не в сети
-
Администрация форума
-
-
Сообщений: 112
-
Спасибо получено: 34
-
-
-
-
-
|
С этими CRC всегда головная боль - пока поймешь как оно считается и что откуда берется - с ума можно сойти.
Вот так вроде бы получается из AA ваш D1:
module tb;
reg [7:0]crc;
initial
begin
crc=8'h00;
crc=nextCRC8_D8( reverse(8'hAA),crc);
$display("%X", reverse(crc) );
$finish();
end
function [7:0]reverse;
input [7:0]D;
begin
reverse={ D[0],D[1],D[2],D[3], D[4],D[5],D[6],D[7] };
end
endfunction
function [7:0] nextCRC8_D8;
input [7:0] Data;
input [7:0] crc;
reg [7:0] d;
reg [7:0] c;
reg [7:0] newcrc;
begin
d = Data;
c = crc;
newcrc[0] = d[6] ^ d[4] ^ d[3] ^ d[0] ^ c[0] ^ c[3] ^ c[4] ^ c[6];
newcrc[1] = d[7] ^ d[5] ^ d[4] ^ d[1] ^ c[1] ^ c[4] ^ c[5] ^ c[7];
newcrc[2] = d[6] ^ d[5] ^ d[2] ^ c[2] ^ c[5] ^ c[6];
newcrc[3] = d[7] ^ d[6] ^ d[3] ^ c[3] ^ c[6] ^ c[7];
newcrc[4] = d[7] ^ d[6] ^ d[3] ^ d[0] ^ c[0] ^ c[3] ^ c[6] ^ c[7];
newcrc[5] = d[7] ^ d[6] ^ d[3] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[3] ^ c[6] ^ c[7];
newcrc[6] = d[7] ^ d[4] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[4] ^ c[7];
newcrc[7] = d[5] ^ d[3] ^ d[2] ^ c[2] ^ c[3] ^ c[5];
nextCRC8_D8 = newcrc;
end
endfunction
endmodule
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
LAS
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 6
-
Спасибо получено: 0
-
-
|
Большое спасибо! Не понял только почему в статье пишут:
• Начальное значение для регистра crc32_, хранящего текущую контрольную сумму должно быть 0FFFFFFFFh.
утверждали что crc=8'h00;
А вы наоборот обнуляете. И еще не выполняете этот пункт:
• Вычисленная контрольная сумма должна быть инвертирована (XOR 0xFFFFFFFF).
В статье косяк? Вроде в одном генераторе кода делали.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
nckm
-
-
Не в сети
-
Администрация форума
-
-
Сообщений: 112
-
Спасибо получено: 34
-
-
-
-
-
|
На самом деле я "подогнал результат под ваш ответ".
Я не знаю правильно это или нет.
Ну честно говоря не совсем подогнал - вы ссылаетесь на страницу
crccalc.com/
и там есть ссылка на github.com с исходниками калькулятора.
Я смотрел исходники C# и смотрел что они там делают.
Кроме того, на странице
crccalc.com/
там прямо есть таблица какие init значения используются для того или иного алгоритма.
В таблице для crc8/maxim - Init=0
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
LAS
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 6
-
Спасибо получено: 0
-
-
|
Спасибо, увидел. Всё заработало.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от LAS.
|
Время создания страницы: 0.098 секунд