Перейти к содержанию
    

Не могу победит CRC32

Здравствуйте. Вот взялся тут расхлёбывать очередной раз ethernet. Вроде как всё более менее ясно но вот уткнулся в CRC. Никак не могу её корректно посчитать. Имеется код подсчёта CRC на VHDL и собственно сам пакет. Пихаю всё это дело в тестбенч, но тот выдаёт значение отличное от того, которое собственно присутствует в самом пакете. Код подсчёта CRC вроде верный, пакет вынул из CHIP SCOP 'а... так что в чём дело никак не допетрю. Может кто нибудь сможет разъяснить в чём дело или угостит проверенным кодом. Был бы очень признателен. В архиве код расчёта CRC32, сам пакет представленный ниблами в txt формате и тестбенч.

VHDL.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мой код на Верилоге, использовался в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, а у Вас для этого модуля теста нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё в зависимости от функции подсчёта CRC может понадобиться поменять нибблы местами.

crc <= nextCRC32((tDataOut_Eth(3 DOWNTO 0)&tDataOut_Eth(7 DOWNTO 4)),crc);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё в зависимости от функции подсчёта CRC может понадобиться поменять нибблы местами

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

По ссылке генератор кода HDL для подсчёта CRC - проверено,мин нет.

CRC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, видел это сайтик, но не пользовался. Простите, а у Вас нет тесбенча какого нибудь. Просто у меня такое чувство, что дело не в коде, а я что то не так делаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, видел это сайтик, но не пользовался. Простите, а у Вас нет тесбенча какого нибудь. Просто у меня такое чувство, что дело не в коде, а я что то не так делаю.

Увы,нет. А ещё я реверсирую и инвертирую биты перед вставкой посчитанного 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тестбенч для 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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тестбенч для Icarus Verilog...

Спасибо! Возможно теперь будет проще!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, не смотрел. Но это может многое объяснить, спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коллеги, спасибо ещё раз! Всё сошлось :biggrin: Как я и говорил, дело в кривых руках. Внимательно посмотрев на тест Leka, увидел, что первым байтом у меня в тесте вдвигался не байт пакета, а x"00". Как всегда, самая "времязатратная" ошибка - самая тупая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...