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

exigo

Участник
  • Публикаций

    43
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о exigo

  • Звание
    Участник

Посетители профиля

765 просмотров профиля
  1. ага, это понял. app_rdy часто в '0', КПД маловато, так и есть, или в настройках и режимах работы можно оптимизировать.
  2. Всем привет, снова вернулся к ДДР3, уперлись в скорость. Используем микросхемы MT41K64M16TW-107. Среда ISE, MIG 1.9 В настройках не позволяет изменить рабочую частоту (Clock Period) выше 400 Mhz. Не пойму от какого параметра пределы зависит и как поднять до максимальной частоты. И вообщем подскажите рекомендации, реализован колцьевой буфер, но память частенько скидывает app_rdy. и простаивается автомат. Как выжать максимум кпд?
  3. В чипскоп завел проект, tx_buf заканчиваются и встает автомат в ожидание, но самое, что все команды на запись, что идут в ПК, по адресам ноль. Вот не как не пойму на что может повлиять другой комп и материнка. RID какой выставляется? Самое интересное, что пробники pcie в VIVADO даже не дают зашить прошивку, на 99% комп колом встает, и только хард ресет спасает. А на старом ПК все шикарно работает. Попробав разные машины, вывод что безупречно работает в портах pcie 2gen, а в gen3 нет, но надо как-то это исправлять.
  4. В последних версиях еще отслеживаю кредиты (tx_buf) Но дело в том, что комп быстрее стал, и раньше когда не хватало кредитов он не зависал. И интересно, что xilinx примеры не запускаются.
  5. Всем привет, благополучно юзал pcie. Но тут мне обновили ПК и на новом железе все перестало работать. Мой проект успешно позволяет записать управляющие адреса и размер буфера в БАР, но после включения ДМА устройство отваливается и в БАР 0xffffffffff все, или и того виснет комп. Решил проверить на xilinx примерах дма стримера и дма передачи(от которых отталкивался и они работали на старом ПК), после загрузки в железо комп сразу зависает, даже драйвер не дает поставить. Подскажите пожалуйста, в какую сторону копать? В устройстве проблем нет, подключил к компу схожим на мой старый, все путем.
  6. Вернул на минимальную паузу в один такт между TLP, добавил в этот такт доп проверку tx_buf (количество свободных буферов ядра), не даю им опуститься ниже 8, если опускается то в отдельном состояние автомата ожидает, пока ядро переварит и продолжает запись. Добился 1.6 ГБ/с. И еще, материнка определила max payload как 128, хотя в ядре 512, в биосе что-то не нарыл как изменить, так бы еще удалось разогнать
  7. Дада, вчера не успел на работе) Поставил вивадо и запустил корку дма бета. Изучил формирование пакета и автомат управления сигналами. Собственно, чего и не хватало. До конца помогло разобраться в конфигурации ТЛП запроса, ну и организовал автомат управляющий ногами как на скрине выше. Вот как формируется ТЛП запрос Код                                    s_axis_tx_tdata <= (                                                         dma_addr & --lo addr                                                         X"00000000" & --hi addr                                                         X"0600" & --RID                                                         "10000000"&--tx_tag                                                         "1111" &                                                         "1111" &                                                         "01100000" & --write                                                         '0' &                                                         "000" &                                                         "0000" &                                                         '0' &                                                         '0' &                                                         "00" &                                                         "00" &                                                         "0000100000"    --32 DW                                                                                                     ) after TCQ; Передача как на скрине выше, организована циклическая запись, запись по сигнала Tx_ready. Валится Tx_ready от ядра и все встает(комп не зависает). По времени пересылает 125-130 пачек (TLP+8пакетов данных). Может в ядре что-то сбрасывать надо периодически? Или в конфиге бит какой важный update: через BAR могу управлять dma_en своим сигналом, т.е. pcie устройство не отваливается, но запись более не происходит, т.к. tx_ready от ядра нет upd2: добавил после пачек не 1 такт нулевой а 3, и поток пишется, есть такие же застои иногда, но не сдыхает. По расчетам 1.3 ГБ поток, буду еще экспериментировать с размером посылок, но паузы мне эти не нравятся На двух тактах работает несколько секунд и сдыхал.
  8. Снова приветствую, запись завелась, теперь новый затык. Пишу сл. образом: шина 128 бит, Первый TLP пакет(128 бит), и следом 8 пакетов данных. Все чудесно пишется, но только некоторое время. Ниже прилагаю скрин чипскопа. Каждый эксперимент прокачивает +- одинаковое количество данных. Пробовал кольцевой буфер и 1мб и 1кб, результат примерно один. Подскажите пожалуйста, почему падает tx_ready.
  9. Да и светодиоды использую для проверки и chipscope, в том то и дело, что на основе моей логике и пакеты формируются и все что надо выставляется, но по заданным адресам на пк так и тишина, вот и грешу на служебные слова в заголовке пакета, что выше скидывал, хотя судя по мануалам везде нули. Функция запаси или автомат формирования запроса и данных, очень меня бы спас А на счет бита, это я про бит мастер шины, мало ли, где что-то подобное упустил. (кстати через светодиод и проверил)
  10. Скажите, пожалуйста, кто знает, похоже на правду или я кардинально неправильно делаю А то всё капаю капаю, а вдруг, где 1 бит не так. Буду благодарен конечно, если скините кусок рабочего кода.
  11. Проверенными методами выделяю память, и передаю начальный адрес в ПЛИС через БАР0, на стороне плис успешно его считываю, там же в БАР0 записываю бит разрешающий писать по данному адресу. В ПЛИС по этому флагу собственно вот такой механизм записи в ПК, в нем очень не уверен, думаю из-за него и проблема. Так же прочитал, что должен быть в конфигурации выставлен бит мастер шины, по 0x4 адресу = 0x0006, т.е. 2 бит выставлен верно. Код            if (write_en_f = '1') then                                                 if ((s_axis_tx_tready) = '1') then                          s_axis_tx_tlast <= '1' after TCQ;                          s_axis_tx_tvalid <= '1' after TCQ;                          s_axis_tx_tdata <= (                                                     X"11111111" & --data                                                     st_addr & --addr                                                     "0000000000000000" &                                                     "00000000" &                                                     "0000" &                                                     "1111" &                                                     "01000000" &                                                     '0' &                                                     "000" &                                                     "0000" &                                                     '0' &                                                     '0' &                                                     "00" &                                                     "00" &                                                     req_len                                                     ) after TCQ;                             s_axis_tx_tkeep <= x"FFFF" after TCQ;                         end if;                                      else                                s_axis_tx_tlast  <= '0' after TCQ;                       s_axis_tx_tvalid <= '0' after TCQ;                       s_axis_tx_tdata  <= (others => '0') after TCQ;                       s_axis_tx_tkeep  <= (others => '1') after TCQ;                   end if; --write_en_f Не уверен, что этого достаточно, или параметры не верны, хочу по начальному адресу для начала хотя бы записать один пакет. На ПК тишина и в области памяти нули. Синего экрана даже нет, как будто ничего и не происходит.
  12. Цитата(AVR @ Nov 23 2017, 14:36) Для Windows не подскажу, но по аналогии в Linux можно (в качестве самого базового способа) вызвать dma_alloc_coherent и выделить некоторый буфер, например 4096 байт. И получив два адреса, один отдается устройство в которое оно может писать в произвольный момент времени, а ядро ОС может читать что записало устройство по второму адресу. Отсюда и вопрос - как Вы выделяете память, приведите пример. И какие меры приняты, чтобы оба адреса оставались постоянными, чтоб их можно было чуть ли не зашить в прошивку. Если пользуетесь сторонней программой, то похоже это тот самый момент, когда надо уже начинать писать свой драйвер. Да, там есть такое дело, адрес должен быть с шагом 4 байта, если не ошибаюсь, и действительно 2 младших бита нулевые. С выделением памяти есть своя программа, предполагал, пока не передаю выделенный адрес в плис, просто протестировать запись с произвольную ячейку, но видимо так нельзя? (заведомо брал побольше адрес, чтобы он неиспользовался и там нулевые значения были).
  13. Цитата(AVR @ Nov 22 2017, 18:15) Сам ПК успешно считал из BAR через эту программу (rw everything), т.е. проходят запросы CplD? Итак, попытка записать в ПК из железки - откуда берется адрес? И как он попадает в железку, хардкод что ли? т.е. данные будут прилетать без запроса? Кто их там ждет? А кто сказал что адрес для устройства и адрес для ядра ОС один и тот же? Не знаю, возможно ли это, я так никогда не делал, может потому компьютер удивляется. Да, исходный пример с ядром по записи-чтению в БАР, работает. Запросы проходят, вот я подумал изменить этот кусок, чтобы он писал не в БАР, а мной заданный адрес (для начала прям в коде железно адрес, пробовал разные, а потом через БАР буду задавать выделенную область). Поэтому вот хочу разобраться просто в команде записи по заданному адресу. //update Я похоже адрес неправильно ввожу, т.к. там в конце два бита зарезервированы, а адрес 30 разрядный
  14. Здравствуйте, взялся за реализацию обмена по 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) не подходят в данном случае. Хотелось бы пример команды с чистой записью из железки в ПК по заданному адресу, возможно однократная.
  15. Устройство увиделось в системе. И тактовую и трансиверы потребовалось напрямую задавать.