реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Алгоритм CRC-32
maksya
сообщение Jan 25 2005, 17:16
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-08-04
Из: Ленинград
Пользователь №: 562



Столкнулся с проблемой - необходимо реализовать алгоритм CRC-32. Поиски в интернете описания самого алгоритма дали очень мало. В основном попадаются тексты программ. В чужом коде я еще с первого курса разбираться не любил. Да еще, насколько я понял, единого алгоритма (а тем более его реализации не существует). Они (алгоритмы), вроде как различаются по начальным значениям, по тому сколько бит сдвигается на каждом шаге и т.д.

Суть формирования контрольной суммы понятна - деление входной посылки на фиксированный полином, остаткаток от деления и есть CRC. Непонятно отчего возникают различия. Например, при использовании табличного метода подсчета CRC, непонятно как влияет начальное значение, заносимое в регистр.

Единственный толковый источник, обнаруженный мной - это "Элементарное руководство по CRC алгоритмам обнаружения ошибок" Ross N. Williams (в переводе на русский). Файл на всякий случай прикладываю к сообщению, вдруг кому пригодиться. Но там рассматриваются общие вопросы. Мне же необходимо выработать точный алгоритм. И реализовать его на VHDL.

Если кто в этой теме разбирается - просьба откликнуться.
Прикрепленные файлы
Прикрепленный файл  crcguide.pdf ( 199.59 килобайт ) Кол-во скачиваний: 472
 


--------------------
Лень - это не врожденное чувство русского человека, а средство борьбы с неуемной, но бестолковой энергией начальника.
Go to the top of the page
 
+Quote Post
makc
сообщение Jan 25 2005, 17:30
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Думаю это поможет http://www.easics.be/webtools/crctool


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
jojo
сообщение Jan 25 2005, 18:52
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 574
Регистрация: 9-10-04
Из: FPGA-city
Пользователь №: 827



Кое-что положил в
/upload/CODE/crclib_toolbox
Go to the top of the page
 
+Quote Post
aal
сообщение Jan 26 2005, 03:56
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 20-10-04
Из: Новосибирская обл, п.Краснообск.
Пользователь №: 916



Вот кусочек для CRC 16. Может аналогично и CRC 32 сделать.

char test_flash(void)
{
unsigned char const __flash *mem;
unsigned int val; // Polinom 0x11021
unsigned char CRC_Low=0; // low 8 bits of CRC
unsigned char CRC_High=0; // high 8 bits of CRC
unsigned char carry;
mem=0;
for(val=0;val<FLASHEND-1;val++)
{
carry = CRC_High ^ *mem++;
carry = carry ^ (carry>>4);
CRC_High = CRC_Low ^ (carry<<4) ^ (carry>>3);
CRC_Low = carry ^ (carry<<5);
}
CRC=CRC_High << 8 + CRC_Low;
if (CRC_Low==*mem++ && CRC_High==*mem) return(0);
else return(1);
}


--------------------
_____________________________________
Пароли неприемлемы, легко взламываются терморектальным криптоанализатором.
Go to the top of the page
 
+Quote Post
Esquire
сообщение Jan 26 2005, 08:35
Сообщение #5


Эсквайр
*****

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



ALL

Цитата
Мне же необходимо выработать точный алгоритм. И реализовать его на VHDL.


Т.е. человеку требуется реализовать алгоритм аппаратно на ПЛИС, скорее всего, в режиме реального времени. Другими словами, программные реализации со сдвигами битов не катят smile3046.gif - для этого применяются параллельные (табличные) алгоритмы, аналогичные указанному makc.


--------------------
Кто ищет, тот всегда найдет
Go to the top of the page
 
+Quote Post
maksya
сообщение Jan 26 2005, 10:06
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-08-04
Из: Ленинград
Пользователь №: 562



Цитата(makc @ Jan 25 2005, 20:30)
Думаю это поможет http://www.easics.be/webtools/crctool
*


Штука конечно интересная. Код генерится довольно простой, но хотелось бы разобраться в самом алгоритме. Так сказать докопаться до сути. В коде приведена функция, подсчитывающая новое значение NewCRC на основе входных данных и предыдущего значения CRC. Но начальное значение регистра CRC не предусмотрено (видимо это предлагается делать самому уже в своем коде). Да и непонятно на основании чего выведены выражения для подсчета CRC.

Меня, так сказать, интересует больше алгоритмическая модель, нежели код на CRC. Т.к. некоторые навыки в написании простых проектов у меня уже имеются и Я думаю справлюсь с той частью, которая посвящена VHDL.

Но все-равно спасибо за помощь.


--------------------
Лень - это не врожденное чувство русского человека, а средство борьбы с неуемной, но бестолковой энергией начальника.
Go to the top of the page
 
+Quote Post
makc
сообщение Jan 26 2005, 11:46
Сообщение #7


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Идея проста до гениальности - берется модель сдвигового регистра с обратной связью (LFSR) для нужного CRC и производятся сдвиги и вычисления значений не над конкретными значениями битов, а над переменными для получения выражений новых значений битов CRC. Используя такой подход написать модель вычисления уравнений для параллельной выработки CRC совсем не сложно.

Пример моей модели идет в приложении к письму. Написано довольно давно и на C++, но разобраться можно - ничего сверхъестественного там нет. smile.gif
Прикрепленные файлы
Прикрепленный файл  CRC2Parallel.rar ( 10.13 килобайт ) Кол-во скачиваний: 257
 


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
aal
сообщение Jan 26 2005, 12:10
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 230
Регистрация: 20-10-04
Из: Новосибирская обл, п.Краснообск.
Пользователь №: 916



2 Esquire

При схемном вводе этот алгоритм можно реализовать и без сдвигов (xHDL не изучал пока.). Получится автомат записывающий по фронту входной байт или сразу комбинация вх. байта и CRCHigh. А по спаду уже готвый CRC на выход. Помоему очень красивый алгоритм. А по резету или другому вх. сигналу обнуляем CRC регистр.

Алгоритм не я придумал. Где то в сети нашёл и пользую....


--------------------
_____________________________________
Пароли неприемлемы, легко взламываются терморектальным криптоанализатором.
Go to the top of the page
 
+Quote Post
Esquire
сообщение Jan 26 2005, 17:40
Сообщение #9


Эсквайр
*****

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



aal
Все зависит от конкретных требований проекта: у меня обрабатываемый поток в максимуме примерно 800 Мбит/с, отсюда и табличный алгоритм.
В приложениях, не требующих вычисления контрольных сумм в реальном времени, можно поиграться и со сдвигами, и вообще вычислять CRC программным способом tongue.gif .

maksya
У Вильямса алгоритмы описаны неплохо, хотя при первом прочтении может показаться, что несколько туманно.
Проще всего будет раздобыть несколько исходников вычисления CRC-32 на языке высокого уровня и, пользуясь ими как практическим пособием, а Вильямсом - как теоретическим, постичь таинство вычисления контрольных сумм cool.gif , после чего заняться трансляцией выбранного алгоритма на HDL.


--------------------
Кто ищет, тот всегда найдет
Go to the top of the page
 
+Quote Post
CeDeX
сообщение Feb 9 2005, 04:32
Сообщение #10


Частый гость
**

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



Тут у меня файлец валялся на винте.
Мож кому сгодиться для ознакомления.
Фидо (с)
Прикрепленные файлы
Прикрепленный файл  CRC_FAQ.TXT ( 32.51 килобайт ) Кол-во скачиваний: 605
 


--------------------
-- Если б мишки были пчелами... (с) --
Go to the top of the page
 
+Quote Post
derun
сообщение Feb 9 2005, 07:50
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 133
Регистрация: 12-01-05
Из: Украина. Чернигов
Пользователь №: 1 908



«A Painless Guide to CRC Error Detection Algorithms» Ross N. Williams перевод на русский (167кБ)
Go to the top of the page
 
+Quote Post
basileus
сообщение Feb 18 2005, 15:53
Сообщение #12





Группа: Новичок
Сообщений: 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 разрядный девяти входовый сумматор. (Это для полинома
общего случая). В реале регистры можно заменить логической функцией.
Если возникли вопросы могу добавить.
Go to the top of the page
 
+Quote Post
Esquire
сообщение Feb 19 2005, 09:52
Сообщение #13


Эсквайр
*****

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



basileus
Есть ли литература, в которой описан указанный метод расчета CRC32?


--------------------
Кто ищет, тот всегда найдет
Go to the top of the page
 
+Quote Post
Porychik Kize
сообщение Mar 16 2005, 14:21
Сообщение #14


Местный
***

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



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


--------------------
"Я люблю путешествовать, посещать новые города, страны, знакомиться с новыми людьми."
Чингисхан.
Go to the top of the page
 
+Quote Post
Z0Rk
сообщение Apr 7 2005, 19:19
Сообщение #15


Участник
*

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



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


--------------------
Victoria Concordia Crescit
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016