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

Выложите схемы обеих плат, без них нет никакого смысла гадать по ucf.

Вот схема конечного устройства, а на отладочной плате enclustra pe-1 + kx-1, не отследил линию сброса, только трансиверы

post-84837-1485315055_thumb.png

post-84837-1485315066_thumb.png

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


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

Что-то так и не пойму, если подключаем к sys_reset PERST, Нормальное состояние сигнала 1, а сброс по 0?

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


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

Что-то так и не пойму, если подключаем к sys_reset PERST, Нормальное состояние сигнала 1, а сброс по 0?

 

На слоте PERST# - активный 0.

Насчет выложенных картинок - это не схема, а какие-то обрывки. Вы снова предлагаете гадать по неполной информации.

Могу предположить, что:

INST "pcie_7x_v1_11_i/gt_top_i/pipe_wrapper_i/pipe_lane[0].gt_wrapper_i/gtx_channel.gtxe2_channel_i" LOC = GTXE2_CHANNEL_X0Y4;

Но не уверен, что это правильно. Схемы-то толком нет.

 

Обратитесь в саппорт изготовителя отладочной платы с вопросом: дайте ucf на PCI Express для вашей платы.

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


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

Судя по этому, правильно X0Y7

Заметил, что должна быть выставлена PRSNT в '1', может еще какие сигналы забыл, почему-то об этом нигде не увидел.

upd: хотя если выставляю '1', то ресет на 0 зависает

post-84837-1485752672_thumb.png

Изменено пользователем exigo

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


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

Если есть ощущение, что пинаут правильный (что не факт), возможно, что конфигурирование ПЛИС занимает слишком много времени и плата успевает отключить клок.

Об этой проблеме достаточно подробно написано в документации на ядро. Но скорее проблема в пинауте.

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


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

На плате таковую осциллографом увидел, копаю дальше

Изменено пользователем exigo

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


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

Устройство увиделось в системе.

И тактовую и трансиверы потребовалось напрямую задавать.

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


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

Здравствуйте, взялся за реализацию обмена по pcie. Плата с Kintex7. Пк Win7, смотрю память программой RW-Everything, ну и собственная есть для чтения из БАРов и памяти.

Подключил пример с ядром 7 Series FPGAs Integrated Block for PCI Express v1.7. Чтение и запись, работа с БАРами получилась, теперь стоит задача, чтобы железо писало по заданному адресу.

В корке по запросу чтения из БАРа реализована запись сл. образом:

s_axis_tx_tdata <= (
                                    rd_data &
                                    req_rid &
                                    req_tag &
                                    '0' &
                                    lower_addr &
                                    completer_id &
                                    "000" &
                                    '0' &
                                    byte_count &
                                    '0' &
                                    PIO_CPLD_FMT_TYPE & --"1001010"
                                    '0' &
                                    req_tc &
                                    "0000" &
                                    req_td &
                                    req_ep &
                                    req_attr &
                                    "00" &
                                    req_len
                                    ) after TCQ;

Начал городить запись в память по заданному адресу, решил попробовать написать в ту же область (в моем случае под БАР выделяется память с адреса 0xF610000), изменил пакет сл образом.

s_axis_tx_tdata <= (
                                    rd_data &
                                    X"F6100000" &
                                    req_rid &
                                    req_tag &
                                    req_lb & --здесь значение "1111" --не совсем понял назначение этих двух переменных, но в примерах дма такие значения.
                                    req_fb & -- здесь значение "1111"
                                    "01000000" & --запись в память
                                    '0' &
                                    req_tc &
                                    "0000" &
                                    req_td &
                                    req_ep &
                                    req_attr &
                                    "00" &
                                    req_len
                                    ) after TCQ;

После попытки чтения, комп подвисает немного, но данных нет, пробовал по другому адресу, тоже ничего.

Подскажите, пожалуйста, может служебные переменные "вырванные" из запроса на чтение БАР(шины m_axis_rx_tdata) не подходят в данном случае.

Хотелось бы пример команды с чистой записью из железки в ПК по заданному адресу, возможно однократная.

Изменено пользователем exigo

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


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

Хотелось бы пример команды с чистой записью из железки в ПК по заданному адресу, возможно однократная.

Сам ПК успешно считал из BAR через эту программу (rw everything), т.е. проходят запросы CplD?

Итак, попытка записать в ПК из железки - откуда берется адрес? И как он попадает в железку, хардкод что ли?

 

решил попробовать написать в ту же область

т.е. данные будут прилетать без запроса? Кто их там ждет? А кто сказал что адрес для устройства и адрес для ядра ОС один и тот же? Не знаю, возможно ли это, я так никогда не делал, может потому компьютер удивляется.

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


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

Сам ПК успешно считал из BAR через эту программу (rw everything), т.е. проходят запросы CplD?

Итак, попытка записать в ПК из железки - откуда берется адрес? И как он попадает в железку, хардкод что ли?

 

 

т.е. данные будут прилетать без запроса? Кто их там ждет? А кто сказал что адрес для устройства и адрес для ядра ОС один и тот же? Не знаю, возможно ли это, я так никогда не делал, может потому компьютер удивляется.

Да, исходный пример с ядром по записи-чтению в БАР, работает. Запросы проходят, вот я подумал изменить этот кусок, чтобы он писал не в БАР, а мной заданный адрес (для начала прям в коде железно адрес, пробовал разные, а потом через БАР буду задавать выделенную область). Поэтому вот хочу разобраться просто в команде записи по заданному адресу.

 

//update

Я похоже адрес неправильно ввожу, т.к. там в конце два бита зарезервированы, а адрес 30 разрядный

Изменено пользователем exigo

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


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

Я похоже адрес неправильно ввожу, т.к. там в конце два бита зарезервированы, а адрес 30 разрядный

Для Windows не подскажу, но по аналогии в Linux можно (в качестве самого базового способа) вызвать dma_alloc_coherent и выделить некоторый буфер, например 4096 байт. И получив два адреса, один отдается устройство в которое оно может писать в произвольный момент времени, а ядро ОС может читать что записало устройство по второму адресу.

Отсюда и вопрос - как Вы выделяете память, приведите пример. И какие меры приняты, чтобы оба адреса оставались постоянными, чтоб их можно было чуть ли не зашить в прошивку.

 

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

 

Я похоже адрес неправильно ввожу, т.к. там в конце два бита зарезервированы, а адрес 30 разрядный

Да, там есть такое дело, адрес должен быть с шагом 4 байта, если не ошибаюсь, и действительно 2 младших бита нулевые.

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


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

Для Windows не подскажу, но по аналогии в Linux можно (в качестве самого базового способа) вызвать dma_alloc_coherent и выделить некоторый буфер, например 4096 байт. И получив два адреса, один отдается устройство в которое оно может писать в произвольный момент времени, а ядро ОС может читать что записало устройство по второму адресу.

Отсюда и вопрос - как Вы выделяете память, приведите пример. И какие меры приняты, чтобы оба адреса оставались постоянными, чтоб их можно было чуть ли не зашить в прошивку.

 

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

 

Да, там есть такое дело, адрес должен быть с шагом 4 байта, если не ошибаюсь, и действительно 2 младших бита нулевые.

 

С выделением памяти есть своя программа, предполагал, пока не передаю выделенный адрес в плис, просто протестировать запись с произвольную ячейку, но видимо так нельзя? (заведомо брал побольше адрес, чтобы он неиспользовался и там нулевые значения были).

 

Изменено пользователем exigo

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


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

С выделением памяти есть своя программа, предполагал, пока не передаю выделенный адрес в плис, просто протестировать запись с произвольную ячейку, но видимо так нельзя? (заведомо брал побольше адрес, чтобы он неиспользовался и там нулевые значения были).

Вот не знаю, мне кажется (кажется!) так нельзя. У меня есть собственные догадки, почему так, не буду их афишировать, дабы не прогневать специалистов :)

Лучше полагаться на API операционной системы, и всё будет работать. Это не микроконтроллер, совсем произвольно так с адресами нельзя поступать, всё (адреса шин) должно штатным образом отображаться одно в другое.

 

А по поводу адреса в ПЛИС, при 32 битной адресации address[31:2], [1,0] - reserv. Получается адрес максимум 30 разрядный? 3FFFFFFF максимальный адрес, или адрес считывается вместе с младшими нулями? и нормально можно адресовать FFFFFFFF.

А как же 64-битная адресация у PCI-E? Тут http://xillybus.com/tutorials/pci-express-...utorial-guide-1 пишут, что такое редко когда надо.

В принципе, ясно, что ширина адреса это не катастрофа, всегда можно обойти окошечками.

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


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

Еще одна деталь, насчет "нормально адресовать" FFFFFFFF.

http://www.compbegin.ru/articles/view/_76

Как мы уже знаем, чисто теоретически 32-х разрядной системе без каких-либо дополнительных ухищрений доступны до 4 гигабайт оперативной памяти (232), но Windows не может использовать весь этот объем, так как часть его отводится под устройства компьютера.
Так что, я полагаю, что ширина ворот для адресации устройств составляет лишь 1 Гбайт. Не могу уверенно утверждать, там далеко я еще не забирался. Возможно для AMD64/x86_64 эта ситуация несколько иначе.

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


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

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

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

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

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

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

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

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

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

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