Jump to content

    
AVR

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

Recommended Posts

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Конечно, туториал из 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-пакеты.

Share this post


Link to post
Share on other sites

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

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

Share this post


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

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

 

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

Share this post


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

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

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

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

Share this post


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

post-10008-1482083192_thumb.png

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

Share this post


Link to post
Share on other sites

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

 

PCIE Gen2 x8

 

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

 

Share this post


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

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

Share this post


Link to post
Share on other sites

Вот мой файл прослойка для стратикса 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

 

 

 

Share this post


Link to post
Share on other sites
Вот мой файл прослойка для стратикса 4.

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

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

 

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

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

 

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

Share this post


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

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

 

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

Share this post


Link to post
Share on other sites
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 байта, что годится лишь для чтения статусных регистров.

Share this post


Link to post
Share on other sites
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нс (ну тоже зависит от платформы)

Share this post


Link to post
Share on other sites
2 hours ago, novartis said:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.