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

    

exigo

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

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

  • Посещение

Репутация

0 Обычный

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

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

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

802 просмотра профиля
  1. Всем снова привет, в автомате памяти, 50% времени происходит в ожидание сигнала app_rdy. Ну не должен он так долго быть недоступен. От того и КПД работы с памятью 50%. Расскажите, где копать, и у кого какие результаты получалось выжимать при работе с ddr(думаю не особо важно ddr2,3,4). Особо интересно было бы взглянуть на временные диаграммы. upd скоростные показатели из сообщения выше не актуальны (не могу скорректировать)
  2. BUrst mode 8 (адрес соответственно ++8), шина 256, записываю 64 посылки(каждая отдельный цикл записи). Потом считываю 8 раз по 8. При чтение 1.2 GB(теоретическая 1.6) достигается, а запись хромает (в районе 500-600), экспериментирую и оптимизирую автомат, и записываю по несколько посылок последовательно (2,4,8). Но начинает падать wdf_rdy и app_rdy, и в итоге то на то и выходит по пропускной способности. Может с величиной посылок попробовать, 8 писать, потом 8 читать, чтобы входной буфер памяти перекуривал, вот интересны рекомендации.
  3. ага, это понял. app_rdy часто в '0', КПД маловато, так и есть, или в настройках и режимах работы можно оптимизировать.
  4. Всем привет, снова вернулся к ДДР3, уперлись в скорость. Используем микросхемы MT41K64M16TW-107. Среда ISE, MIG 1.9 В настройках не позволяет изменить рабочую частоту (Clock Period) выше 400 Mhz. Не пойму от какого параметра пределы зависит и как поднять до максимальной частоты. И вообщем подскажите рекомендации, реализован колцьевой буфер, но память частенько скидывает app_rdy. и простаивается автомат. Как выжать максимум кпд?
  5. В чипскоп завел проект, tx_buf заканчиваются и встает автомат в ожидание, но самое, что все команды на запись, что идут в ПК, по адресам ноль. Вот не как не пойму на что может повлиять другой комп и материнка. RID какой выставляется? Самое интересное, что пробники pcie в VIVADO даже не дают зашить прошивку, на 99% комп колом встает, и только хард ресет спасает. А на старом ПК все шикарно работает. Попробав разные машины, вывод что безупречно работает в портах pcie 2gen, а в gen3 нет, но надо как-то это исправлять.
  6. В последних версиях еще отслеживаю кредиты (tx_buf) Но дело в том, что комп быстрее стал, и раньше когда не хватало кредитов он не зависал. И интересно, что xilinx примеры не запускаются.
  7. Всем привет, благополучно юзал pcie. Но тут мне обновили ПК и на новом железе все перестало работать. Мой проект успешно позволяет записать управляющие адреса и размер буфера в БАР, но после включения ДМА устройство отваливается и в БАР 0xffffffffff все, или и того виснет комп. Решил проверить на xilinx примерах дма стримера и дма передачи(от которых отталкивался и они работали на старом ПК), после загрузки в железо комп сразу зависает, даже драйвер не дает поставить. Подскажите пожалуйста, в какую сторону копать? В устройстве проблем нет, подключил к компу схожим на мой старый, все путем.
  8. Вернул на минимальную паузу в один такт между TLP, добавил в этот такт доп проверку tx_buf (количество свободных буферов ядра), не даю им опуститься ниже 8, если опускается то в отдельном состояние автомата ожидает, пока ядро переварит и продолжает запись. Добился 1.6 ГБ/с. И еще, материнка определила max payload как 128, хотя в ядре 512, в биосе что-то не нарыл как изменить, так бы еще удалось разогнать
  9. Дада, вчера не успел на работе) Поставил вивадо и запустил корку дма бета. Изучил формирование пакета и автомат управления сигналами. Собственно, чего и не хватало. До конца помогло разобраться в конфигурации ТЛП запроса, ну и организовал автомат управляющий ногами как на скрине выше. Вот как формируется ТЛП запрос Код                                    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 ГБ поток, буду еще экспериментировать с размером посылок, но паузы мне эти не нравятся На двух тактах работает несколько секунд и сдыхал.
  10. Снова приветствую, запись завелась, теперь новый затык. Пишу сл. образом: шина 128 бит, Первый TLP пакет(128 бит), и следом 8 пакетов данных. Все чудесно пишется, но только некоторое время. Ниже прилагаю скрин чипскопа. Каждый эксперимент прокачивает +- одинаковое количество данных. Пробовал кольцевой буфер и 1мб и 1кб, результат примерно один. Подскажите пожалуйста, почему падает tx_ready.
  11. Да и светодиоды использую для проверки и chipscope, в том то и дело, что на основе моей логике и пакеты формируются и все что надо выставляется, но по заданным адресам на пк так и тишина, вот и грешу на служебные слова в заголовке пакета, что выше скидывал, хотя судя по мануалам везде нули. Функция запаси или автомат формирования запроса и данных, очень меня бы спас А на счет бита, это я про бит мастер шины, мало ли, где что-то подобное упустил. (кстати через светодиод и проверил)
  12. Скажите, пожалуйста, кто знает, похоже на правду или я кардинально неправильно делаю А то всё капаю капаю, а вдруг, где 1 бит не так. Буду благодарен конечно, если скините кусок рабочего кода.
  13. Проверенными методами выделяю память, и передаю начальный адрес в ПЛИС через БАР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 Не уверен, что этого достаточно, или параметры не верны, хочу по начальному адресу для начала хотя бы записать один пакет. На ПК тишина и в области памяти нули. Синего экрана даже нет, как будто ничего и не происходит.
  14. Цитата(AVR @ Nov 23 2017, 14:36) Для Windows не подскажу, но по аналогии в Linux можно (в качестве самого базового способа) вызвать dma_alloc_coherent и выделить некоторый буфер, например 4096 байт. И получив два адреса, один отдается устройство в которое оно может писать в произвольный момент времени, а ядро ОС может читать что записало устройство по второму адресу. Отсюда и вопрос - как Вы выделяете память, приведите пример. И какие меры приняты, чтобы оба адреса оставались постоянными, чтоб их можно было чуть ли не зашить в прошивку. Если пользуетесь сторонней программой, то похоже это тот самый момент, когда надо уже начинать писать свой драйвер. Да, там есть такое дело, адрес должен быть с шагом 4 байта, если не ошибаюсь, и действительно 2 младших бита нулевые. С выделением памяти есть своя программа, предполагал, пока не передаю выделенный адрес в плис, просто протестировать запись с произвольную ячейку, но видимо так нельзя? (заведомо брал побольше адрес, чтобы он неиспользовался и там нулевые значения были).
  15. Цитата(AVR @ Nov 22 2017, 18:15) Сам ПК успешно считал из BAR через эту программу (rw everything), т.е. проходят запросы CplD? Итак, попытка записать в ПК из железки - откуда берется адрес? И как он попадает в железку, хардкод что ли? т.е. данные будут прилетать без запроса? Кто их там ждет? А кто сказал что адрес для устройства и адрес для ядра ОС один и тот же? Не знаю, возможно ли это, я так никогда не делал, может потому компьютер удивляется. Да, исходный пример с ядром по записи-чтению в БАР, работает. Запросы проходят, вот я подумал изменить этот кусок, чтобы он писал не в БАР, а мной заданный адрес (для начала прям в коде железно адрес, пробовал разные, а потом через БАР буду задавать выделенную область). Поэтому вот хочу разобраться просто в команде записи по заданному адресу. //update Я похоже адрес неправильно ввожу, т.к. там в конце два бита зарезервированы, а адрес 30 разрядный