Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: CRC8

CRC8 5 года 5 мес. назад #7683

  • LAS
  • 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.

Правильную последовательность я описал?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

CRC8 5 года 5 мес. назад #7685

  • nckm
  • 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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

CRC8 5 года 5 мес. назад #7686

  • LAS
  • LAS аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 6
  • Спасибо получено: 0
Большое спасибо! Не понял только почему в статье пишут:

• Начальное значение для регистра crc32_, хранящего текущую контрольную сумму должно быть 0FFFFFFFFh.
утверждали что crc=8'h00;

А вы наоборот обнуляете. И еще не выполняете этот пункт:

• Вычисленная контрольная сумма должна быть инвертирована (XOR 0xFFFFFFFF).

В статье косяк? Вроде в одном генераторе кода делали.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

CRC8 5 года 5 мес. назад #7687

  • nckm
  • nckm аватар
  • Не в сети
  • Администрация форума
  • Администрация форума
  • Сообщений: 112
  • Спасибо получено: 34
На самом деле я "подогнал результат под ваш ответ".
Я не знаю правильно это или нет.
Ну честно говоря не совсем подогнал - вы ссылаетесь на страницу crccalc.com/ и там есть ссылка на github.com с исходниками калькулятора.
Я смотрел исходники C# и смотрел что они там делают.
Кроме того, на странице crccalc.com/
там прямо есть таблица какие init значения используются для того или иного алгоритма.
В таблице для crc8/maxim - Init=0
Спасибо сказали: LAS

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

CRC8 5 года 5 мес. назад #7688

  • LAS
  • LAS аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 6
  • Спасибо получено: 0
Спасибо, увидел. Всё заработало.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от LAS.
  • Страница:
  • 1
Время создания страницы: 0.098 секунд
Работает на Kunena форум