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

|
Столкнулся с проблемой - необходимо реализовать алгоритм CRC-32. Поиски в интернете описания самого алгоритма дали очень мало. В основном попадаются тексты программ. В чужом коде я еще с первого курса разбираться не любил. Да еще, насколько я понял, единого алгоритма (а тем более его реализации не существует). Они (алгоритмы), вроде как различаются по начальным значениям, по тому сколько бит сдвигается на каждом шаге и т.д. Суть формирования контрольной суммы понятна - деление входной посылки на фиксированный полином, остаткаток от деления и есть CRC. Непонятно отчего возникают различия. Например, при использовании табличного метода подсчета CRC, непонятно как влияет начальное значение, заносимое в регистр. Единственный толковый источник, обнаруженный мной - это "Элементарное руководство по CRC алгоритмам обнаружения ошибок" Ross N. Williams (в переводе на русский). Файл на всякий случай прикладываю к сообщению, вдруг кому пригодиться. Но там рассматриваются общие вопросы. Мне же необходимо выработать точный алгоритм. И реализовать его на VHDL. Если кто в этой теме разбирается - просьба откликнуться.
--------------------
Лень - это не врожденное чувство русского человека, а средство борьбы с неуемной, но бестолковой энергией начальника.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 21)
|
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
|
|
|
|
|
Apr 8 2005, 10:15
|
Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 31-03-05
Из: Зеленоград
Пользователь №: 3 839

|
Цитата(Z0Rk @ Apr 7 2005, 22:19) Как формировать образующие полиномы для алгоритма CRC-32? ИМХО каждый из полиномов оптимизирован для обнаружения определенной совокупности ошибок (одиночных, двойных, пакетных) и таким образом ориентирован на определнный канал передачи данных или систему хранения информации. Также встает вопрос оценки вероятности ошибки... как её оценивать? На память, могу ошибаться: для формирования полиномов используют разложение (XстепN - 1) в расширеном поле GF(2степ32). Вариантов получается много. Лит-ру сказать не могу, надо искать что-то вроде полей Галуа. Для систематических блоковых кодов, образованных добавлением CRC-32 к инф.части, строится весовой спектр и рассчитывается вероятность необнаруженной ошибки (в формулу входят весовые компоненты. начиная с 32-й). Вероятность ошибки декодирования для них не считают, т.к. CRC-32 используется в системах ARQ (переспроса). Искать нужно теорему Мак-Вильямс о дуальности весового спектра расстояний для линейных блоковых кодов. Для всех полиномов весовой спектр разный, в зависимости от его формы существует различная вероятность необнаруженной ошибки (как характеристики кода!) для данной длины кода. Для CRC-32 обнаруживаются все ошибки кратности (32-1), далее с какой-то вероятностью ошибки большей кратности. И чем больше смещен спектр в область "тяжелых" составляющих (т.е. большего веса), тем меньше вероятность необнаруженной ошибки для более "легких" составляющих. Вкратце так. Исправляющая способность 3-4 бита, т.к. мин. рассояние для кодовых слов =8 (определяется только степенью полинома), поэтому для исправления CRC-32 не используют, только для обнаружения. Исправление осущ. за счет переспроса по каналу обратной связи. см. Теория кодов, исправляющих ошибки Задачи очень ресурсоемкие, давно уже решены. Все просто ислользуют CRC-32 из рекомендованного перечня с хор. спектр. хар-ми. Для оценки вероятности ошибки в канале связи(КС) используется формула, в кот. входят - закон распр. ошибок в КС - С/Ш - составляющие весового спектра используемого кода. Вообще-то, обычно используются аппрокс. формулы для блоковых кодов с верхней и нижей границами для вероятности ошибки, чтоб не мучиться. Года 2-3 назад видел статью в ППИ (проблемы передачи информации) про границу Блиновского, да вообще, тут много всего.. Лит-ру поищу, потом кину.
|
|
|
|
|
Apr 8 2005, 14:59
|
Участник

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

|
То есть прямая задачка формирования полинома по заданным вероятностям обнаружения различных типов ошибок в аналитическом виде все-таки решаема, я правильно Вас понял? Опыт работы в полях Галуа имеется, то есть все опредялеяется, как всегда, жопочасами  . Цитата Вообще-то, обычно используются аппрокс. формулы для блоковых кодов с верхней и нижей границами для вероятности ошибки, чтоб не мучиться. Года 2-3 назад видел статью в ППИ (проблемы передачи информации) про границу Блиновского, да вообще, тут много всего.. Лит-ру поищу, потом кину. Если есть такая возможность буду весьма благодарен  .
--------------------
Victoria Concordia Crescit
|
|
|
|
|
Apr 11 2005, 07:16
|
Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 31-03-05
Из: Зеленоград
Пользователь №: 3 839

|
Цитата(Z0Rk @ Apr 8 2005, 17:59) То есть прямая задачка формирования полинома по заданным вероятностям обнаружения различных типов ошибок в аналитическом виде все-таки решаема, я правильно Вас понял? Сам хотел такого, но увы, это невозможно Отображение спектральных составляющих на вероятность нелинейно, отсюда получите множество решений (полиномов), среди кот. все равно надо будет отбирать по критерию подходящие. Кстати, для опред. числа неприводимых сомножителей при разложении полинома в расширенном поле используется кажется формула Эйлера, только книжку умную не найду никак, куда-то делась  . также как по синдрому ошибки CRC нельзя получить вектор ошибки, а только набор векторов кратности 1,2,3 и т.д. а далее по критерию (макс.правдоподобия) оставляем вектор с мин.весом
|
|
|
|
|
Apr 15 2005, 09:29
|
Группа: Новичок
Сообщений: 14
Регистрация: 28-10-04
Пользователь №: 1 001

|
Вот замечательная программка, правда под Солярис. Позволяет получать VHDL код по полиному и длине входного слова. Помимо CRC можно сгенерить кодировщик БЧХ и, вроде, что-то еще (работал с ней давно, Соляриса нет сейчас).
|
|
|
|
|
May 17 2005, 10:45
|
Группа: Новичок
Сообщений: 3
Регистрация: 17-02-05
Пользователь №: 2 707

|
Совершенно верно- поля Галуа. Я даже где-то (уж и не упомню где) видел программку, выдающую все пары полиномов для заданной размерности поля. (читай -разрядности полинома)
|
|
|
|
|
May 17 2005, 16:16
|
Участник

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

|
2basileus Каких полиномов? формирующих для CRC32? Если "да" то говорите где искать программу...
--------------------
Victoria Concordia Crescit
|
|
|
|
|
Dec 4 2005, 14:03
|

Частый гость
 
Группа: Свой
Сообщений: 75
Регистрация: 3-09-05
Из: Россия, Москва
Пользователь №: 8 195

|
Цитата(Esquire @ Feb 19 2005, 12:52)  Есть ли литература, в которой описан указанный метод расчета CRC32? Посмотри этот материал и список литературы в нём - там достаточно хорошо объясняется принцип вычисления CRC-кода и дан конкретный пример:
crcW2003.rar ( 52.06 килобайт )
Кол-во скачиваний: 791Что касается начальной инициализации, то единицами регистр инициализируется для того, чтобы первые нули сообщения были охвачены CRC-кодом. Если этого не сделать, то алгоритм начнёт работать только после появления первой единицы - вне зависимости от реализации. Поэтому во всех спецификациях (например, RapidIO, PCI Express) требуют начальной инициализации регистров единицами. В качестве литературы по циклическим избыточным кодам, а также по формированию полиномов рекомендую следующие: 1. Никитин Г.И. Помехоустойчивые циклические коды : Учеб. пособие/ Г.И.Никитин,С.С.Поддубный. -СПб., 1998.-71 с. :ил. 2. Евдонин А.М. Циклическое кодирование : Учеб. пособие/ А.М.Евдонин. -Челябинск: Изд-во ЮУрГУ, 1997.-59 с. :ил. 3. Когновицкий О.С. Основы циклических кодов : Учеб. пособие 2305/ О.С.Когновицкий. -Л., 1990.-64 с. 4. Смирнов А.С. Основы теории кодирования. Линейные групповые и циклические коды : Учеб.пособие/ А.С.Смирнов. -СПб, 1998.-148 с. Когда-то на заре появления RapidIO мне пришлось сделать для физического уровня CRC-кодер/декодер по приведённой в прилагаемом файле методике. После перехода на PCI Express по этой же методике (чуть усовершенствовав реализацию) сделал новый CRC-кодер/декодер - на Xilinx'е вот уже несколько лет работает безукоризненно (время прохождения конвейера 1 такт, частота 125 МГц).
--------------------
"О наслажденье ходить по краю. Замрите, ангелы, смотрите: я играю. Разбор грехов моих оставьте до поры, Вы оцените красоту игры!"
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|