Jump to content

    
Sign in to follow this  

Recommended Posts

Производитель требует и приводит пример расчёта CRC16

Quote

The CRC generator polynomial is: G(X) = X16 + X12 + X5 + 1. Table 26 describes the
equations for 16-bit parallel generation of the resulting polynomial (based on a word
boundary).

3.thumb.jpeg.41380e06dfcadc04f777b9330921409b.jpeg

Попытался это на verilog записать, но что-то не фурычит оно.

Гляньте плиз где я накосячил?

function [15:0] CRC16;

  input  [15:0] d, crc;
  reg    [16:1] f;
  reg	 [15:0] c;

  begin
	f[1]  = d[0]  ^ crc[15];
	f[2]  = d[1]  ^ crc[14];
	f[3]  = d[2]  ^ crc[13];
	f[4]  = d[3]  ^ crc[12];
	f[5]  = d[4]  ^ crc[11] ^ f[1];
	f[6]  = d[5]  ^ crc[10] ^ f[2];
	f[7]  = d[6]  ^ crc[9]  ^ f[3];
	f[8]  = d[7]  ^ crc[8]  ^ f[4];
	f[9]  = d[8]  ^ crc[7]  ^ f[5];
	f[10] = d[9]  ^ crc[6]  ^ f[6];
	f[11] = d[10] ^ crc[5]  ^ f[7];
	f[12] = d[11] ^ crc[4]  ^ f[1] ^ f[8];
	f[13] = d[12] ^ crc[3]  ^ f[2] ^ f[9];
	f[14] = d[13] ^ crc[2]  ^ f[3] ^ f[10];
	f[15] = d[14] ^ crc[1]  ^ f[4] ^ f[11];
	f[16] = d[15] ^ crc[0]  ^ f[5] ^ f[12];
	 
	c[0]  = f[16];	
	c[1]  = f[15];
	c[2]  = f[14];
	c[3]  = f[13];
	c[4]  = f[12];
	c[5]  = f[11] ^ f[16];
	c[6]  = f[10] ^ f[15];
	c[7]  = f[9]  ^ f[14];
	c[8]  = f[8]  ^ f[13];
	c[9]  = f[7]  ^ f[12];
	c[10] = f[6]  ^ f[11];
	c[11] = f[5]  ^ f[10];
	c[12] = f[4]  ^ f[9]  ^ f[16];
	c[13] = f[3]  ^ f[8]  ^ f[15];
	c[14] = f[2]  ^ f[7]  ^ f[14];
	c[15] = f[1]  ^ f[6]  ^ f[13];
	
	CRC16 = c;
  end
endfunction

 

Share this post


Link to post
Share on other sites
45 minutes ago, andrew_b said:

Про регистр забыл?

ТС только код тела функции привел,  коде должно быть как-то так always_ff @(posedge clk) crc <= CRC16(data, crc). Поэтому регистр там есть.

Share this post


Link to post
Share on other sites
4 hours ago, des00 said:

подробности нефурычения будут?

Подробность одна - внешнее устройство ( СF карта) после транзакции считает что CRC не верная и устанавливает бит ошибки.

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

Мне сейчас хотя бы быть уверенным что сам подсчёт CRC сделал верно.

Поскольку приходится решать уравнение со всеми неизвестными. :biggrin:

Share this post


Link to post
Share on other sites

Посимулировать наверное надо и свериться с онлайн калькуляторами crc16.

Может там какой порядок байт важен. Обратный/прямой

Edited by new123

Share this post


Link to post
Share on other sites
3 minutes ago, zombi said:

Мне сейчас хотя бы быть уверенным что сам подсчёт CRC сделал верно.

Поскольку приходится решать уравнение со всеми неизвестными. :biggrin:

ну вы сами на себе проверьте CRC. Заодно глянули бы процедуру сравнения, может быть у вас разная инициализация а проверка должна быть не на ноль, а на magic word. Так то по коду забито то правильно, но может не работать.

Share this post


Link to post
Share on other sites
5 hours ago, new123 said:

В инете есть целый ряд готовых генераторов кода crc.

Да, я знаю о таких.

Даже однажды в проекте использовал, но помню долго выяснял необходимость инверсии шины вх и вых данных и тд. и тп.

А тут решил избежать всех этих танцев с бубном и реализовать именно так как в DS рекомендуют.

5 minutes ago, new123 said:

Может там какой порядок байт важен. Обратный/прямой

Все что есть это информация на моём скриношоте из DS. Ни о каком порядке байт там речи не идёт. Есть шина 16 бит и у нее есть мл. и ст.

8 minutes ago, des00 said:

Так то по коду забито то правильно

Вот, спасибо. Мне пока хотя бы в чем-то быть уверенным.

Share this post


Link to post
Share on other sites
18 minutes ago, des00 said:

может быть у вас разная инициализация а проверка должна быть не на ноль, а на magic word.

Из DS :

The CRC function in the host and the device shall be initialized with a seed of 4ABAh at the
beginning of an Ultra DMA burst before any data is transferred.

Так и инициализирую if (INIT) CRC <= 16'H4ABA;

А в RTL наблюдаю на входе мультиплексора перед регистром CRC 16'h5D52 :biggrin:

Вот и думаю почему перевёрнуто? Надо мне переворачивать или нет?

 

-----------------

По поводу magic word. Вот что в DS:

The device shall then compare the CRC data from the host with the calculated value in its
own CRC calculation function. If the two values do not match, the device shall save the error
and report it at the end of the command.

 

Вроде как нужно просто полное совпадение.

28 minutes ago, new123 said:

Посимулировать наверное надо и свериться с онлайн калькуляторами crc16.

Конечно просимулировал.

Получил при начальной инициализации 0x4ABA и следующих данных 0x0000 :

0xFA66 / 0xEE9A / 0x0FBE / 0x48DB

Посоветуйте онлайн калькулятор где это можно проверить

Share this post


Link to post
Share on other sites
17 minutes ago, zombi said:

Посоветуйте онлайн калькулятор где это можно проверить

сейчас перебиру свое избранное гляну. У вас специфичное задание, UDMA crc с не самой частым значением инициализации.

Share this post


Link to post
Share on other sites
36 minutes ago, zombi said:

Получил при начальной инициализации 0x4ABA и следующих данных 0x0000 :

0xFA66 / 0xEE9A / 0x0FBE / 0x48DB

Пусть поправят меня лучше, но вроде я все правильно вбил в поля.

http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

image.thumb.png.f222148095b0954168d828e6d6785bd6.png

Share this post


Link to post
Share on other sites
9 minutes ago, zombi said:

Получается что ошибка всё таки в моей функции?

может я не так вбил. Тот же полином, но вроде он.
И потом, быть может дело не в функции, а вокруг нее

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this