zombi 0 Posted April 6 · Report post Производитель требует и приводит пример расчёта 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). Попытался это на 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 Quote Ответить с цитированием Share this post Link to post Share on other sites
new123 0 Posted April 7 · Report post В инете есть целый ряд готовых генераторов кода crc. Вот например https://www.easics.com/crctool/ Ваш полином crc16 x25 Quote Ответить с цитированием Share this post Link to post Share on other sites
des00 0 Posted April 7 · Report post 4 hours ago, zombi said: Попытался это на verilog записать, но что-то не фурычит оно. подробности нефурычения будут? Quote Ответить с цитированием Share this post Link to post Share on other sites
andrew_b 0 Posted April 7 · Report post 6 часов назад, zombi сказал: Гляньте плиз где я накосячил? Про регистр забыл? Quote Ответить с цитированием Share this post Link to post Share on other sites
des00 0 Posted April 7 · Report post 45 minutes ago, andrew_b said: Про регистр забыл? ТС только код тела функции привел, коде должно быть как-то так always_ff @(posedge clk) crc <= CRC16(data, crc). Поэтому регистр там есть. Quote Ответить с цитированием Share this post Link to post Share on other sites
zombi 0 Posted April 7 · Report post Конечно регистр CRC и начальная установка его есть. Я просто хотел убедиться в правильности реализации самой функции. Quote Ответить с цитированием Share this post Link to post Share on other sites
zombi 0 Posted April 7 · Report post 4 hours ago, des00 said: подробности нефурычения будут? Подробность одна - внешнее устройство ( СF карта) после транзакции считает что CRC не верная и устанавливает бит ошибки. Я не уверен ни в том что данные верно читаю ни в том что CRC правильно передаю карте (хотя судя по диаграмме все должно быть правильно). Мне сейчас хотя бы быть уверенным что сам подсчёт CRC сделал верно. Поскольку приходится решать уравнение со всеми неизвестными. Quote Ответить с цитированием Share this post Link to post Share on other sites
new123 0 Posted April 7 (edited) · Report post Посимулировать наверное надо и свериться с онлайн калькуляторами crc16. Может там какой порядок байт важен. Обратный/прямой Edited April 7 by new123 Quote Ответить с цитированием Share this post Link to post Share on other sites
des00 0 Posted April 7 · Report post 3 minutes ago, zombi said: Мне сейчас хотя бы быть уверенным что сам подсчёт CRC сделал верно. Поскольку приходится решать уравнение со всеми неизвестными. ну вы сами на себе проверьте CRC. Заодно глянули бы процедуру сравнения, может быть у вас разная инициализация а проверка должна быть не на ноль, а на magic word. Так то по коду забито то правильно, но может не работать. Quote Ответить с цитированием Share this post Link to post Share on other sites
zombi 0 Posted April 7 · Report post 5 hours ago, new123 said: В инете есть целый ряд готовых генераторов кода crc. Да, я знаю о таких. Даже однажды в проекте использовал, но помню долго выяснял необходимость инверсии шины вх и вых данных и тд. и тп. А тут решил избежать всех этих танцев с бубном и реализовать именно так как в DS рекомендуют. 5 minutes ago, new123 said: Может там какой порядок байт важен. Обратный/прямой Все что есть это информация на моём скриношоте из DS. Ни о каком порядке байт там речи не идёт. Есть шина 16 бит и у нее есть мл. и ст. 8 minutes ago, des00 said: Так то по коду забито то правильно Вот, спасибо. Мне пока хотя бы в чем-то быть уверенным. Quote Ответить с цитированием Share this post Link to post Share on other sites
zombi 0 Posted April 7 · Report post 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 Вот и думаю почему перевёрнуто? Надо мне переворачивать или нет? ----------------- По поводу 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 Посоветуйте онлайн калькулятор где это можно проверить Quote Ответить с цитированием Share this post Link to post Share on other sites
new123 0 Posted April 7 · Report post 17 minutes ago, zombi said: Посоветуйте онлайн калькулятор где это можно проверить сейчас перебиру свое избранное гляну. У вас специфичное задание, UDMA crc с не самой частым значением инициализации. Quote Ответить с цитированием Share this post Link to post Share on other sites
new123 0 Posted April 7 · Report post 36 minutes ago, zombi said: Получил при начальной инициализации 0x4ABA и следующих данных 0x0000 : 0xFA66 / 0xEE9A / 0x0FBE / 0x48DB Пусть поправят меня лучше, но вроде я все правильно вбил в поля. http://www.sunshine2k.de/coding/javascript/crc/crc_js.html Quote Ответить с цитированием Share this post Link to post Share on other sites
zombi 0 Posted April 7 · Report post Получается что ошибка всё таки в моей функции? Quote Ответить с цитированием Share this post Link to post Share on other sites
new123 0 Posted April 7 · Report post 9 minutes ago, zombi said: Получается что ошибка всё таки в моей функции? может я не так вбил. Тот же полином, но вроде он. И потом, быть может дело не в функции, а вокруг нее Quote Ответить с цитированием Share this post Link to post Share on other sites