|
Разбираюсь с FIFO из Coregen, как его сделать little endian?, Может кто-то уже делал подобное? |
|
|
|
Jun 15 2007, 12:17
|
Местный
  
Группа: Свой
Сообщений: 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-а) и поправить там последовательность выдачи байтов на обратную. Но посмотрел, там такая каша этих исходняков... Может кто-то уже это делал? Или есть другие идеи?
|
|
|
|
|
Jun 15 2007, 12:30
|
Участник

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

|
вообще стандартным для всех сетевых протоколов (по крайней мере в стеке tcp/ip и канальном ethernet) принята передача данных с так называемым сетевым порядком байт (по сути big-endian) подробнее на википедиитак что логичнее все-таки на уровне софта менять порядок байт в заголовках. в posix есть вызовы htons/ntohs, htonl/ntohl для таких вещей.
|
|
|
|
|
Jun 15 2007, 12:53
|
Участник

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

|
Ну еще такой вопрос, вы собираетесь по эзернет передавать свои raw-пакеты и какого рода данные? Потому что например для передачи четырехбайтового необходимо все байты поменять местами, для двух подряд идущих 2хбайтовых целых - необходимо только свопнуть соседние байты, если передается просто "data" =) ну например текстовые данные в этом случае перестановка байт и вовсе не нужна. т.е. в случае смешанного характера передаваемых данных реализация перестановки байт в железе не будет подходящим вариантом
|
|
|
|
|
Jun 17 2007, 16:34
|
Местный
  
Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777

|
Проверял итоговый проект - он перестал нормально работать. В части МАКа и в части чтения датчика температуры по SPI интерфейсу. Может ещё что-то не работало, да я не доглядел. Доступ в ОЗУ 256х32, что внутри матрицы, например, остался работающим. Поскольку шина от процессора работает на 100 МГц-ах, т.е. быстро, то вставлять на этом пути (до ФИФО) перестановку байтов, нехорошо. Вот я и склоняюсь к тому, чтобы эту перестановку сделать на выходе ФИФО, где будет как раз место для этого.
Я вообще не пойму, с какого перепоя товарищи решили, что именно так должны "выходить" байты. Не всем же так подойдёт. Посмотрел мануал на ФИФО, там действительно всё так и написано, даже картинки приведены чтоб понятнее было. Но почему сделано именно так, не написано. Почему нельзя было сделать это опциональным параметром? А как с этим в 9-й версии ISE никто не знает?
|
|
|
|
|
Jun 18 2007, 10:47
|
Местный
  
Группа: Свой
Сообщений: 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 и всё.
|
|
|
|
|
Jun 18 2007, 17:24
|
Местный
  
Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777

|
Ну как чем?! Вы же тут на форуме бываете, а такие вопросы задаёте. Где-то должен лежать x l d e c o m p (к с а л и н к с д е к о м п р е с с о р). Не найдёте - могу заслать.
Меня другое опечалило - там столько файлов завязано, причём ещё из трёх мест дополнительно. Я почти со всеми разобрался, а вот с ядрышком двухпортовой памяти проблемы - кое-чего нет. Сейчас названия точно не помню, завтра с работы напишу. Пока не удалось нужные файлы найти, вернее они есть, причём в незашифрованном виде, но они в поддиректории simulation, а посему я не уверен, что они подойдут. Да я ещё и в VHDL не силён, потому доптрудности имеются. Я то всё в верилоге делаю. Засношала VHDL - ская пристыковка библиотечных фалов, создай библиотеку, да туда перенеси и т.д. А тут такая куча файлов. В общем начал с топового файла и пол дня сидел с формированием проекта. Да ещё ИСЕ ругался на отсутствие какого-то куска в библиотеке IEEE (что-то там в названии начиналось с Vital...). Где это искать пока не понимаю. Особо ещё не разбирался, пошёл домой.
|
|
|
|
|
Jun 19 2007, 06:07
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 19 2007, 08:20
|
Местный
  
Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777

|
Начал рассматривать другой вариант выхода из положения. Хочу просто подменить один файл в директории coregen-а на подправленный как мне надо и перегенерить ядро ФИФО. Т.е. я расшифровываю файл, правлю его, зашифровываю и кладу на место прежнего. Первые две операции получились, а вот зашифровать никак. Создал тему по этому вопросу тут. Надеюсь, кто-нибудь поможет.
|
|
|
|
|
Jun 19 2007, 12:05
|
Местный
  
Группа: Свой
Сообщений: 265
Регистрация: 15-03-05
Из: Москва
Пользователь №: 3 367

|
Изначально, столкнувшись с проблемой последовательности следования байтов, Вы стали решать ее совершенно правильно. А теперь зачем-то полезли в "дебри". Зачем??? Нужно попытаться разобраться в причинах того, почему проект "разрушился". Возможно, ошибка кроется в средстве синтеза, которым синтезируется проект. Поробуйте использовать другой синтезатор. Убедитесь, что проект собирается правильно, что используются нужные версии файлов и т. п. Вообщем, ищите причину, а не занимайтесь расшифровкой и т. п.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|