|
|
  |
kintex7+pci-e |
|
|
|
Jan 19 2017, 08:39
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 30-01-15
Пользователь №: 84 837

|
Добрый день. Есть отладочная плата с kintex7 (xc7k160t) Mercury_PE1 c Mercury_KX1. использую и ISE и Vivado Требуется организовать передачу данных из плис в компьютер по pcie. Для начала хочу, чтобы устройство хоть как-то обозначилось на компьютере, для этого конфигурирую ядро без изменений, сразу по умолчанию, и компилирую заголовочный xilinx_pcie_2_1_ep_7x.vhd Но на компьютере тишина, в чипскоп завел тактовые и осцилографом смотрел на плате - нет входной частоты для pcie, и соответсвенно ничего не работает. Подскажите пожалуйста, что делаю не так, что упустил?
|
|
|
|
|
Jan 19 2017, 10:00
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(exigo @ Jan 19 2017, 11:39)  Но на компьютере тишина, в чипскоп завел тактовые и осцилографом смотрел на плате - нет входной частоты для pcie, и соответсвенно ничего не работает. Подскажите пожалуйста, что делаю не так, что упустил? Я могу ошибаться, но вроде как есть возможность работы PCI-E без клока от материнской платы, хотя рекомендуют его всё же брать, иначе в режимах с spread spectrum запас может быть предельно мал. Как-то так. Соответственно, это не причина что не работает, правильно подсказывают - может пины неверно назначены, я бы смотрел как они настроены в примере к плате. Кроме того, так как проект почти пустой, есть вероятность что компилятор просто выкинул всю логику. Вроде есть и прием и передача в таких проектах, но тем не менее, мне попадалось и такое - если нет задействования "внутриплисных" интерфейсов то ядро вычистилось под ноль - тоже советую проверить.
--------------------
|
|
|
|
|
Jan 19 2017, 10:24
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 30-01-15
Пользователь №: 84 837

|
Мне думалось, что пример должен сразу отрабатывать. В настройках выбирается внутренний аппаратный блок, генерируется constrain. Как я понимаю, там должны быть уже указаны задействованые пины, и не требуется вносить изменения? Вот ссылка на мой UCF https://www.dropbox.com/s/5yv8p8lz4y0uybm/m...x1_top.ucf?dl=0
Сообщение отредактировал exigo - Jan 19 2017, 10:25
|
|
|
|
|
Jan 19 2017, 10:59
|
Местный
  
Группа: Участник
Сообщений: 221
Регистрация: 6-07-12
Пользователь №: 72 653

|
Дело не только в ref clk. Устройство должно быть готово через 100мс, чтобы успешно пройти enumeration, иначе до свидания, даже если ref clk с матери не используется.
ТС, убедитесь, что успеваете сконфигурироваться. Если не успеваете, то можно питать плату отдельно от компа, конфигурировать её, потом выполнить перезагрузку компа. Для первых тестов будет достаточно, а потом разберётесь, почему не успеваете. Скорее всего изменение схемы конфигурации ПЛИС + увеличение частоты решат проблему.
Сообщение отредактировал Inanity - Jan 19 2017, 11:04
|
|
|
|
|
Jan 19 2017, 11:37
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 8-11-11
Из: Рязань
Пользователь №: 68 183

|
Цитата(exigo @ Jan 19 2017, 13:24)  Мне думалось, что пример должен сразу отрабатывать. В настройках выбирается внутренний аппаратный блок, генерируется constrain. Как я понимаю, там должны быть уже указаны задействованые пины, и не требуется вносить изменения? Нет, пины надо править под вашу плату.
Сообщение отредактировал Lixlex - Jan 19 2017, 11:38
|
|
|
|
|
Jan 19 2017, 11:49
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(Inanity @ Jan 19 2017, 13:59)  Дело не только в ref clk. Устройство должно быть готово через 100мс, чтобы успешно пройти enumeration, иначе до свидания, даже если ref clk с матери не используется.
ТС, убедитесь, что успеваете сконфигурироваться. Если не успеваете, то можно питать плату отдельно от компа, конфигурировать её, потом выполнить перезагрузку компа. Для первых тестов будет достаточно, а потом разберётесь, почему не успеваете. Скорее всего изменение схемы конфигурации ПЛИС + увеличение частоты решат проблему. На начальном этапе это не столь важно - enumeration происходит при каждом reset материнки. Так что если и не успели после power on то после следующего reset FPGA уже сконфигурированна. Удачи! Rob.
|
|
|
|
|
Jan 19 2017, 12:18
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(exigo @ Jan 19 2017, 13:24)  Мне думалось, что пример должен сразу отрабатывать. Ого... А Вы компьютер с этой платой перезагружаете перед попытками обнаружить устройство? Я бы под это дело отдельный комп выделил. Книга по теме прочитана? Мне вот такая нравится "PCI Express Technology. Comprehensive Guide to Generations 1.x, 2.x, 3.0", правда она дорогая, но...  Однако и ее, как ни странно, недостаточно для полного понимания, особенно со стороны хоста, драйвера и BIOS (если есть).
--------------------
|
|
|
|
|
Jan 20 2017, 02:50
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 30-01-15
Пользователь №: 84 837

|
Цитата(Lixlex @ Jan 19 2017, 18:37)  Нет, пины надо править под вашу плату. Кто-нибудь может скинуть название плис, и констрейн файл, чтобы я разобрался как оно было подключено. (лучше конечно когда использовалось ядро 7 серии) А то в интернете сколько находил, примерно так же стандартно, нет конкретного упоминания той или иной ноги У меня есть отладочная плата как выше писал, программа на флешке записана, в биосе убрал всякие энергосбережения, попробовал вначале запитать плату, чтобы программа подгрузилась и инициализировалась, после включаю компьютер. Но результата ноль пока, тоже грешу на пины, смущает что не требуется указывать конкретные ноги (как в ддр ядре например), но нет примера чтоб узнать как правильно, по даташитам просто компилируют, и якобы ядро конфигурируется на аппаратный блок pci-e конкретно выбранной плис, и соответственно ноги настроены. Есть еще конечное устройство(с такой же плис) для которого поднимается pci-e, оно подключено по pci-e кабелю, и там тоже я вначале питание подаю, а потом ПК включаю, но результат пока тот-же.
Сообщение отредактировал exigo - Jan 20 2017, 03:07
|
|
|
|
|
Jan 20 2017, 04:37
|
Местный
  
Группа: Свой
Сообщений: 372
Регистрация: 14-02-06
Пользователь №: 14 339

|
Цитата(exigo @ Jan 20 2017, 05:50)  Но результата ноль пока, тоже грешу на пины, смущает что не требуется указывать конкретные ноги (как в ддр ядре например) В файлах ограничений может использоваться привязка к координатам конкретного блока, неявно она же и задает ножки, т.к. конкретный блок имеет конкретное фиксированное подключение. Например вместо перечисления ног можно задать положение буфера так: set_property LOC IBUFDS_GTE2_X0Y0 [get_cells refclk_ibuf]
|
|
|
|
|
Jan 20 2017, 06:49
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 30-01-15
Пользователь №: 84 837

|
Цитата(toshas @ Jan 20 2017, 11:37)  В файлах ограничений может использоваться привязка к координатам конкретного блока, неявно она же и задает ножки, т.к. конкретный блок имеет конкретное фиксированное подключение.
Например вместо перечисления ног можно задать положение буфера так: set_property LOC IBUFDS_GTE2_X0Y0 [get_cells refclk_ibuf] значит ядро норм генерирует
|
|
|
|
|
Jan 20 2017, 09:27
|
Знающий
   
Группа: Свой
Сообщений: 702
Регистрация: 8-06-06
Пользователь №: 17 871

|
Цитата(exigo @ Jan 20 2017, 09:49)  значит ядро норм генерирует Ядро генерируется корректно, но наверняка не для вашей платы. Возьмите схемы мезонина и базовой платы и выясните, к каким пинам ПЛИС подсоединены сброс (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;
|
|
|
|
|
Jan 20 2017, 09:40
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 30-01-15
Пользователь №: 84 837

|
Цитата(Flood @ Jan 20 2017, 16:27)  Ядро генерируется корректно, но наверняка не для вашей платы. Возьмите схемы мезонина и базовой платы и выясните, к каким пинам ПЛИС подсоединены сброс (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 ?
|
|
|
|
|
Jan 20 2017, 09:50
|
Знающий
   
Группа: Свой
Сообщений: 702
Регистрация: 8-06-06
Пользователь №: 17 871

|
Цитата(exigo @ Jan 20 2017, 12:40)  При конфигурации выбран X0Y0 (ну для х1 вариантов то и нет), и все это из примера, про ресет тоже задумывался, sys_rst_n подключить к PERST ? Еще раз: возьмите схемы ваших плат и составьте ucf согласно этим схемам. Авторам примера генерации ядра неизвестно, на какую плату вы генерируете ядро. Если бы это была родная отладочная плата KC705 - тогда да, ее распиновка Xilinx-у известна. Ну а про вашу откуда он должен узнать, если не от вас?
|
|
|
|
|
Jan 24 2017, 04:35
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 30-01-15
Пользователь №: 84 837

|
Что-то пересмотрел несколько примеров 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 - Jan 24 2017, 10:40
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|