Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PCIE IP и CycloneIV
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Torika
Здравствуйте!

Необходимо реализовать прием, обработку и пересылку данных на ПЛИС CycloneIV через интерфейс PCIE. В QSys собрал системы, согласно примерам от Altera. Параметры PCIE IP приведены на рисунке. Возник ряд вопросов.

Q1: Я правильно понимаю, что настройку/управление/чтение_состояния блоков PCIE и DMA я могу сделать во внешнем модуле (без использования NIOS), через второй порт onchip-memory
(записывая и читая слова по соттветствующим смещениям, согласно описаниям на PCIE IP и DMA)?

Q2: Не смог для себя уяснить некоторые моменты с настройкой PCIE IP. В каких случаях использовать 64-бит BAR type, а в каких 32-бит? Я правильно понимаю, что при использовании 64-бит BAR TYPE,
трансляции адресов не происходит, а при 32-бит BAR TYPE старшие 32 бита добавляются из таблицы адресов трансляции?

Q3: Использование fixed translation table отличается от dynamic лишь тем, что dynamic необходимо вначале настраивать через CRA, а fixed жестко задается при генерации системы?
Параметр size of address pages определяет размер адресуемой памяти для данных?

Q4: Карта адресов. В первой колонке показан общей размер onchip-memory - 64 кБ. Из второй видно, что для обращения к регистрам PCIE используются
адреса 0x0000_0000 - 0x0000_3FFF, к регистрам DMA адреса 0x0000_4000 - 0x0000_401F. Я правильно понимаю, что если через порт S2 on-chip memory
прочитаю данные по адресу 0x0000_0000, что получу следующие параметры PCIE: Command, Status, Vendor ID, Device ID ? Соответственно при обращении по
адресу 0x0000_4001 получу следующие параметры DMA: Write master start address + Read master start address. Правильно?
doom13
Цитата(Torika @ Jan 22 2016, 08:37) *
Я правильно понимаю, что если через порт S2 on-chip memory
прочитаю данные по адресу 0x0000_0000, что получу следующие параметры PCIE: Command, Status, Vendor ID, Device ID ? Соответственно при обращении по адресу 0x0000_4001 получу следующие параметры DMA: Write master start address + Read master start address. Правильно?

Вы получите содержимое памяти, а не регистров DMA и PCIe.


Цитата(Torika @ Jan 22 2016, 08:37) *
Q1: Я правильно понимаю, что настройку/управление/чтение_состояния блоков PCIE и DMA я могу сделать во внешнем модуле (без использования NIOS), через второй порт onchip-memory
(записывая и читая слова по соттветствующим смещениям, согласно описаниям на PCIE IP и DMA)?

Неправильно! Это должен делать драйвер со стороны системы.
Torika
Цитата(doom13 @ Jan 22 2016, 07:16) *
Вы получите содержимое памяти, а не регистров DMA и PCIe.

хм а разве по эти адресам не находится содержимое регистров?
doom13
Цитата(Torika @ Jan 22 2016, 10:58) *
хм а разве по эти адресам не находится содержимое регистров?

Нет, у каждого ядра есть своя memory map (адресное пространство) на базе логики или RAM.
novartis
Цитата
Q1: Я правильно понимаю, что настройку/управление/чтение_состояния блоков PCIE и DMA я могу сделать во внешнем модуле (без использования NIOS), через второй порт onchip-memory
(записывая и читая слова по соттветствующим смещениям, согласно описаниям на PCIE IP и DMA)?

onchip-memory никакого отношения к управлению PCIE и DMA не имеет. Она используется для хранения, пересылки ваших данных.


Цитата
Q2: Не смог для себя уяснить некоторые моменты с настройкой PCIE IP. В каких случаях использовать 64-бит BAR type, а в каких 32-бит? Я правильно понимаю, что при использовании 64-бит BAR TYPE,
трансляции адресов не происходит, а при 32-бит BAR TYPE старшие 32 бита добавляются из таблицы адресов трансляции?

В обоих случаях адреса формируются в соответствии с таблицей адресов трансляции. Выбирается 64 или 32 в зависимости от операционки, которая установлена на ПК.
Смысл использовать 64, если ось 32 разрядная, и будет ли ваш pcie обмен вообще работать в этом случае.

Цитата
Q3: Использование fixed translation table отличается от dynamic лишь тем, что dynamic необходимо вначале настраивать через CRA, а fixed жестко задается при генерации системы?
Параметр size of address pages определяет размер адресуемой памяти для данных?

про динамик/фиксед ничего не скажу, не помню, не знаю. Параметр size of address pages определяет размер адресуемой памяти для данных совместно с кол-вом страниц.
размер адресуемой памяти = (size of address pages ) * (кол-во страниц)

Цитата
Q4: Карта адресов. В первой колонке показан общей размер onchip-memory - 64 кБ. Из второй видно, что для обращения к регистрам PCIE используются
адреса 0x0000_0000 - 0x0000_3FFF, к регистрам DMA адреса 0x0000_4000 - 0x0000_401F. Я правильно понимаю, что если через порт S2 on-chip memory
прочитаю данные по адресу 0x0000_0000, что получу следующие параметры PCIE: Command, Status, Vendor ID, Device ID ? Соответственно при обращении по
адресу 0x0000_4001 получу следующие параметры DMA: Write master start address + Read master start address. Правильно?

Нет.
DMA: Write master start address + Read master start address - читайте в баре BAR2 по адресам 0x0000_4000 - 0x0000_401F

PCIE: Command, Status, Vendor ID, Device ID - нужно даташит смотреть на ip-ядро, может через Cra можно их прочитать.
Если через Cra, то читайте в баре BAR2 по адресам 0x0000_0000 - 0x0000_3FFF.
Если через Cra нельзя достучаться до Configuraton Space, то тогда через бары вы их не прочитаете.
Только в драйвере через спец функции, типа так:
pci_read_config_word(dev, PCI_VENDOR_ID, &val_vendor_id);
pci_read_config_word(dev, PCI_DEVICE_ID, &val_device_id);
Torika
Добрый день!
Спасибо всем ответившим.
Цитата(novartis @ Jan 22 2016, 19:29) *
DMA: Write master start address + Read master start address - читайте в баре BAR2 по адресам 0x0000_4000 - 0x0000_401F
Если через Cra, то читайте в баре BAR2 по адресам 0x0000_0000 - 0x0000_3FFF.

Подскажите пожалуйста, как прочитать BAR2. Пробежался по IP Compiler for PCI Express User Guide,ничего не нашел. Когда-то давно использовал Qsys и Nios, там
для чтения/записи регистров управления различной периферии просто обращаешься по базовым адресам с соответствующим смещением и читаешь/редактируешь.
Я думал, что здесь будет похожим образом, onchip memory разбивается на несколько областей: собственно сами данные, области доступа к регистрам управления
различной периферии. Но, видимо все не так. Как же тогда получить доступ к регистрам управления DMA и PCIe ?
doom13
Цитата(Torika @ Jan 25 2016, 09:47) *
Подскажите пожалуйста, как прочитать BAR2. Пробежался по IP Compiler for PCI Express User Guide,ничего не нашел. Когда-то давно использовал Qsys и Nios, там
для чтения/записи регистров управления различной периферии просто обращаешься по базовым адресам с соответствующим смещением и читаешь/редактируешь.
Я думал, что здесь будет похожим образом, onchip memory разбивается на несколько областей: собственно сами данные, области доступа к регистрам управления
различной периферии. Но, видимо все не так. Как же тогда получить доступ к регистрам управления DMA и PCIe ?

BARs пишет/читает драйвер ОС. На этапе отладки можно добавить в систему Nios, предоставить ему доступ к регистрам DMA (dma->control_port_slave), тогда будет возможность мониторить правильность записи регистров DMA со стороны драйвера.
При чтении/записи регистров устройств из программы Nios II лучше использовать макросы из BSP, которые предоставляет Altera. Использовать для этого указатель - не советую!
Torika
Цитата(doom13 @ Jan 25 2016, 08:15) *
BARs пишет/читает драйвер ОС. На этапе отладки можно добавить в систему Nios, предоставить ему доступ к регистрам DMA (dma->control_port_slave), тогда будет возможность мониторить правильность записи регистров DMA со стороны драйвера.
При чтении/записи регистров устройств из программы Nios II лучше использовать макросы из BSP, которые предоставляет Altera. Использовать для этого указатель - не советую!

Получается я могу только лишь следить за состоянием регистров DMA ? Как же я буду отправлять данные через PCIe ? Я думал, укажу начальный адрес (writeaddress Register DMA), количество передаваемых байт (length Register DMA), установлю бит GO в control Register DMA и начнется передача. Далее буду ждать когда передача закончиться (мониторить соответствующие биты в control Register DMA). Видимо, я снова ошибался.
doom13
Цитата(Torika @ Jan 25 2016, 10:33) *
Получается я могу только лишь следить за состоянием регистров DMA ? Как же я буду отправлять данные через PCIe ? Я думал, укажу начальный адрес (writeaddress Register DMA), количество передаваемых байт (length Register DMA), установлю бит GO в control Register DMA и начнется передача. Далее буду ждать когда передача закончиться (мониторить соответствующие биты в control Register DMA). Видимо, я снова ошибался.

Всё это в случае PCIe делает драйвер, ещё он выделяет буферы памяти для данных.
Torika
Цитата(doom13 @ Jan 25 2016, 08:38) *
Всё это в случае PCIe делает драйвер, ещё он выделяет буферы памяти для данных.

Хорошо, как же тогда отправлять данные с ПЛИС на ПК ? В смысле, я ведь должен указать, что именно отправлять и выставить флаг, что нужно отправлять.
doom13
Цитата(Torika @ Jan 25 2016, 10:42) *
Хорошо, как же тогда отправлять данные с ПЛИС на ПК ? В смысле, я ведь должен указать, что именно отправлять и выставить флаг, что нужно отправлять.

Тут алгоритм Ваших действий.
Torika
Цитата(doom13 @ Jan 25 2016, 09:02) *

Спасибо, буду разбираться.
Torika
Добрый день.
Никто не сталкивался с примерами реализации приема/передачи данных по PCIe ? Большинство примеров, с которыми сталкивался, представляют собой лишь собранную систему в qsys и все.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.