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

Ядро PCI Express Block Plus в Virtex 5

Так, сорри, но я ввел вас в заблуждение.

Мне таки позволили расковырять рабочий PC, и я вставил плату с плисом туда (производитель для этого специальную переходную плату дает). Загрузилось сразу же - дефолтная прошивка с установленными в системе драйверами даже объявила о себе в диспетчере устройств, прошивка сгенерированная core generator вроде как тоже (по крайней мере она теперь висит в состоянии L0, как обнаружить ее в системе пока не допер. Все найденные для сканирования pci-шины проги (pcitree, pcidirect) под win7 не запустились).

 

Получается дело в рут комплексе - MSM945. Но это уже не совсем к этому топику относится

Попробуйте bios покопать, power save и прочее.

Корегенераторная прошивка ставится как memory controller.

Попробуйте мою прошивку, надо только jungo поставить сначала.

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


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

Появились еще вопросы к знатокам PCI Express Block Plus:

 

Если я создаю прошивку скажем PCIe x2, однако на плате физически только одна из этих линий соединена с процессором, возможно ли чтобы прошивка с процессором правильно договорились о ширине шины и сами переключились на х1 ? Подсознательно понимаю что такое должно быть возможно, однако на практике работы не вижу.

 

В виртексе каждый GTX трансивер имеет тактовый вход. Но если вдруг мне понадобилось использовать определенный трансивер, но тактовый сигнал брать с другого (из-за ошибочной разводки платы), ISE выдает ошибку что-то вроде

"When using a GTP/GTX with a REFCLK coming from anIBUFDS element near another GTP/GTX, each GTP in between the source and destination must be instantiated in the correct manner (See AR 33473). If you don't instantiate these other GTP tiles the software tools will route the REFCLK correctly, but the design may not work in hardware."

В указанном AR мало чего понял. Если кто сталкивался, подскажите от чего оттолкнуться

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


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

Появились еще вопросы к знатокам PCI Express Block Plus:

 

Если я создаю прошивку скажем PCIe x2, однако на плате физически только одна из этих линий соединена с процессором, возможно ли чтобы прошивка с процессором правильно договорились о ширине шины и сами переключились на х1 ? Подсознательно понимаю что такое должно быть возможно, однако на практике работы не вижу.

 

Добрый день.

Реально сталкивался с ситуацией, когда устройство на базе PCI Express Block Plus х4 в некоторых материнках в слотах х16 работает как х4, а в некоторых, как х1.

Проверить как опознал ХОСТ устройство можно с помощью программки pci32.exe. Архив в прикрепленном файле.

Запуск программы из командной строки pci32.exe > pcicfg.txt запишет информацию обо всех найденных pci и pcie устройствах в файл pcicfg.txt.

Удачи.

pci32.zip

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


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

Andrew Su, спасибо за програмку, но дело у меня в другом. На данном этапе наконец полностью понял суть проблемы: единственный корректный х1 линк от процессора подается на второй порт в одном из сдвоенных трансиверов виртекса. Если я пытаюсь назначить в корке х1 линк на этот порт, ise ругается что это можно делать только на первый из портов трансивера. Вообще единственное что я могу присвоить моему правильному порту, это нечетный номер в соединении (1, 3 и т. д.). Однако как написано в мануале, если я создал в виртексе шину скажем на 4 линии, то он может ее самостоятельно обрубить до х1 только в том случае, если рабочей будет нулевая линия в этой шине (а не просто одна из линий). На форуме xilinx проскакивала информация о том, что в сдвоенных трансиверах можно инвертировать их номера (нулевой станет первым, первый станет нулевым) поменяв их назначение в одном из файлов корки (pcie_gt_wrapper), однако пока не смог понять как. Так получается, что для моих неудачно выбранных покупных плат это единственный вариант заработать - повесить нулевую линию шины pcie на первый трансивер в сдвоенном блоке.

 

Прошу прощения за сбивчивое объяснение. Как и раньше буду рад подсказкам, хотя проблема и достаточно редкая.

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


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

Andrew Su, спасибо за програмку, но дело у меня в другом. На данном этапе наконец полностью понял суть проблемы: единственный корректный х1 линк от процессора подается на второй порт в одном из сдвоенных трансиверов виртекса. Если я пытаюсь назначить в корке х1 линк на этот порт, ise ругается что это можно делать только на первый из портов трансивера. Вообще единственное что я могу присвоить моему правильному порту, это нечетный номер в соединении (1, 3 и т. д.). Однако как написано в мануале, если я создал в виртексе шину скажем на 4 линии, то он может ее самостоятельно обрубить до х1 только в том случае, если рабочей будет нулевая линия в этой шине (а не просто одна из линий). На форуме xilinx проскакивала информация о том, что в сдвоенных трансиверах можно инвертировать их номера (нулевой станет первым, первый станет нулевым) поменяв их назначение в одном из файлов корки (pcie_gt_wrapper), однако пока не смог понять как. Так получается, что для моих неудачно выбранных покупных плат это единственный вариант заработать - повесить нулевую линию шины pcie на первый трансивер в сдвоенном блоке.

 

Прошу прощения за сбивчивое объяснение. Как и раньше буду рад подсказкам, хотя проблема и достаточно редкая.

 

Странное что-то. Два канала GTP обозначаются одним констрейнтом, а канал выбирается по распиновке клока и данных самим исе. У Вас что ucf был неправильный?

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


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

Констрейнт для сдвоенного GTP один и клок на него один. А вот данные строго определены - на нулевой трансивер четные линии шины, на первый нечетные. Вот по этому поводу рисунок из мануала:

 

post-60513-1324909313_thumb.jpg

 

Да и как канал может быть выбран по распиновке данных, если данные самим ise разрешается вешать только на нулевые трансиверы (в остальных случаях вылазит ошибка).

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

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


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

Констрейнт для сдвоенного GTP один и клок на него один. А вот данные строго определены - на нулевой трансивер четные линии шины, на первый нечетные. Вот по этому поводу рисунок из мануала:

 

post-60513-1324909313_thumb.jpg

 

Да и как канал может быть выбран по распиновке данных, если данные самим ise разрешается вешать только на нулевые трансиверы (в остальных случаях вылазит ошибка).

Действительно, странно выбрана распиновка плис. В таблице 5-3 вообще сказано, что для FX30T можно использовать только трансивер X0Y3 для PCIEx1. В Вашем ucf пины указаны только для тактовой, как на схеме подключены пины rx tx пары?

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


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

По поводу таблицы с поддерживаемыми трансиверами, в пункте перед ней "Relocating the Endpoint Block Plus Core" сказано, что они являются рекомендуемыми ввиду их максимальной близости к физическому блоку PCI Express, переход к другим трансиверам возможен, однако в этом случае xilinx не предоставляет техническую поддержку :) (в итоге максимальная частота проекта получалась в районе 239 МГц, и он отлично работал при 100 МГц опоры в обычном PC. Предполагаю, что с X0Y3 он бы и на 250 МГц завелся, однако в моей плате этот GTP занят SATA интерфейсом).

 

Вообще на моей плате распиновка такова:

 

Единственная возможная для использования x1 линия:

X0Y2, RX - MGTRXP1_112 (M1) & MGTRXN1_112 (L1), TX - MGTTXP1_112 (N2) & MGTTXN1_112 (M2)

 

Возможные тактовые линии:

X0Y1, T4 & T3 (идут через драйверную микросхему с PEx16_x8_x4_Clkp/n)

X0Y0, AB4 & AB3 (идут напрямую с PEx1_3Clkp/n).

 

Я понимаю что нет ничего хорошего в том, что данные подключены к одному GTP, а клоки к другому, но уж что имею. Линии которые предполагались к использованию как основные, со стороны процессора подключены к шине PEG (PCI Express Graphics, заточена исключительно под работу с видеокартами, не может масштабироваться на меньше чем х16). Пока моя основная идея возможного костыля в такой ситуации это делать шину х4, захватывая оба нужных трансивера, и заставить ее завестись как х1. И здесь пока я упираюсь в ограничения приведенной мною выше таблицы.

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


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

И снова спасибо всем кто пытался помочь, наконец-то добился связи своих двух плат. В итоге заработал вариант, который я описал в предыдущем посте. Трансиверы в сдвоенном GTX_DUAL блоке удалось поменять местами с помощью правки соответствующего файла корки - pcie_gtx_wrapper.v, путем изменения в списке подключения всех 0 и 1 местами (например .RXN0(GT_RXN[i+0]), и .RXN1(GT_RXN[i+1]), на .RXN1(GT_RXN[i+0]), и .RXN0(GT_RXN[i+1]),)

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


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

Здравствуйте. Я пытаюсь разобраться с кодом PIO от Xilinx, который присутствует в корке PCIe. В этом примере вся память разбита на области по 2 Кб(всего 4 области). С компа обращаюсь к этой памяти через прогу RW-Everything.

из даташита на эту корку вычитал следующее:

Each space is implemented with a 2 KB memory. If the corresponding BAR is

configured to a wider aperture, accesses beyond the 2 KB limit wrap around and

overlap the 2 KB memory space.

Попробовал записать произвольные значения в память начиная с адреса, содержащегося в BAR. Действительно, как сказано в даташите, значения повторяются каждые 2 Кб. Но не как не пойму каким образом обращаться к остальным областям? В исходниках выбор области осуществляется исходя из значения двухбитового префикса адреса, который поступает в блок PIO_RX_ENGINE по шине AXI. Но как его задавать я так и не понял.

Может каждая область должна привязываться к своему BARу? При конфигурировании корки я активировал только один BAR

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


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

внутри PIO_RX_ENGINE в зависимости от типа пришедшего пакета есть ряд присвоений этому адресу:

 

например,

wr_addr      <= #TCQ {region_select[1:0],m_axis_rx_tdata[10:2]};

 

region_select выбирается чуть ниже,

этот case можно настроить для работы по разным BAR и получить доступ к разным 2К.

 

  assign mem64_bar_hit_n = ~m_axis_rx_tuser[2];
  assign io_bar_hit_n = 1'b1;
  assign mem32_bar_hit_n = ~m_axis_rx_tuser[4];
  assign erom_bar_hit_n  = ~m_axis_rx_tuser[8];

  always @*
  begin
    case ({io_bar_hit_n, mem32_bar_hit_n, mem64_bar_hit_n, erom_bar_hit_n})

      4'b0111 : begin
        region_select <= #TCQ 2'b00;    // Select IO region
      end // 4'b0111
.....

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


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

toshas, благодарю за ответ! А можно ли расширить эти области памяти хотябы до 64Кб? Адрес, который выделяется из пакета, пришедшего по AXI имеет разрядность всего 10 бит(с учетом префикса). Этого уж явно не хватит на 64Кб :(

и еще где бы почитать про формат пакета от корки PCIe, приходящий по AXI?

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


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

конечно, для этого нужно указать требуемый объем BAR, а затем увеличить разрядность шины адреса в примере и делать присвоение не со 2 по 10 биты, а со 2 по 16 или больше.

адрес передается 32х битный в пакете.

 

формат пакета определен протоколом PCIe и описан в спецификации.

на шину AXI разрядностью 64бита ложится по два DW из пакета.

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


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

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

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


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

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

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

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

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

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

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

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

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

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