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

 
 
 
Reply to this topicStart new topic
> Не могу победит CRC32
Грендайзер
сообщение Apr 2 2017, 16:00
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 18-04-11
Пользователь №: 64 451



Здравствуйте. Вот взялся тут расхлёбывать очередной раз ethernet. Вроде как всё более менее ясно но вот уткнулся в CRC. Никак не могу её корректно посчитать. Имеется код подсчёта CRC на VHDL и собственно сам пакет. Пихаю всё это дело в тестбенч, но тот выдаёт значение отличное от того, которое собственно присутствует в самом пакете. Код подсчёта CRC вроде верный, пакет вынул из CHIP SCOP 'а... так что в чём дело никак не допетрю. Может кто нибудь сможет разъяснить в чём дело или угостит проверенным кодом. Был бы очень признателен. В архиве код расчёта CRC32, сам пакет представленный ниблами в txt формате и тестбенч.
Прикрепленные файлы
Прикрепленный файл  VHDL.rar ( 2.89 килобайт ) Кол-во скачиваний: 15
 
Go to the top of the page
 
+Quote Post
Leka
сообщение Apr 2 2017, 20:25
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 943
Регистрация: 30-09-05
Пользователь №: 9 118



Мой код на Верилоге, использовался в 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
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Apr 3 2017, 07:41
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 18-04-11
Пользователь №: 64 451



Извините, а у Вас для этого модуля теста нет?
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Apr 3 2017, 08:02
Сообщение #4


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 367
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Ещё в зависимости от функции подсчёта CRC может понадобиться поменять нибблы местами.
Код
crc <= nextCRC32((tDataOut_Eth(3 DOWNTO 0)&tDataOut_Eth(7 DOWNTO 4)),crc);
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Apr 3 2017, 08:07
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 18-04-11
Пользователь №: 64 451



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

Пффф... честно говоря голова пухнет. Промоделировал код, который дал Leka, так его результаты отличаются от тех, что даёт код, который был у меня. Но при том ни тот ни другой не даёт значения находящего ся в пакете...
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Apr 3 2017, 08:11
Сообщение #6


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 367
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Цитата(Грендайзер @ Apr 3 2017, 11:07) *
Пффф... честно говоря голова пухнет. Промоделировал код, который дал Leka, так его результаты отличаются от тех, что даёт код, который был у меня. Но при том ни тот ни другой не даёт значения находящего ся в пакете...

По ссылке генератор кода HDL для подсчёта CRC - проверено,мин нет.
CRC
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Apr 3 2017, 08:13
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 18-04-11
Пользователь №: 64 451



Да, видел это сайтик, но не пользовался. Простите, а у Вас нет тесбенча какого нибудь. Просто у меня такое чувство, что дело не в коде, а я что то не так делаю.
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Apr 3 2017, 08:18
Сообщение #8


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 367
Регистрация: 15-07-06
Из: г.Донецк
Пользователь №: 18 832



Цитата(Грендайзер @ Apr 3 2017, 11:13) *
Да, видел это сайтик, но не пользовался. Простите, а у Вас нет тесбенча какого нибудь. Просто у меня такое чувство, что дело не в коде, а я что то не так делаю.

Увы,нет. А ещё я реверсирую и инвертирую биты перед вставкой посчитанного 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;
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Apr 3 2017, 08:25
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 18-04-11
Пользователь №: 64 451



Ясно, спасибо! Буду пробовать.
Go to the top of the page
 
+Quote Post
Leka
сообщение Apr 3 2017, 08:54
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 943
Регистрация: 30-09-05
Пользователь №: 9 118



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

Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Apr 3 2017, 08:56
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 18-04-11
Пользователь №: 64 451



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

Спасибо! Возможно теперь будет проще!
Go to the top of the page
 
+Quote Post
likeasm
сообщение Apr 3 2017, 09:21
Сообщение #12


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

Группа: Участник
Сообщений: 143
Регистрация: 15-04-10
Пользователь №: 56 673



Вот это https://www.xilinx.com/support/documentatio...tes/xapp209.pdf не смотрели?
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Apr 3 2017, 09:43
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 18-04-11
Пользователь №: 64 451



Нет, не смотрел. Но это может многое объяснить, спасибо!
Go to the top of the page
 
+Quote Post
Грендайзер
сообщение Apr 4 2017, 19:15
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 18-04-11
Пользователь №: 64 451



Коллеги, спасибо ещё раз! Всё сошлось biggrin.gif Как я и говорил, дело в кривых руках. Внимательно посмотрев на тест Leka, увидел, что первым байтом у меня в тесте вдвигался не байт пакета, а x"00". Как всегда, самая "времязатратная" ошибка - самая тупая.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th July 2017 - 06:39
Рейтинг@Mail.ru


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