ims 0 19 февраля, 2018 Опубликовано 19 февраля, 2018 · Жалоба Добрый день! Простая задача: ввод данных с АЦП в MachXO2. АЦП тактируется от PLL ПЛИС: module top (input clk, output adc_clk, input [7:0] adc_data); PLL _pll (.CLKI(clk), .CLKOP(adc_clk)); reg [7:0] rdata; always @ (posedge adc_clk) begin rdata <= adc_data; // Дальше работаем с rdata... end endmodule В Quartus/TimeQuest временные ограничения для шины данных можно было бы задать так: create_generated_clock -name {adc_clk} -source [get_pins {_pll/PLLInst_0/CLKOP}] [get_ports {adc_clk}] set_input_delay -clock {adc_clk} -max [...] [get_ports {adc_data[*]}] set_input_delay -clock {adc_clk} -min [...] [get_ports {adc_data[*]}] При этом учитывается как задержка данных на входных буферах ПЛИС, так и разность времен распространения клока от выхода PLL через кристалл наружу и от выхода PLL до регистров внутри ПЛИС. В Lattice Diamond SDC не поддерживается (во всяком случае, в Place & Route и I/O Timing Analysis). Задавать временные ограничения нужно в LPF. В LPF ничего похожего на create_generated_clock нет. Аналогом set_input_delay является INPUT_SETUP. Вроде бы естественно написать: INPUT_SETUP PORT "adc_data*" ... ns HOLD ... ns CLKPORT "adc_clk"; Однако при этом, судя по отчету, в расчет берется только PADI_DEL + ROUTE данных минус ROUTE клока от PLL к регистру. Задержка вывода клока от PLL наружу не учитывается, что делает такой анализ бессмысленным. Вопрос: как правильно задать временные ограничения для этого интерфейса в Diamond? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 19 февраля, 2018 Опубликовано 19 февраля, 2018 · Жалоба Про CLOCK_TO_OUT preference , CLKSKEWDIFF и прочее: Timing Closure 3.10 Вы этот документ смотрели? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ims 0 19 февраля, 2018 Опубликовано 19 февраля, 2018 · Жалоба Про CLOCK_TO_OUT preference , CLKSKEWDIFF и прочее: Timing Closure 3.10 Вы этот документ смотрели? Timing Closure 3.10 смотрел. Зачем CLKSKEWDIFF в данном случае? CLOCK_TO_OUT констрейнит выход, вопрос про вход... Собственно, как раз CLOCK_TO_OUT сделан правильно — там есть параметр CLKOUT PORT, который позволяет указать, с какой ножки генерируется клок для внешнего мира. Как раз такого параметра явно не хватает INPUT_SETUP... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 19 февраля, 2018 Опубликовано 19 февраля, 2018 · Жалоба Пока в голову приходить только что-то типа такого: INPUT_SETUP PORT "adc_data*" INPUT_DELAY ... ns HOLD ... ns CLKPORT "adc_clk"; где INPUT_DELAY - это сумма задержки вывода клока от PLL наружу, board trace и clock-to-output АЦП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 19 февраля, 2018 Опубликовано 19 февраля, 2018 · Жалоба задайте в Synplify sdc, а он сгенерит lpf файл для p&r, можно его либо руками подправить (я так делал), либо загонять напрямую - наверно, в даймоновской среде это сделано автоматом при использовании batch mode, но я предпочитаю синтез выполнять в симплифайной оболочке, поэтому не знаю как Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ims 0 20 февраля, 2018 Опубликовано 20 февраля, 2018 · Жалоба задайте в Synplify sdc, а он сгенерит lpf файл для p&r, можно его либо руками подправить (я так делал), либо загонять напрямую - наверно, в даймоновской среде это сделано автоматом при использовании batch mode, но я предпочитаю синтез выполнять в симплифайной оболочке, поэтому не знаю как Я попробовал. Synplify из SDC сгенерировал LPF с констрейнами вида INPUT_SETUP "adc_data[7]" 40.0 NS CLKPORT = "adc_clk"; ... На это Map выдал WARNING: Semantic error in "INPUT_SETUP PORT "adc_data[7]" 40.00000 ns CLKPORT "adc_clk" ;": "adc_clk" matches no clock ports in the design. This preference has been disabled. Соответственно, дальше анализ этих констрейнов не выполнялся. Я так понимаю, в качестве CLKPORT обязательно должна быть ножка с входным внешним клоком, сгенерированные клоки CLOCK_TO_OUT не понимает. Пока в голову приходить только что-то типа такого: INPUT_SETUP PORT "adc_data*" INPUT_DELAY ... ns HOLD ... ns CLKPORT "adc_clk"; где INPUT_DELAY - это сумма задержки вывода клока от PLL наружу, board trace и clock-to-output АЦП. Ну да, против лома... Задержку вывода клока от PLL наружу даже получается удобно сосчитать в Diamond — у меня есть выходной сигнал, который выдается относительно того же adc_clk, и величина задержки, оказывается, есть в отчете соответствующего CLOCK_TO_OUT. Криво это, но похоже нормального способа нет. Странно, задача ведь совершенно стандартная... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 20 февраля, 2018 Опубликовано 20 февраля, 2018 · Жалоба кроме CLKPORT есть CLKNET - пробовали? мне казалось, что из sdc генерится правильный lpf.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ims 0 21 февраля, 2018 Опубликовано 21 февраля, 2018 · Жалоба кроме CLKPORT есть CLKNET - пробовали? мне казалось, что из sdc генерится правильный lpf.... Пробовал — по отчету видно, что задержка вывода клока не учитывается. Synplify может и старается, но в LPF это скорее всего описать нельзя. Примеров констрейнов для "FPGA-synchronous input" в материалах Lattice я не нашел. Вот синтезируемый пример: module top ( input clk, output pll_clk, input d1, input d2, input d2_clk, output reg q1, output dummy ) /* synthesis syn_useioff = 1 */; PLLa _pll (.CLKI(clk), .CLKOP(pll_clk)); // Ввод на клоке PLL ПЛИС reg rd1; always @ (posedge pll_clk) rd1 <= d1; // Ввод на внешнем клоке reg rd2; always @ (posedge d2_clk) rd2 <= d2; // Вывод на клоке PLL ПЛИС always @ (posedge pll_clk) q1 <= dummy; assign dummy = rd1 ^ rd2; endmodule LPF: BLOCK RESETPATHS; BLOCK ASYNCPATHS; INPUT_SETUP PORT "d1" 10 ns HOLD 10 ns CLKNET "pll_clk_c"; # CLKPORT "pll_clk" не работает FREQUENCY PORT "d2_clk" 20 MHz; INPUT_SETUP PORT "d2" 10 ns HOLD 10 ns CLKPORT "d2_clk"; CLOCK_TO_OUT PORT "q1" 10 ns MIN -10 ns CLKNET "pll_clk_c" CLKOUT PORT "pll_clk"; (Diamond сам создает клоки clk_c и pll_clk_c в соответствии с настройками PLL, как бы неявно выполняет derive_pll_clocks -create_base_clocks) Из post-fit отчета Trace видно следующее: 1) Для входа d1, который мы хотим тактировать сгенерированным клоком, рассчитывается PADI_DEL + ROUTE данных от ножки d1 к регистру rd1, ROUTE клока от PLL к регистру rd1, и все… Задержка сгенерированного клока от PLL к ножке и наружу не рассчитывается. Дополнительных параметров, аналогичных CLKOUT PORT для CLOCK_TO_OUT, INPUT_SETUP не поддерживает. 2) Для входа d2 с тактированием от внешнего клока на d2_clk все правильно: PADI_DEL + ROUTE данных от ножки к регистру и PADI_DEL + ROUTE клока от ножки к регистру. 3) Для выхода q1 с тактированием сгенерированным клоком тоже все правильно: ROUTE клока от PLL к регистру, ROUTE + OP0PAD_DEL от регистра к ножке, ROUTE + DOPAD_DEL от PLL до ножки для сгенерированного клока. Во вложении архив проекта. constr.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АлександрАнс 0 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба Добрый день! Простая задача: ввод данных с АЦП в MachXO2. АЦП тактируется от PLL ПЛИС: module top (input clk, output adc_clk, input [7:0] adc_data); PLL _pll (.CLKI(clk), .CLKOP(adc_clk)); reg [7:0] rdata; always @ (posedge adc_clk) begin rdata <= adc_data; О, отлично , но как перепрограммировать блок управления в Автоматизированном мониторинговом центре АМЦ 500 ПРОМ ? // Дальше работаем с rdata... end endmodule В Quartus/TimeQuest временные ограничения для шины данных можно было бы задать так: create_generated_clock -name {adc_clk} -source [get_pins {_pll/PLLInst_0/CLKOP}] [get_ports {adc_clk}] set_input_delay -clock {adc_clk} -max [...] [get_ports {adc_data[*]}] set_input_delay -clock {adc_clk} -min [...] [get_ports {adc_data[*]}] При этом учитывается как задержка данных на входных буферах ПЛИС, так и разность времен распространения клока от выхода PLL через кристалл наружу и от выхода PLL до регистров внутри ПЛИС. В Lattice Diamond SDC не поддерживается (во всяком случае, в Place & Route и I/O Timing Analysis). Задавать временные ограничения нужно в LPF. В LPF ничего похожего на create_generated_clock нет. Аналогом set_input_delay является INPUT_SETUP. Вроде бы естественно написать: INPUT_SETUP PORT "adc_data*" ... ns HOLD ... ns CLKPORT "adc_clk"; Однако при этом, судя по отчету, в расчет берется только PADI_DEL + ROUTE данных минус ROUTE клока от PLL к регистру. Задержка вывода клока от PLL наружу не учитывается, что делает такой анализ бессмысленным. Вопрос: как правильно задать временные ограничения для этого интерфейса в Diamond? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться