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

Передача данных через PCIe + DMA bridge из ПК(Linux) в DDR ПЛИС

Всем привет!

Artix7

Vivado 2019.1

Debian10

Собрал систему Axi Memory Mapped to Pci Express, CDMA, DDR3. Задача в том что бы посылать данные через PCIe в DDR с помощью DMA.

В данный момент с ПК данные записываются в DDR ПЛИСа со скоростью 500Мб/с, что для заданных целей проекта мало. В ip PCIe у меня выделено 3 бара: DDR,BRAM, регистры CDMA. Всё прекрасно пишется и читается, но как я сказал выше, медленно. Так  же в этой коре выделен один AXI BAR с адресом 0x40000000, который транслируется в адресное пространство CDMA как BAR0 PCIe'са и имеет адрес 0x60000000. 

Написал простенький дравер на линикс под данные цели, где заполняю регистры DMA. Адрес назначения = 0x80000000 (это адрес ddr в адресном пространстве cdma) и адрес источника который возвращает драйвер как выделенную память под dma, затем устанавливаю количество байт, что активирует трансфер из сорса в  адрес назначение и в идеи данные из буфера выделенного драйвером в ПК должны появиться в ddr ПЛИС, но их там нет. Если сорс адрес ставить bram, то по той же схеме через драйвер, данные передаются из brem в ddr. 

Не могу понять что упускаю...

pdf блок диаграммы, настройки и драйвей под линукс прикрепил.

Можно попросить посмотреть файлы? Может кто нибудь подскажет что я не правильно делаю.

 

PS не нашел ответов в 

и в Xilinx Answer 65062 AXI Memory Mapped for PCI Express Address Mapping

 

design_1.pdf

test_pci.c

настройки и адреса.pdf

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


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

1. А чем DMA/Bridge Subsystem for PCI-Express не устроил? Лучше бы его пользовать.

2. Драйвер написан процентов на 10 от требуемого. Да и то с ошибками

 

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


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

6 минут назад, gosha-z сказал:

1. А чем DMA/Bridge Subsystem for PCI-Express не устроил? Лучше бы его пользовать.

2. Драйвер написан процентов на 10 от требуемого. Да и то с ошибками

 

Спасибо за Ваш ответ. 

Вы про xdma говорите? Дело в том что в Xilinx Answer 65062 AXI Memory Mapped for PCI Express Address Mapping представлена связка pcie + cdma. Да и бегать от варианта к варианту не хочется, решил разобраться для начало в одном, а если потом нужно будет другие освою. 

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

В моей компании только начинают осваивать xilinx, а на линукс так вообще никого, по этому и спросить не у кого кроме как на форуме.. 

Буду крайне признателен если поможете разобраться.

Спасибо. 

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


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

1. Хотите перформанса - пользуйте xdma

2. По драйверу - читать первоисточник и смотреть исходники AR 65444

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


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

27 минут назад, gosha-z сказал:

1. Хотите перформанса - пользуйте xdma

2. По драйверу - читать первоисточник и смотреть исходники AR 65444

спасибо.

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

Какой выбирать вариант Types of DMA mappings при написании драйвера, правильно ли составлена блок диаграмма в вивадо (пусть даже относительно cdma), куда записывать адрес dma выделенный драйвером (в регистры cdma или pcie) и какой адрес (dma_addr_t или буфера который передаётся в аргумент при использование dma_map_single)?

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

 

Начну конечно же с создания новой блок диаграммы c xdma, но если там что то не так сделаю, то копать драйвер можно до посинения, но он так и не заработает... 

я не прошу исчерпывающего решения из коробки, просто обсудить детали

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


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

1 hour ago, Drakonof said:

Начну конечно же с создания новой блок диаграммы c xdma,

Вот и начните. Оставьте только xdma+interconnect+mig о добейтесь, чтобы оно заработало.

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


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

23 hours ago, gosha-z said:

1. Хотите перформанса - пользуйте xdma

2. По драйверу - читать первоисточник и смотреть исходники AR 65444

Под windows нормальный драйвер где-то можно взять? В stream режиме xdma AR65444 почему-то даёт 200 мбайт в секунду приём и 1600 - передачу. Как-то совсем уж печально. Jungo Windriver с той же прошивкой вообще завис (у него тестовый софт на qt есть для пробы).

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


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

41 minutes ago, dmitry-tomsk said:

Под windows нормальный драйвер где-то можно взять?

Нигде.Об это уже миллион копий сломано. Я пытался в этом разобраться. Подозреваю, что проблема в том, что Windows не умеет маппить kernel memory в user memory (нет аналога mmap), поэтому всегда время тратится на copy to/from user. Ну и плюс никому неохота тратить примерно $600/год на EV сертификат. 

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


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

1 hour ago, gosha-z said:

Нигде.Об это уже миллион копий сломано. Я пытался в этом разобраться. Подозреваю, что проблема в том, что Windows не умеет маппить kernel memory в user memory (нет аналога mmap), поэтому всегда время тратится на copy to/from user. Ну и плюс никому неохота тратить примерно $600/год на EV сертификат. 

А почему тогда на передачу скорость хорошая? Да и по слухам через DDR и на приём она хорошая (на моей плате нет DDR, чтобы проверить), а в stream режиме какая-то недоделка.

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


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

В 19.04.2020 в 12:22, gosha-z сказал:

Вот и начните. Оставьте только xdma+interconnect+mig о добейтесь, чтобы оно заработало.

не могу понять, у xdma можно поставить частоту 250 или 125МГц, но на плате только 200 для ядра. Даже относительно AC701 проект не собирается..

 

может попробуем разобраться с моей конфигурацией? если честно я был бы очень рад не начинать всё с начала и довести до конца то что уже есть

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

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


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

2 hours ago, Drakonof said:

у xdma можно поставить частоту 250 или 125МГц, но на плате только 200 для ядра.

Для вас великая проблема сделать 125 из 200?

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


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

6 часов назад, gosha-z сказал:

Для вас великая проблема сделать 125 из 200?

Нет что Вы) просто разбираться с новыми трудностями вместо старых которые всё равно никуда не денутся очень не охота. Буду пытаться через xdma что то сделать, хотя проект даже еще не собрался. 

Но а вообще, есть вероятность что AC701 сама по себе не позволяет работать через dma с хостом? (вопрос конечно может показаться глупым, но, если позволите, я сошлюсь на неопытность)

 

Спасибо что Вы еще здесь.

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

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


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

Не могу разобраться с ошибкой 

[DRC REQP-49] connects_GTGREFCLK0_ACTIVE_connects_GTGREFCLK1_ACTIVE: GTPE2_COMMON cell xdma_p_i/xdma_0/inst/xdma_p_xdma_0_0_pcie2_to_pcie3_wrapper_i/pcie2_ip_i/inst/inst/gt_top_i/pipe_wrapper_i/pipe_lane[0].pipe_quad.gt_common_enabled.gt_common_int.gt_common_i/qpll_wrapper_i/gtp_common.gtpe2_common_i: Use of the GTGREFCLK is reserved for test purposes only. This has the lowest performance of the available clocking methods and can degrade transceiver performance.
 

при этом critical warnings


[Common 17-55] 'set_property' expects at least one object. ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":6]
[Common 17-55] 'set_property' expects at least one object. ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":8]
[Common 17-55] 'set_property' expects at least one object. ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":10]
[Common 17-55] 'set_property' expects at least one object. ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":12]
[Common 17-55] 'set_property' expects at least one object. ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":15]
[Vivado 12-2285] Cannot set LOC property of instance 'xdma_p_i/refclk_ibuf'... xdma_p_i/refclk_ibuf is not a leaf level instance ["C:/workspace_vivado_2019_1/xdma_p.srcs/constrs_1/new/pin.xdc":19]
 

 

set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n]
set_property LOC M20 [get_ports sys_rst_n]
set_property PULLUP true [get_ports sys_rst_n]

# PCIe Lane 0
set_property LOC GTPE2_CHANNEL_X0Y7 [get_cells {xdma_p_i/xdma_0/inst/gt_top_i/pipe_wrapper_i/pipe_lane[0].gt_wrapper_i/gtp_channel.gtpe2_channel_i}]
# PCIe Lane 1
set_property LOC GTPE2_CHANNEL_X0Y6 [get_cells {xdma_p_i/xdma_0/inst/gt_top_i/pipe_wrapper_i/pipe_lane[1].gt_wrapper_i/gtp_channel.gtpe2_channel_i}]
# PCIe Lane 2
set_property LOC GTPE2_CHANNEL_X0Y5 [get_cells {xdma_p_i/xdma_0/inst/gt_top_i/pipe_wrapper_i/pipe_lane[2].gt_wrapper_i/gtp_channel.gtpe2_channel_i}]
# PCIe Lane 3
set_property LOC GTPE2_CHANNEL_X0Y4 [get_cells {xdma_p_i/xdma_0/inst/gt_top_i/pipe_wrapper_i/pipe_lane[3].gt_wrapper_i/gtp_channel.gtpe2_channel_i}]

# GTP Common Placement
set_property LOC GTPE2_COMMON_X0Y1 [get_cells {xdma_p_i/xdma_0/inst/gt_top_i/pipe_wrapper_i/pipe_lane[0].pipe_quad.gt_common_enabled.gt_common_int.gt_common_i/qpll_wrapper_i/gtp_common.gtpe2_common_i}]

 

мой xdc

set_property LOC IBUFDS_GTE2_X0Y3 [get_cells xdma_p_i/refclk_ibuf]

set_property LOC F11 [get_ports sys_clk_p]
set_property LOC E11 [get_ports sys_clk_n]

set_property LOC C12 [get_ports {pcie_rx_n[0]}]
set_property LOC D12 [get_ports {pcie_rx_p[0]}]
set_property LOC C10 [get_ports {pcie_tx_n[0]}]
set_property LOC D10 [get_ports {pcie_tx_p[0]}]

set_property LOC A13 [get_ports {pcie_rx_n[1]}]
set_property LOC B13 [get_ports {pcie_rx_p[1]}]
set_property LOC A9 [get_ports {pcie_tx_n[1]}]
set_property LOC B9 [get_ports {pcie_tx_p[1]}]

set_property LOC C14 [get_ports {pcie_rx_n[2]}]
set_property LOC D14 [get_ports {pcie_rx_p[2]}]
set_property LOC C8 [get_ports {pcie_tx_n[2]}]
set_property LOC D8 [get_ports {pcie_tx_p[2]}]

set_property LOC A11 [get_ports {pcie_rx_n[3]}]
set_property LOC B11 [get_ports {pcie_rx_p[3]}]
set_property LOC A7 [get_ports {pcie_tx_n[3]}]
set_property LOC B7 [get_ports {pcie_tx_p[3]}]

#0
set_property PACKAGE_PIN M26 [get_ports calib_led]
set_property IOSTANDARD LVCMOS33 [get_ports calib_led]

#1
set_property PACKAGE_PIN T24 [get_ports link_led]
set_property IOSTANDARD LVCMOS33 [get_ports link_led]

При этом если сделать open ip example design и прописать в .xdc 

set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n]
set_property LOC M20 [get_ports sys_rst_n]
set_property PULLUP true [get_ports sys_rst_n]

set_property LOC IBUFDS_GTE2_X0Y3 [get_cells refclk_ibuf]
set_property LOC F11 [get_ports sys_clk_p]
set_property LOC E11 [get_ports sys_clk_n]

то пример собирается, не могу понять что моему проекту нужно.

xdma_p.pdf

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

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


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

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

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

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

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

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

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

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

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

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