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

    

INPUT_SETUP в Lattice Diamond

Добрый день!

 

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

 

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


Ссылка на сообщение
Поделиться на другие сайты
Про CLOCK_TO_OUT preference , CLKSKEWDIFF и прочее: Timing Closure 3.10

Вы этот документ смотрели?

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

 

Собственно, как раз CLOCK_TO_OUT сделан правильно — там есть параметр CLKOUT PORT, который позволяет указать, с какой ножки генерируется клок для внешнего мира. Как раз такого параметра явно не хватает INPUT_SETUP...

 

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


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

Пока в голову приходить только что-то типа такого:

INPUT_SETUP PORT "adc_data*" INPUT_DELAY ... ns HOLD ... ns CLKPORT "adc_clk";

где INPUT_DELAY - это сумма задержки вывода клока от PLL наружу, board trace и clock-to-output АЦП.

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


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

задайте в Synplify sdc, а он сгенерит lpf файл для p&r, можно его либо руками подправить (я так делал), либо загонять напрямую - наверно, в даймоновской среде это сделано автоматом при использовании batch mode, но я предпочитаю синтез выполнять в симплифайной оболочке, поэтому не знаю как

 

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


Ссылка на сообщение
Поделиться на другие сайты
задайте в 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. Криво это, но похоже нормального способа нет. Странно, задача ведь совершенно стандартная...

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


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

кроме CLKPORT есть CLKNET - пробовали?

мне казалось, что из sdc генерится правильный lpf....

 

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


Ссылка на сообщение
Поделиться на другие сайты
кроме 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

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


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

 

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

 

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


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

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

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

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

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

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

Войти

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

Войти