Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: INPUT_SETUP в Lattice Diamond
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Среды разработки - обсуждаем САПРы
ims
Добрый день!

Простая задача: ввод данных с АЦП в 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?
Stewart Little
Про CLOCK_TO_OUT preference , CLKSKEWDIFF и прочее: Timing Closure 3.10
Вы этот документ смотрели?
ims
Цитата(Stewart Little @ Feb 19 2018, 14:55) *
Про CLOCK_TO_OUT preference , CLKSKEWDIFF и прочее: Timing Closure 3.10
Вы этот документ смотрели?

Timing Closure 3.10 смотрел. Зачем CLKSKEWDIFF в данном случае? CLOCK_TO_OUT констрейнит выход, вопрос про вход...

Собственно, как раз CLOCK_TO_OUT сделан правильно — там есть параметр CLKOUT PORT, который позволяет указать, с какой ножки генерируется клок для внешнего мира. Как раз такого параметра явно не хватает INPUT_SETUP...
Stewart Little
Пока в голову приходить только что-то типа такого:
Код
INPUT_SETUP PORT "adc_data*" INPUT_DELAY ... ns HOLD ... ns CLKPORT "adc_clk";

где INPUT_DELAY - это сумма задержки вывода клока от PLL наружу, board trace и clock-to-output АЦП.
yes
задайте в Synplify sdc, а он сгенерит lpf файл для p&r, можно его либо руками подправить (я так делал), либо загонять напрямую - наверно, в даймоновской среде это сделано автоматом при использовании batch mode, но я предпочитаю синтез выполнять в симплифайной оболочке, поэтому не знаю как
ims
Цитата(yes @ Feb 19 2018, 17:02) *
задайте в 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 не понимает.

Цитата(Stewart Little @ Feb 19 2018, 16:50) *
Пока в голову приходить только что-то типа такого:
Код
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
кроме CLKPORT есть CLKNET - пробовали?
мне казалось, что из sdc генерится правильный lpf....
ims
Цитата(yes @ Feb 20 2018, 18:36) *
кроме 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 до ножки для сгенерированного клока.

Во вложении архив проекта.
АлексАнс
Цитата(ims @ Feb 19 2018, 12:32) *
Добрый день!

Простая задача: ввод данных с АЦП в 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?

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.