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

PCI-E интерфейс в Qsys на Cy IV GX

Здравствуйте!

Есть платка Cyclone IV GX Starter, стандартный поставочный пример-демка видится в системе как PCI-E устройство. Теперь хочется создать уже свое устройство, которое было бы совместимо с ранее написанным (своим) драйвером для ПЛИС другого производителя. Однако у Altera PCI-E ядро оказалось существенно сложнее в подключении и настройке, и судя по всему предназначено для работы именно через Qsys а не как отдельный интерфейс.

 

Существуют ли хорошие туториалы где бы по шагам была бы объяснена настройка и подключение к Nios? Я не могу найти ничего, только какие-то презентации и слайды, хотя вот для TSE например были подробные туториалы.

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


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

Кажется, стала ясна причина невозможности найти туториал, по причине его присутствия прямо в даташите на IP блок: ug_pci_express.pdf 15. Testbench and Design Example и 16. Qsys Design Example. Прошу прощения, не додумался посмотреть на самом видном месте...

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


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

Конечно, туториал из ug_pci_express.pdf не подошел имеющейся у меня отладочной плате по многим причинам, но тем не менее удалось сгенерировать систему, состоящую из одного лишь ядра IP Compiler (плюс altgx_reconfig и PLL в топ модуле):

post-10008-1481741090_thumb.png

Такая прошивка определилась в системе, однако у нее нет "региона памяти" (т.е. BAR0). Он видится только если подключить MM Slave типа памяти или тому подобного.

 

А как работать с альтеровским PCI-E ядром БЕЗ таких извращений? В документации даже пишут:

In the Qsys design flow, the PCI Base Address Registers (Type 0 Configuration

Space) Bar Size and Avalon Base Address information populates from Qsys. You

cannot enter this information in the IP Compiler for PCI Express parameter editor.

Хочу как у Lattice и Xilinx просто слать TLP пакеты и принимать.

 

Что же туда подцепить чтобы оно схватило размер для BAR0, и при этом легко писать/читать туда данные? FIFO может быть (один в одну сторону, другой в обратную на передачу)? Могу Nios2 туда воткнуть, но хочется ведь из своей простой логики слать TLP-пакеты.

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


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

подцепите on-chip ram на bar0. Тогда со стороны компа сможете писать данные в ПЛИС (в эту ram) и читать данные из ПЛИС (из этой ram).

Чтобы слать TLP-пакеты из ПЛИС на комп нужно на порт txs подцепить модуль с Avalon Master.

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


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

Чтобы слать TLP-пакеты из ПЛИС на комп нужно на порт txs подцепить модуль с Avalon Master.

Неправильно написал. В данном варианте PCIE IP Core в порт txs вы запихиваете просто данные. Сама корка обертывает их tlp, то есть вам даже не нужно с tlp заморачиваться.

 

Если же хотите самостоятельно формировать пакеты, заголовки для PCIE, то нужно сгенерить PCIE IP Core типа Avalon Streaming. Такой точно можно сгенерить с помощью мегавизарда, а в кусисе - надо смотреть.

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


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

Если же хотите самостоятельно формировать пакеты, заголовки для PCIE, то нужно сгенерить PCIE IP Core типа Avalon Streaming. Такой точно можно сгенерить с помощью мегавизарда, а в кусисе - надо смотреть.

Спасибо за подсказку! Не знал что есть еще вариант!

Получается, что это уже совсем другое IP-core (может основанное на общем коде) и PDF документации у него другой?

Очень нужно самому (как на ПЛИС других производителей) формировать TLP. Вечером посмотрю, надеюсь "Avalon Streaming" не означает что там сложный интерфейс :)

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


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

Если же хотите самостоятельно формировать пакеты, заголовки для PCIE, то нужно сгенерить PCIE IP Core типа Avalon Streaming. Такой точно можно сгенерить с помощью мегавизарда, а в кусисе - надо смотреть.
Действительно, смог сгенерировать, указал Avalon-ST интерфейс. Правда я удивлен вот чем:

post-10008-1482083192_thumb.png

Вроде не более нового даташита на корку, но в ней почему-то пишут что Avalon-ST не поддерживается. Может по этой причине у меня проект успешно компилируется, однако задействует НОЛЬ логических элементов и по факту не работает (в отличие от QSys-версии с Avalon-MM интерфейсом).

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


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

Ошибка какая-то в пдф, я для стратикс4 конкретно PCIE compiler Avalon Stream (128 бит) создавал и работал.

 

PCIE Gen2 x8

 

-- megafunction wizard: %IP Compiler for PCI Express v14.1%

 

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


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

для стратикс4 конкретно PCIE compiler Avalon Stream (128 бит) создавал и работал
Можно ли Вас попросить показать участок кода непосредственно подключения сгенерированной корки? Сигналов там очень много, было бы интересно взглянуть только на те что нужны для работы.

Дело в том что мои попытки подключить ровно тот же набор сигналов, как и в случае QSys, приводят к нулевому задействованию регистров в проекте. Видимо оптимизатор видит незадействованные линии и оптимизирует в ноль вообще всё. На данном этапе освоения хотелось бы заставить корку просто увидеться в компьютере с моими параметрами.

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


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

Вот мой файл прослойка для стратикса 4.

 

most_pcie_x8.vhd

 

Компонент altpcierd_reconfig_clk_pll - альтеровский, прописан в .qip файле

set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) ip_compiler_for_pci_express-library/altpcierd_reconfig_clk_pll.v ]

 

Компонент pcie_rs_hip должен быть в сгенеренной папке pcie_x8_examples\chaining_dma

 

 

 

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


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

Вот мой файл прослойка для стратикса 4.

Спасибо! Это помогло. Теперь это похоже на адекватный интерфейс PCI-E ядра, с которым можно работать. Вся задача решилась без QSys, ядро видится в компьютере.

Правда пока работает если загрузить комп, прошить ПЛИС и сделать ребут - только тогда видится. А если так не делать - загрузка ОС виснет. Ну думаю разберусь, что-то с резетами.

 

Вот мой вариант подключения на Verilog:test_altera__20161223.v

Тут r_npor это регистр который изначально ноль, а когда пойдут клоки он чуть подержит и затем снимет сигнал сброса npor. Может это ужасное решение, но пока так :)

 

core_clk_out - это то, от чего мы должны тактить свою пользовательскую логику? И на прием и на передачу? Или только для приема. Это единственный тактовый выход из корки, и так написано в даташите, вроде верно.

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


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

core_clk_out - это то, от чего мы должны тактить свою пользовательскую логику? И на прием и на передачу? Или только для приема. Это единственный тактовый выход из корки, и так написано в даташите, вроде верно.

в общем да, надо его использовать.

 

Я не использовал, но это из-за косяка в схеме, чтобы была совместимость с блоками, в которых была ошибка в подключении PCI-E.

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


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

On 12/15/2016 at 10:27 PM, novartis said:

подцепите on-chip ram на bar0. Тогда со стороны компа сможете писать данные в ПЛИС (в эту ram) и читать данные из ПЛИС (из этой ram).

Чтобы слать TLP-пакеты из ПЛИС на комп нужно на порт txs подцепить модуль с Avalon Master.

Представляете, прошло почти 5 лет, и сегодня эта информация пригодилась! Именно так и заработало, сейчас просто нужно было через ниос это запустить и это заработало.

 

Подскажите пожалуйста, а можно ли как то без DMA слать с компьютера (хоста) пакеты скажем 4 килобайта за 1 раз, пусть даже они будут побиты на N * max_payload? В настройках вижу какие то упоминания страниц памяти, где нужно задать таблицу преобразования в настройках PCI ядра. Является ли это тем самым искомым механизмом?

 

Со стороны ПЛИС принять большой TLP не видится проблемой, но чисто программно, на Linux, не ясно что это может быть. Или возможно заполняем в ядре ОС некую страницу памяти, а потом даем команду синхронизировать после чего пойдет серия TLP пакетов записи. Есть необходимость обойтись без относительно медленных IO запросов по 4 байта, что годится лишь для чтения статусных регистров.

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


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

On 5/7/2021 at 12:10 AM, AVR said:

Подскажите пожалуйста, а можно ли как то без DMA слать с компьютера (хоста) пакеты скажем 4 килобайта за 1 раз, пусть даже они будут побиты на N * max_payload?

С помощью такой команды можно записать 32 байта за раз  _mm256_storeu_si256.

On 5/7/2021 at 12:10 AM, AVR said:

Есть необходимость обойтись без относительно медленных IO запросов по 4 байта, что годится лишь для чтения статусных регистров.

Это на чтение они медленные (может и микросекунда быть, зависит от платформы), а на запись пауза между TLP пакетами 50-100нс (ну тоже зависит от платформы)

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


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

2 hours ago, novartis said:

Это на чтение они медленные (может и микросекунда быть, зависит от платформы), а на запись пауза между TLP пакетами 50-100нс (ну тоже зависит от платформы)

Спасибо, это действительно ценная информация, ведь проверить я бы это мог не скоро. В таком случае, производительности будет более чем достаточно задачи, поток в ПЛИС менее 250 килобайт в секунду, не будет загрузки процессора более чем 1 процент, что приемлимо.

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


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

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

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

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

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

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

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

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

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

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