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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Разбираюсь с FIFO из Coregen, как его сделать little endian?, Может кто-то уже делал подобное?
Dimonira
сообщение Jun 15 2007, 12:17
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Пишу софт для Ethernet обмена для своей платы с ядром 1Г-МАК от ксайлинкса (см. тут). Проект матрицы сделан на ISE 8.2.
В матрице на приём у меня стоит два ФИФО байтовой ширины по записи и по чтению, а на передачу стоит 4-байтовое на входе (по записи с процессора), а на выходе байтовое (в ядро 1Г-МАК). Все ФИФО с разным тактом по чтению и записи, сгенерированы coregen-ом.
С приёмом всё пучком, а с передачей выяснилось, что ФИФО передаёт в МАК первым байтом старший байт 32-битного слова. Т.е. по факту можно сказать big-endian.
А мне надо бы little-endian, т.к. процессор тоже little-endian (Tiger Shark 201).
Казалось бы ерунда, чего там, взял в проекте матрицы переконнектил байты с шины процессора на вход передающего ФИФО. Однако не так всё просто - после компилляции проект "поплыл", перестал работать не только в части МАКа, но и ещё кое-что накрылось. И это несмотря на то, что согласно репорту par-а всё вроде бы Ок. Странно только, то что в новом проекте используемых слайсов оказалось на 10 меньше чем в старом проекте (1989 против 1999).
Изменения были всего в одной строчке:
Код
// было:
wire [31:0] tx_fifo_data_in = data_fr_dsp;
// стало:
wire [31:0] tx_fifo_data_in = {data_fr_dsp[7:0], data_fr_dsp[15:8], data_fr_dsp[23:16], data_fr_dsp[31:24]};


Вот теперь не знаю как быть. Ну не в софте же переставлять байты, это ж такой гимор и убивание времени, а оно важно.
Начинаю склоняться к тому, чтобы взять исходняки ФИФО, засунуть их в проект (вместо coregen-а) и поправить там последовательность выдачи байтов на обратную. Но посмотрел, там такая каша этих исходняков...

Может кто-то уже это делал?
Или есть другие идеи?
Go to the top of the page
 
+Quote Post
reddot
сообщение Jun 15 2007, 12:30
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 7-06-06
Из: Зеленоград
Пользователь №: 17 843



вообще стандартным для всех сетевых протоколов (по крайней мере в стеке tcp/ip и канальном ethernet) принята передача данных с так называемым сетевым порядком байт (по сути big-endian)
подробнее на википедии
так что логичнее все-таки на уровне софта менять порядок байт в заголовках. в posix есть вызовы htons/ntohs, htonl/ntohl для таких вещей.
Go to the top of the page
 
+Quote Post
Dimonira
сообщение Jun 15 2007, 12:41
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Зачем же мне время терять на софтовых перестановках?
Да и ФИФО само по себе никакого отношения к сетевым протоколам не имеет.
А у самого ядра МАКа вообще байтовый интерфейс, ему по барабану. Первый байт пришёл, первым и ушёл.
Так что никакой логики мучаться перестановками я тут не вижу.
Go to the top of the page
 
+Quote Post
reddot
сообщение Jun 15 2007, 12:53
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 7-06-06
Из: Зеленоград
Пользователь №: 17 843



Ну еще такой вопрос, вы собираетесь по эзернет передавать свои raw-пакеты и какого рода данные? Потому что например для передачи четырехбайтового необходимо все байты поменять местами, для двух подряд идущих 2хбайтовых целых - необходимо только свопнуть соседние байты, если передается просто "data" =) ну например текстовые данные в этом случае перестановка байт и вовсе не нужна. т.е. в случае смешанного характера передаваемых данных реализация перестановки байт в железе не будет подходящим вариантом
Go to the top of the page
 
+Quote Post
Dimonira
сообщение Jun 15 2007, 15:21
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Перестановка байт мне нужна только потому, что я пишу в передающее ФИФО словами по 32 бита. Мне это нужно для скорости. У меня передаваться будет поток (32-битными словами) около 90 МБ/с. А приниматься будет минимум. Поэтому я на приём поставил ФИФО шириной в байт (вернее потому, что принимаемый пакет может быть длинной не кратной 4 байтам, а ФИФО не даёт читать слово, если не все байты в нём записаны с другого конца).
А на передачу я буду формировать пакеты кратные 4 байтам принудительно.
Go to the top of the page
 
+Quote Post
Evil Archer
сообщение Jun 16 2007, 23:04
Сообщение #6


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

Группа: Свой
Сообщений: 78
Регистрация: 1-12-05
Пользователь №: 11 662



Я извиняюсь, но я так и не понял из ваших постов, перестановка байт вообще возымела эффект?) В смысле, вы проверяли что получилось после синтеза именно в этом месте? Или не работает даже в исходниках?

Сообщение отредактировал Evil Archer - Jun 16 2007, 23:13
Go to the top of the page
 
+Quote Post
Dimonira
сообщение Jun 17 2007, 16:34
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Проверял итоговый проект - он перестал нормально работать.
В части МАКа и в части чтения датчика температуры по SPI интерфейсу. Может ещё что-то не работало, да я не доглядел. Доступ в ОЗУ 256х32, что внутри матрицы, например, остался работающим.
Поскольку шина от процессора работает на 100 МГц-ах, т.е. быстро, то вставлять на этом пути (до ФИФО) перестановку байтов, нехорошо. Вот я и склоняюсь к тому, чтобы эту перестановку сделать на выходе ФИФО, где будет как раз место для этого.

Я вообще не пойму, с какого перепоя товарищи решили, что именно так должны "выходить" байты. Не всем же так подойдёт. Посмотрел мануал на ФИФО, там действительно всё так и написано, даже картинки приведены чтоб понятнее было. Но почему сделано именно так, не написано. Почему нельзя было сделать это опциональным параметром?
А как с этим в 9-й версии ISE никто не знает?
Go to the top of the page
 
+Quote Post
Evil Archer
сообщение Jun 17 2007, 16:56
Сообщение #8


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

Группа: Свой
Сообщений: 78
Регистрация: 1-12-05
Пользователь №: 11 662



Если не очень критично, попробуйте вставить регистр между шиной процессора и ФИФО и на нем перекоммутировать провода. То что проект у вас получился несколько меньше при том, что вы ничего кроме порядка подключения байт не меняли, наводит на мысль, что при синтезе что-то нужное убилось. ) В любом случае очень хорошо бы посмотреть в симуляторе именно это место. Или найти его в RTL-view после синтеза и убедиться, что всё подключено верно. Но это конечно при условии, что вы уверены в том, что проблема именно из-за неверной коммутации, а не дальше по устройству.
Go to the top of the page
 
+Quote Post
Dimonira
сообщение Jun 18 2007, 06:04
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Конечно критично, ведь регистр - это задержка на такт, а значит все управляющие сигналы надо тоже задерживать. Что из этого получится не знаю. Может и попробую.
Go to the top of the page
 
+Quote Post
Dimonira
сообщение Jun 18 2007, 10:47
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Порылся в исходняках. Нашёл нужное место в файле as\output_block_as.vhd (мой случай - асинхронное ФИФО):

Код
-------------------------------------------------------------------------------
-- DOUT, FULL, EMPTY, ALMOST_FULL, ALMOST_EMPTY, PROG_FULL, PROG_EMPTY Outputs
-------------------------------------------------------------------------------
  bkwdout : if C_DOUT_DIRECTION = 0 or C_RATIO_W = 1 generate
    DOUT <= DOUT_I;
    -----------------------------------------------------------------------------
    -- Example:
    --DOUT(7 DOWNTO 0) <= DOUT_I(7 DOWNTO 0);
    --DOUT(15 DOWNTO 8) <= DOUT_I(15 DOWNTO 8);
    --DOUT(23 DOWNTO 16) <= DOUT_I(23 DOWNTO 16);
    --DOUT(31 DOWNTO 24) <= DOUT_I(31 DOWNTO 24);
    -----------------------------------------------------------------------------
  end generate;

  fwddout   : if C_DOUT_DIRECTION = 1 and C_RATIO_W > 1 generate
    gendout : for i in 1 to C_RATIO_W generate
      DOUT(C_DIN_WIDTH*i-1 downto C_DIN_WIDTH*(i-1))
<= DOUT_I(C_DIN_WIDTH*(C_RATIO_W-i+1)-1 downto C_DIN_WIDTH*(C_RATIO_W-i));
      ---------------------------------------------------------------------------
      --1) DOUT(7 DOWNTO 0) <= DOUT_I(31 DOWNTO 24);
      --2) DOUT(15 DOWNTO 8) <= DOUT_I(23 DOWNTO 16);
      --3) DOUT(23 DOWNTO 16) <= DOUT_I(15 DOWNTO 8);
      --4) DOUT(31 DOWNTO 24) <= DOUT_I(7 DOWNTO 0);
      ---------------------------------------------------------------------------
    end generate;
  end generate;

Константа C_DOUT_DIRECTION задана равной 1. Блин, ведь заложена возможность менять порядок байтов! Но не выведена наверх! Константа C_DOUT_DIRECTION присваивается только в этом файле. А константа C_RATIO_W равна отношению ширины данных по записи к ширине по чтению, если оно больше единицы и равна 1 если меньше. В моём случае для передающего ФИФО получается C_RATIO_W = 4.
Тут-то байты и перевёртываются.
Буду пробовать менять - надо поставить C_DOUT_DIRECTION = 0 и всё.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jun 18 2007, 12:27
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Dimonira @ Jun 18 2007, 13:47) *
Порылся в исходняках. Нашёл нужное место в файле as\output_block_as.vhd
Чем рылись? В смысле, как получить нормальные VHDL-исходники из тех vhd-файлов, что лежат в coregen'е?
Go to the top of the page
 
+Quote Post
Dimonira
сообщение Jun 18 2007, 17:24
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Ну как чем?! Вы же тут на форуме бываете, а такие вопросы задаёте.
Где-то должен лежать x l d e c o m p (к с а л и н к с д е к о м п р е с с о р).
Не найдёте - могу заслать.

Меня другое опечалило - там столько файлов завязано, причём ещё из трёх мест дополнительно. Я почти со всеми разобрался, а вот с ядрышком двухпортовой памяти проблемы - кое-чего нет. Сейчас названия точно не помню, завтра с работы напишу. Пока не удалось нужные файлы найти, вернее они есть, причём в незашифрованном виде, но они в поддиректории simulation, а посему я не уверен, что они подойдут. Да я ещё и в VHDL не силён, потому доптрудности имеются. Я то всё в верилоге делаю. Засношала VHDL - ская пристыковка библиотечных фалов, создай библиотеку, да туда перенеси и т.д. А тут такая куча файлов. В общем начал с топового файла и пол дня сидел с формированием проекта. Да ещё ИСЕ ругался на отсутствие какого-то куска в библиотеке IEEE (что-то там в названии начиналось с Vital...). Где это искать пока не понимаю. Особо ещё не разбирался, пошёл домой.
Go to the top of the page
 
+Quote Post
Dimonira
сообщение Jun 19 2007, 06:07
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Пока не удалось собрать все исходняки и скомпиллить проект с только одним ФИФО.
Ну не спец я с этим VHDL. Поэтому прошу знатоков VHDL разобраться.
Для этого я выкладываю проект тут. Пароль архива - имя этого сайта по-русски (без точки ру и типа протокола в начале, т.е. одно слово).
Проблема возникает с элементом b l k m e m d p, в котором часть файлов (все кроме одного) исходняков вроде как для симуляции и в них компиллер ругается на строчку USE IEEE.V I T A L _ T i m i n g . A L L;, говоря, что такого в библиотеке IEEE нету. В тоже время как я понял, V I T A L _ T i m i n g вроде нужен только для симуляции. Непонятно тогда где брать нормальные исходняки.
В директории \X i l i n x\I S E\c o r e g e n\i p\x i l i n x\p r i m a r y\c o m\x i l i n x\i p\b l k m e m d p_ v6 _2\, где лежит эта байда, только зашифрованный файл b l k m e m d p_v 6_2 _x s t_c o m p . v h d, остальные в поддиректории s i m u l a t i o n (незашифрованные). Причём все они же в незашифрованном виде лежат в директории \X i l i n x\I S E\v h d l\s r c\X i l i n x C o r e L i b\.
Возможно, что нужное лежит в файлах с расширением class, но я не знаю чем их открыть. Может кто знает? Вроде это java, но я в ней не спец.

Пояснения по прилагаемому проекту.
Все исходняки лежат в поддиректории проекта FIFO. Дополнительно к исходнякам самого ФИФО я туда положил то, что ещё нужно дополнительно:

\b l k _ m e m _ g e n
\b l k m e m d p
\i p u t i l s
\u l

Причём некоторые файлы (которые PKG) при включении в проект почему-то попадали в закладку исходняков. Поэтому я их удалял из проекта (например, i p u t i l s _ s l v . v h d).
За топовый файл проекта я пока взял файл из директория AS\ (это асинхронное ФИФО): f i f o _ g e n e r a t o r _ v 3 _ 2 _ a s . v h d. А вообще там пять вариантов ФИФО, которые расположены в поддиректориях:

\a s
\f i f o 1 6 _ p a t c h
\f i f o _ 1 8 _ 3 6
\s s
\s s h f t

В поддиректории g o l d e n\ лежат совместно используемые файлы.
Ну, и файлы в директории s i m u l a t i o n\ я добавил на всякий случай.
Прикрепленные файлы
Прикрепленный файл  ____.rar ( 1.22 мегабайт ) Кол-во скачиваний: 63
 
Go to the top of the page
 
+Quote Post
Dimonira
сообщение Jun 19 2007, 08:20
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Начал рассматривать другой вариант выхода из положения.
Хочу просто подменить один файл в директории coregen-а на подправленный как мне надо и перегенерить ядро ФИФО.
Т.е. я расшифровываю файл, правлю его, зашифровываю и кладу на место прежнего.
Первые две операции получились, а вот зашифровать никак.
Создал тему по этому вопросу тут.
Надеюсь, кто-нибудь поможет.
Go to the top of the page
 
+Quote Post
oval
сообщение Jun 19 2007, 12:05
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 265
Регистрация: 15-03-05
Из: Москва
Пользователь №: 3 367



Изначально, столкнувшись с проблемой последовательности следования байтов, Вы стали решать ее совершенно правильно. А теперь зачем-то полезли в "дебри". Зачем??? Нужно попытаться разобраться в причинах того, почему проект "разрушился". Возможно, ошибка кроется в средстве синтеза, которым синтезируется проект. Поробуйте использовать другой синтезатор. Убедитесь, что проект собирается правильно, что используются нужные версии файлов и т. п. Вообщем, ищите причину, а не занимайтесь расшифровкой и т. п.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 9th July 2025 - 02:32
Рейтинг@Mail.ru


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