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

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

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

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


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

Про 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....

Пробовал — по отчету видно, что задержка вывода клока не учитывается. 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?

 

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...