|
Алгоритм CRC-32 |
|
|
|
Jan 25 2005, 17:16
|
Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-08-04
Из: Ленинград
Пользователь №: 562

|
Столкнулся с проблемой - необходимо реализовать алгоритм CRC-32. Поиски в интернете описания самого алгоритма дали очень мало. В основном попадаются тексты программ. В чужом коде я еще с первого курса разбираться не любил. Да еще, насколько я понял, единого алгоритма (а тем более его реализации не существует). Они (алгоритмы), вроде как различаются по начальным значениям, по тому сколько бит сдвигается на каждом шаге и т.д. Суть формирования контрольной суммы понятна - деление входной посылки на фиксированный полином, остаткаток от деления и есть CRC. Непонятно отчего возникают различия. Например, при использовании табличного метода подсчета CRC, непонятно как влияет начальное значение, заносимое в регистр. Единственный толковый источник, обнаруженный мной - это "Элементарное руководство по CRC алгоритмам обнаружения ошибок" Ross N. Williams (в переводе на русский). Файл на всякий случай прикладываю к сообщению, вдруг кому пригодиться. Но там рассматриваются общие вопросы. Мне же необходимо выработать точный алгоритм. И реализовать его на VHDL. Если кто в этой теме разбирается - просьба откликнуться.
--------------------
Лень - это не врожденное чувство русского человека, а средство борьбы с неуемной, но бестолковой энергией начальника.
|
|
|
|
|
Jan 26 2005, 08:35
|

Эсквайр
    
Группа: Почетный участник
Сообщений: 1 013
Регистрация: 19-06-04
Из: • ℮lectronﭑχ •
Пользователь №: 62

|
ALLЦитата Мне же необходимо выработать точный алгоритм. И реализовать его на VHDL. Т.е. человеку требуется реализовать алгоритм аппаратно на ПЛИС, скорее всего, в режиме реального времени. Другими словами, программные реализации со сдвигами битов не катят  - для этого применяются параллельные (табличные) алгоритмы, аналогичные указанному makc.
--------------------
Кто ищет, тот всегда найдет
|
|
|
|
|
Jan 26 2005, 10:06
|
Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-08-04
Из: Ленинград
Пользователь №: 562

|
Цитата(makc @ Jan 25 2005, 20:30) Штука конечно интересная. Код генерится довольно простой, но хотелось бы разобраться в самом алгоритме. Так сказать докопаться до сути. В коде приведена функция, подсчитывающая новое значение NewCRC на основе входных данных и предыдущего значения CRC. Но начальное значение регистра CRC не предусмотрено (видимо это предлагается делать самому уже в своем коде). Да и непонятно на основании чего выведены выражения для подсчета CRC. Меня, так сказать, интересует больше алгоритмическая модель, нежели код на CRC. Т.к. некоторые навыки в написании простых проектов у меня уже имеются и Я думаю справлюсь с той частью, которая посвящена VHDL. Но все-равно спасибо за помощь.
--------------------
Лень - это не врожденное чувство русского человека, а средство борьбы с неуемной, но бестолковой энергией начальника.
|
|
|
|
|
Jan 26 2005, 17:40
|

Эсквайр
    
Группа: Почетный участник
Сообщений: 1 013
Регистрация: 19-06-04
Из: • ℮lectronﭑχ •
Пользователь №: 62

|
aalВсе зависит от конкретных требований проекта: у меня обрабатываемый поток в максимуме примерно 800 Мбит/с, отсюда и табличный алгоритм. В приложениях, не требующих вычисления контрольных сумм в реальном времени, можно поиграться и со сдвигами, и вообще вычислять CRC программным способом  . maksyaУ Вильямса алгоритмы описаны неплохо, хотя при первом прочтении может показаться, что несколько туманно. Проще всего будет раздобыть несколько исходников вычисления CRC-32 на языке высокого уровня и, пользуясь ими как практическим пособием, а Вильямсом - как теоретическим, постичь таинство вычисления контрольных сумм  , после чего заняться трансляцией выбранного алгоритма на HDL.
--------------------
Кто ищет, тот всегда найдет
|
|
|
|
|
Feb 9 2005, 04:32
|

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 4-11-04
Из: Омск
Пользователь №: 1 035

|
Тут у меня файлец валялся на винте. Мож кому сгодиться для ознакомления. Фидо (с)
--------------------
-- Если б мишки были пчелами... (с) --
|
|
|
|
|
Feb 18 2005, 15:53
|
Группа: Новичок
Сообщений: 3
Регистрация: 17-02-05
Пользователь №: 2 707

|
Может, моё изложение на пальцах тебе поможет реализовать это на VHDL. Каждый ненулевой бит в потоке вносит возмущение в поток. След этого возмущения распространяется в потоке. Конечное возмущение и есть CRC. Начальное возмущение вносится, чтобы полностью нулевые потоки различной длины имели различное конечное возмущение. След единичного возмущение для каждой позиции при параллельной обработке получить легко. Инициализируем СКС 000 и подаём единичное воздействие в нужной позиции. Полученная CRC и есть след. Для нескольких бит -CRC есть сумма по модулю 2 их CRC. Надеюсь, понятно, как это реализовать аппаратно. Не нужно громоздких таблиц. Для N разрядной порции M разрядного CRC достаточно N M разрядных регистров и Mразрядный N+1 входовых сумматор по модулю 2. Т.е. Для байтной обработки потока и 32 разрядной CRC - 8 32 разрядных регистров и 32 разрядный девяти входовый сумматор. (Это для полинома общего случая). В реале регистры можно заменить логической функцией. Если возникли вопросы могу добавить.
|
|
|
|
|
Mar 16 2005, 14:21
|

Местный
  
Группа: Свой
Сообщений: 310
Регистрация: 15-10-04
Пользователь №: 884

|
Посмотри на Xilinx.com - XAPP209. К нему прилагается скрипт на PERL-е crcgen.pl. Я из него сгенерил Verilog-код для подсчета CRC32 for IEEE802.3 с 4-битным входом (передача данных от MAC в PHY). Вроде бы результат работы совпадает с контрольным примером, приведенным Ross N.Williams-ом для "CRC-32" (хотя с этим я как раз сейчас окончательно и разбираюсь).
--------------------
"Я люблю путешествовать, посещать новые города, страны, знакомиться с новыми людьми." Чингисхан.
|
|
|
|
|
Apr 7 2005, 19:19
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 3-03-05
Пользователь №: 3 055

|
Дабы не начинать новый топик, позвольте мне задать следующий вопрос... Как формировать образующие полиномы для алгоритма CRC-32? ИМХО каждый из полиномов оптимизирован для обнаружения определенной совокупности ошибок (одиночных, двойных, пакетных) и таким образом ориентирован на определнный канал передачи данных или систему хранения информации. Также встает вопрос оценки вероятности ошибки... как её оценивать? В известной литературе есть ссылки на источники, но заполучить их не удается  (Tanenbaum "Computer Networks"). Если есть возможность, поделитесь информацией на данный счет.
--------------------
Victoria Concordia Crescit
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|