1891ВМ12Я 0 5 февраля, 2017 Опубликовано 5 февраля, 2017 · Жалоба Есть полностью рабочий обмен на Cyclone IV GTX на чтение и запись с достаточной скоростью порядка 100 Мбайт/с. Однако есть одна проблема - пришлось захардкодить номер bus-device-function (BDF) в виде константы 16'h0200. Соответственно, если вставить такую карточку в другой слот она очевидно работать не будет. Чтобы работало в любом разъеме любого компьютера - нужно получать свой BDF динамически. Из документации я вижу Configuration Space Register Access Timing. Там говорят что по фронтам на pld_clk будет инкрементироваться адрес tl_cfg_add и выводиться данные по этому адресу на шину tl_cfg_ctl. На адресе F сидит то что мне нужно: cfg_busdev[12:0]. reg [3:0] cfg_clock; wire [3:0] cfg_addr; wire [31:0] cfg_data; initial cfg_clock = 0; pcie_core pcie( // ... .pld_clk(cfg_clock[3]), .tl_cfg_add(cfg_addr), .tl_cfg_ctl(cfg_data), // ... ); reg [15:0] bdf; initial bdf = 16'h0200; always @(posedge core_clk_out) begin cfg_clock <= cfg_clock + 1; if(cfg_addr == 4'hF) bdf <= {cfg_data[12:0], 3'b0} Вроде правильно, через делитель задается pld_clk(cfg_clock[3]) и соответственно должен инкрементиться cfg_addr. Когда он станет 4'hF я ловлю нужный bus-device, а device у меня ноль. Однако через signal tap я вижу что пакеты у меня шастают с нулевым BDF и ничего не работает, кажется эта шина не работает вовсе. Там ли я смотрю BDF? Есть ли способ проще, не лежит ли BDF где-то готовенький? А может возможен обмен и вовсе с нулевым BDF? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novartis 0 5 февраля, 2017 Опубликовано 5 февраля, 2017 · Жалоба Я поступил так, создал регистр в ПЛИС, при запуске своей проги по PCIE передаю BDF в этот регистр. Потом когда уже начинается работа с платой, ПЛИСка псылает пакеты с этим BDF. То есть как бы ваш первый вариант, но все же перекомпилить свою программу на си проще, чем проект в квартусе. Опять же в программе с оконным интерфейсом можно сделать настроечное поле для ввода BDF. А до шины tl_cfg_ctl так и не добрался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 6 февраля, 2017 Опубликовано 6 февраля, 2017 · Жалоба Я поступил так, создал регистр в ПЛИС, при запуске своей проги по PCIE передаю BDF в этот регистр. Потом когда уже начинается работа с платой, ПЛИСка псылает пакеты с этим BDF. То есть как бы ваш первый вариант, но все же перекомпилить свою программу на си проще, чем проект в квартусе. Опять же в программе с оконным интерфейсом можно сделать настроечное поле для ввода BDF. А до шины tl_cfg_ctl так и не добрался. Нет, извините, это жутчайший костыль, я на такое пойти никак не могу :) Надеюсь на другие ответы и варианты. К слову, в Lattice (возможно и у Xilinx) BDF доступен как сигналы прямо из корки без всяких хитростей... Я привел пример с tl_cfg_ctl - допустимо ли работать на такой поделенной частоте? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 6 февраля, 2017 Опубликовано 6 февраля, 2017 · Жалоба Сам же отвечу на свой вопрос. После долгих разбирательств удалось решить проблему. Просто частота pld_clk должна быть допустим 125 МГц, для pld_clk я взял core_clk_out которое вываливается из PCI-E core. Собственно вижу что теперь карточка работает в любом слоте, без костылей ввиду регистра BDF :) Кто еще не сделал так, перенимайте :) Правда, глядя на тайминги в даташите, у меня есть некоторые сомнения в отсутствии метастабильностей в этом месте, что-то не так с этим pld_clk. Надо будет потом забуриться поглубже в доку. upd: А вот и текст из доки: The pld_clk input clock pin is typically connected to the core_clk_out output clock pin. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novartis 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба А зачем надо было делить core_clk_out на 16? ... .pld_clk(cfg_clock[3]), ... always @(posedge core_clk_out) begin cfg_clock <= cfg_clock + 1; ... Вы же в этой теме https://electronix.ru/forum/index.php?showtopic=138904 выложили свой вариант подключения pcie корки, и там .pld_clk(core_clk_out). Как говорится: работает - не трогай. Вот и я свой костыль пока трогать не буду Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 7 февраля, 2017 Опубликовано 7 февраля, 2017 · Жалоба А зачем надо было делить core_clk_out на 16?Чисто из привычки, не люблю когда всё на максимальной частоте напрягается. Оказалось на чуть меньшей оно не работает вовсе. А то, о чем я переживал, оно само внутри частота делится и значения эти конфигурационных регистров не на 125 МГц вылезает, а на во много раз меньшей. Вот и я свой костыль пока трогать не буду Да, наверное не стоит. Хотя по факту - 5 строчек кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться