Грендайзер 0 2 апреля, 2017 Опубликовано 2 апреля, 2017 · Жалоба Здравствуйте. Вот взялся тут расхлёбывать очередной раз ethernet. Вроде как всё более менее ясно но вот уткнулся в CRC. Никак не могу её корректно посчитать. Имеется код подсчёта CRC на VHDL и собственно сам пакет. Пихаю всё это дело в тестбенч, но тот выдаёт значение отличное от того, которое собственно присутствует в самом пакете. Код подсчёта CRC вроде верный, пакет вынул из CHIP SCOP 'а... так что в чём дело никак не допетрю. Может кто нибудь сможет разъяснить в чём дело или угостит проверенным кодом. Был бы очень признателен. В архиве код расчёта CRC32, сам пакет представленный ниблами в txt формате и тестбенч. VHDL.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 2 апреля, 2017 Опубликовано 2 апреля, 2017 · Жалоба Мой код на Верилоге, использовался в 100base-tx: module crc32(clk,en,d,q); localparam N=8, P=32'hEDB88320; input clk,en; input [N-1:0] d; output [31:0] q; integer i; reg [31:0] c; always@(posedge clk)begin if(en) for(i=0;i<N;i=i+1) c=(c^d[i])&1?(c>>1)^P:c>>1; else c=~0; end assign q=~c; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Извините, а у Вас для этого модуля теста нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Ещё в зависимости от функции подсчёта CRC может понадобиться поменять нибблы местами. crc <= nextCRC32((tDataOut_Eth(3 DOWNTO 0)&tDataOut_Eth(7 DOWNTO 4)),crc); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Ещё в зависимости от функции подсчёта CRC может понадобиться поменять нибблы местами Пффф... честно говоря голова пухнет. Промоделировал код, который дал Leka, так его результаты отличаются от тех, что даёт код, который был у меня. Но при том ни тот ни другой не даёт значения находящего ся в пакете... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Пффф... честно говоря голова пухнет. Промоделировал код, который дал Leka, так его результаты отличаются от тех, что даёт код, который был у меня. Но при том ни тот ни другой не даёт значения находящего ся в пакете... По ссылке генератор кода HDL для подсчёта CRC - проверено,мин нет. CRC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Да, видел это сайтик, но не пользовался. Простите, а у Вас нет тесбенча какого нибудь. Просто у меня такое чувство, что дело не в коде, а я что то не так делаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Да, видел это сайтик, но не пользовался. Простите, а у Вас нет тесбенча какого нибудь. Просто у меня такое чувство, что дело не в коде, а я что то не так делаю. Увы,нет. А ещё я реверсирую и инвертирую биты перед вставкой посчитанного CRC в пакет. when (PackPauseLength-3) => DataOut_Eth <= not(revers(crc(31 downto 24)));ValidOut_Eth <= tValidOut_Eth; when (PackPauseLength-2) => DataOut_Eth <= not(revers(crc(23 downto 16)));ValidOut_Eth <= tValidOut_Eth; when (PackPauseLength-1) => DataOut_Eth <= not(revers(crc(15 downto 8)));ValidOut_Eth <= tValidOut_Eth; when (PackPauseLength) => DataOut_Eth <= not(revers(crc(7 downto 0)));ValidOut_Eth <= tValidOut_Eth; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Ясно, спасибо! Буду пробовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Тестбенч для Icarus Verilog, стандартная проверочная строка"123456789": module tb(); reg clk=0; always #1 clk<=~clk; reg en; reg [7:0] d; wire [31:0] q; crc32 crc(clk,en,d,q); always begin @(posedge clk); d<="1"; en<=1; @(posedge clk); d<="2"; @(posedge clk); d<="3"; @(posedge clk); d<="4"; @(posedge clk); d<="5"; @(posedge clk); d<="6"; @(posedge clk); d<="7"; @(posedge clk); d<="8"; @(posedge clk); d<="9"; @(posedge clk); $strobe("crc32=%x",q); @(posedge clk); $finish; end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Тестбенч для Icarus Verilog... Спасибо! Возможно теперь будет проще! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
likeasm 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Вот это https://www.xilinx.com/support/documentatio...tes/xapp209.pdf не смотрели? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Нет, не смотрел. Но это может многое объяснить, спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 4 апреля, 2017 Опубликовано 4 апреля, 2017 · Жалоба Коллеги, спасибо ещё раз! Всё сошлось Как я и говорил, дело в кривых руках. Внимательно посмотрев на тест Leka, увидел, что первым байтом у меня в тесте вдвигался не байт пакета, а x"00". Как всегда, самая "времязатратная" ошибка - самая тупая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться