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

    

Добрый день. Есть отладочная плата с kintex7 (xc7k160t) Mercury_PE1 c Mercury_KX1. использую и ISE и Vivado

Требуется организовать передачу данных из плис в компьютер по pcie.

Для начала хочу, чтобы устройство хоть как-то обозначилось на компьютере, для этого конфигурирую ядро без изменений, сразу по умолчанию, и компилирую заголовочный xilinx_pcie_2_1_ep_7x.vhd

Но на компьютере тишина, в чипскоп завел тактовые и осцилографом смотрел на плате - нет входной частоты для pcie, и соответсвенно ничего не работает.

Подскажите пожалуйста, что делаю не так, что упустил?

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


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

Приветствую!

 

Для начала нужно убедится что правильно назначены пины в constrain файле.

 

Многие материнки если в течении 100 ms после reset не обнаружили PCIe устройство могут отключать ref clk на этот слот для экономии.

Так что смотреть clk осцилографом надо сразу после reset.

 

Удачи! Rob.

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


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

Подскажите пожалуйста, что делаю не так, что упустил?

Я могу ошибаться, но вроде как есть возможность работы PCI-E без клока от материнской платы, хотя рекомендуют его всё же брать, иначе в режимах с spread spectrum запас может быть предельно мал. Как-то так.

Соответственно, это не причина что не работает, правильно подсказывают - может пины неверно назначены, я бы смотрел как они настроены в примере к плате. Кроме того, так как проект почти пустой, есть вероятность что компилятор просто выкинул всю логику. Вроде есть и прием и передача в таких проектах, но тем не менее, мне попадалось и такое - если нет задействования "внутриплисных" интерфейсов то ядро вычистилось под ноль - тоже советую проверить.

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


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

Мне думалось, что пример должен сразу отрабатывать.

В настройках выбирается внутренний аппаратный блок, генерируется constrain. Как я понимаю, там должны быть уже указаны задействованые пины, и не требуется вносить изменения?

 

Вот ссылка на мой UCF

https://www.dropbox.com/s/5yv8p8lz4y0uybm/m...x1_top.ucf?dl=0

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

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


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

Дело не только в ref clk. Устройство должно быть готово через 100мс, чтобы успешно пройти enumeration, иначе до свидания, даже если ref clk с матери не используется.

 

ТС, убедитесь, что успеваете сконфигурироваться. Если не успеваете, то можно питать плату отдельно от компа, конфигурировать её, потом выполнить перезагрузку компа. Для первых тестов будет достаточно, а потом разберётесь, почему не успеваете. Скорее всего изменение схемы конфигурации ПЛИС + увеличение частоты решат проблему.

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

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


Ссылка на сообщение
Поделиться на другие сайты
Мне думалось, что пример должен сразу отрабатывать.

В настройках выбирается внутренний аппаратный блок, генерируется constrain. Как я понимаю, там должны быть уже указаны задействованые пины, и не требуется вносить изменения?

Нет, пины надо править под вашу плату.

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

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


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

Приветствую!

 

Дело не только в ref clk. Устройство должно быть готово через 100мс, чтобы успешно пройти enumeration, иначе до свидания, даже если ref clk с матери не используется.

 

ТС, убедитесь, что успеваете сконфигурироваться. Если не успеваете, то можно питать плату отдельно от компа, конфигурировать её, потом выполнить перезагрузку компа. Для первых тестов будет достаточно, а потом разберётесь, почему не успеваете. Скорее всего изменение схемы конфигурации ПЛИС + увеличение частоты решат проблему.

 

На начальном этапе это не столь важно - enumeration происходит при каждом reset материнки. Так что если и не успели после power on то после следующего reset FPGA уже сконфигурированна.

 

Удачи! Rob.

 

 

 

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


Ссылка на сообщение
Поделиться на другие сайты
Мне думалось, что пример должен сразу отрабатывать.
Ого... А Вы компьютер с этой платой перезагружаете перед попытками обнаружить устройство? Я бы под это дело отдельный комп выделил. Книга по теме прочитана? Мне вот такая нравится "PCI Express Technology. Comprehensive Guide to Generations 1.x, 2.x, 3.0", правда она дорогая, но... ;) Однако и ее, как ни странно, недостаточно для полного понимания, особенно со стороны хоста, драйвера и BIOS (если есть).

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


Ссылка на сообщение
Поделиться на другие сайты
Нет, пины надо править под вашу плату.

Кто-нибудь может скинуть название плис, и констрейн файл, чтобы я разобрался как оно было подключено. (лучше конечно когда использовалось ядро 7 серии)

А то в интернете сколько находил, примерно так же стандартно, нет конкретного упоминания той или иной ноги

 

У меня есть отладочная плата как выше писал, программа на флешке записана, в биосе убрал всякие энергосбережения, попробовал вначале запитать плату, чтобы программа подгрузилась и инициализировалась, после включаю компьютер. Но результата ноль пока, тоже грешу на пины, смущает что не требуется указывать конкретные ноги (как в ддр ядре например), но нет примера чтоб узнать как правильно, по даташитам просто компилируют, и якобы ядро конфигурируется на аппаратный блок pci-e конкретно выбранной плис, и соответственно ноги настроены.

Есть еще конечное устройство(с такой же плис) для которого поднимается pci-e, оно подключено по pci-e кабелю, и там тоже я вначале питание подаю, а потом ПК включаю, но результат пока тот-же.

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

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


Ссылка на сообщение
Поделиться на другие сайты
Но результата ноль пока, тоже грешу на пины, смущает что не требуется указывать конкретные ноги (как в ддр ядре например)

 

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

 

Например вместо перечисления ног можно задать положение буфера так:

set_property LOC IBUFDS_GTE2_X0Y0 [get_cells refclk_ibuf]

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


Ссылка на сообщение
Поделиться на другие сайты
В файлах ограничений может использоваться привязка к координатам конкретного блока, неявно она же и задает ножки, т.к. конкретный блок имеет конкретное фиксированное подключение.

 

Например вместо перечисления ног можно задать положение буфера так:

set_property LOC IBUFDS_GTE2_X0Y0 [get_cells refclk_ibuf]

 

значит ядро норм генерирует

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


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

Ядро генерируется корректно, но наверняка не для вашей платы.

Возьмите схемы мезонина и базовой платы и выясните, к каким пинам ПЛИС подсоединены сброс (PERST), клок и лейны PCI-e. Соответственно отредактикуйте ucf / xdc и наступит счастье.

 

Вот эти строки в вашем ucf на чем основаны? И почему не задан LOC для sys_rst_n?

 

NET "sys_rst_n" TIG;
NET "sys_rst_n" IOSTANDARD = LVCMOS18 | PULLUP | NODELAY;

INST "refclk_ibuf" LOC = IBUFDS_GTE2_X0Y3;

INST "pcie_7x_vhdl_i/gt_top_i/pipe_wrapper_i/pipe_lane[0].gt_wrapper_i/gtx_channel.gtxe2_channel_i" LOC = GTXE2_CHANNEL_X0Y7;

INST "pcie_7x_vhdl_i/pcie_top_i/pcie_7x_i/pcie_block_i" LOC = PCIE_X0Y0;

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


Ссылка на сообщение
Поделиться на другие сайты
Ядро генерируется корректно, но наверняка не для вашей платы.

Возьмите схемы мезонина и базовой платы и выясните, к каким пинам ПЛИС подсоединены сброс (PERST), клок и лейны PCI-e. Соответственно отредактикуйте ucf / xdc и наступит счастье.

 

Вот эти строки в вашем ucf на чем основаны? И почему не задан LOC для sys_rst_n?

 

NET "sys_rst_n" TIG;
NET "sys_rst_n" IOSTANDARD = LVCMOS18 | PULLUP | NODELAY;

INST "refclk_ibuf" LOC = IBUFDS_GTE2_X0Y3;

INST "pcie_7x_vhdl_i/gt_top_i/pipe_wrapper_i/pipe_lane[0].gt_wrapper_i/gtx_channel.gtxe2_channel_i" LOC = GTXE2_CHANNEL_X0Y7;

INST "pcie_7x_vhdl_i/pcie_top_i/pcie_7x_i/pcie_block_i" LOC = PCIE_X0Y0;

 

При конфигурации выбран X0Y0 (ну для х1 вариантов то и нет), и все это из примера, про ресет тоже задумывался, sys_rst_n подключить к PERST ?

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


Ссылка на сообщение
Поделиться на другие сайты
При конфигурации выбран X0Y0 (ну для х1 вариантов то и нет), и все это из примера, про ресет тоже задумывался, sys_rst_n подключить к PERST ?

Еще раз: возьмите схемы ваших плат и составьте ucf согласно этим схемам. Авторам примера генерации ядра неизвестно, на какую плату вы генерируете ядро. Если бы это была родная отладочная плата KC705 - тогда да, ее распиновка Xilinx-у известна.

Ну а про вашу откуда он должен узнать, если не от вас?

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


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

Что-то пересмотрел несколько примеров ucf для разных плат, и где как.

Подключил sys_rst к светодиоду и user_rst. При перезагрузке sys_rst мигает, но user_rst постоянно в 1( не горит), а для успешной инициализации как понимаю должен в 0 выставится.

Ниже прилагаю поправленный ucf, добавил пин с разъема sys_rst.

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

 

NET "sys_rst_n" TIG;
NET "sys_rst_n" LOC = M20 | IOSTANDARD = LVCMOS33 | PULLUP | NODELAY;
#INST "refclk_ibuf" LOC = IBUFDS_GTE2_X0Y3;
# PCIe Lane 0
INST "pcie_7x_v1_11_i/gt_top_i/pipe_wrapper_i/pipe_lane[0].gt_wrapper_i/gtx_channel.gtxe2_channel_i" LOC = GTXE2_CHANNEL_X0Y7;
INST "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_block_i" LOC = PCIE_X0Y0;
#
# BlockRAM placement
#
INST "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_bram_top/pcie_brams_rx/brams[3].ram/use_tdp.ramb36/ramb_bl.ramb36_dp_bl.ram36_bl" LOC = RAMB36_X5Y35;
INST "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_bram_top/pcie_brams_rx/brams[2].ram/use_tdp.ramb36/ramb_bl.ramb36_dp_bl.ram36_bl" LOC = RAMB36_X4Y36;
INST "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_bram_top/pcie_brams_rx/brams[1].ram/use_tdp.ramb36/ramb_bl.ramb36_dp_bl.ram36_bl" LOC = RAMB36_X4Y35;
INST "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_bram_top/pcie_brams_rx/brams[0].ram/use_tdp.ramb36/ramb_bl.ramb36_dp_bl.ram36_bl" LOC = RAMB36_X4Y34;
INST "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_bram_top/pcie_brams_tx/brams[0].ram/use_tdp.ramb36/ramb_bl.ramb36_dp_bl.ram36_bl" LOC = RAMB36_X4Y33;
INST "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_bram_top/pcie_brams_tx/brams[1].ram/use_tdp.ramb36/ramb_bl.ramb36_dp_bl.ram36_bl" LOC = RAMB36_X4Y32;
INST "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_bram_top/pcie_brams_tx/brams[2].ram/use_tdp.ramb36/ramb_bl.ramb36_dp_bl.ram36_bl" LOC = RAMB36_X4Y31;
INST "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_bram_top/pcie_brams_tx/brams[3].ram/use_tdp.ramb36/ramb_bl.ramb36_dp_bl.ram36_bl" LOC = RAMB36_X4Y30;
###############################################################################
# Timing Constraints
###############################################################################
NET "sys_clk" TNM_NET = "SYSCLK";
NET "ext_clk.pipe_clock_i/clk_125mhz" TNM_NET = "CLK_125";
NET "ext_clk.pipe_clock_i/clk_250mhz" TNM_NET = "CLK_250";
NET "ext_clk.pipe_clock_i/userclk1" TNM_NET = "CLK_USERCLK";
NET "ext_clk.pipe_clock_i/userclk2" TNM_NET = "CLK_USERCLK2";
TIMESPEC "TS_SYSCLK"  = PERIOD "SYSCLK" 100 MHz HIGH 50 %;
TIMESPEC "TS_CLK_125"  = PERIOD "CLK_125" TS_SYSCLK*1.25 HIGH 50 % PRIORITY 1;
#TIMESPEC "TS_CLK_250" = PERIOD "CLK_250" TS_SYSCLK*2.5 HIGH 50 % PRIORITY 2;
TIMESPEC "TS_CLK_USERCLK" = PERIOD "CLK_USERCLK" TS_SYSCLK/1.6 HIGH 50 %;
TIMESPEC "TS_CLK_USERCLK2" = PERIOD "CLK_USERCLK2" TS_SYSCLK/1.6 HIGH 50 %;

NET "sys_clk_n"                 LOC =  "D5" | IOSTANDARD = "LVDS"; #| DIFF_TERM = "FALSE";
NET "sys_clk_p"                 LOC =  "D6" | IOSTANDARD = "LVDS";# | DIFF_TERM = "FALSE";

INST "ext_clk.pipe_clock_i/mmcm_i"  LOC = MMCME2_ADV_X0Y2;
PIN "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_block_i.PLPHYLNKUPN" TIG;
PIN "pcie_7x_v1_11_i/pcie_top_i/pcie_7x_i/pcie_block_i.PLRECEIVEDHOTRST" TIG;
PIN "ext_clk.pipe_clock_i/mmcm_i.RST" TIG;
NET "pcie_7x_v1_11_i/gt_top_i/pipe_wrapper_i/user_resetdone*" TIG;
NET "ext_clk.pipe_clock_i/pclk_sel" TIG;
NET "pcie_7x_v1_11_i/gt_top_i/pipe_wrapper_i/pipe_lane[0].pipe_rate.pipe_rate_i/*" TNM_NET = FFS "MC_PIPE";
TIMESPEC "TS_PIPE_RATE" = FROM "MC_PIPE" TS_CLK_USERCLK*0.5;
#NET "pcie_7x_v1_11_i/gt_top_i/pipe_wrapper_i/pipe_reset.pipe_reset_i/cpllreset" TIG;

И еще подскажите, пожалуйста, программу для отслеживания pci-e устройства (win7 x64)

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти