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

Подскажите как сделать так чтобы сигнал с ножки ПЛИС или выхода триггера приходил одновременно на D-входы нескольких триггеров, т.е. время распространения сигнала от источника до каждого триггера дожно быть максимально одинаковым.

Пробовал описать нужный сигнал как clock, но оказалась что разница в задержках колеблется до 0.8нс, хочется иметь не более 0.5нс. ПЛИС - Cyclone II.
ZASADA
а смысл? главное чтобы они относительно общего clk выдерживали setup/hold time.
Dmitriyspb
Цитата(Viwon @ Mar 18 2014, 13:16) *
Всем доброго времени суток!

Подскажите как сделать так чтобы сигнал с ножки ПЛИС или выхода триггера приходил одновременно на D-входы нескольких триггеров, т.е. время распространения сигнала от источника до каждого триггера дожно быть максимально одинаковым.

Пробовал описать нужный сигнал как clock, но оказалась что разница в задержках колеблется до 0.8нс, хочется иметь не более 0.5нс. ПЛИС - Cyclone II.


Можно попробовать использовать пины одного банка.

К примеру у Xilinx Spartan есть на каждом банке по 8 глобальных пинов. 16 из которых являются глобальными на всем доменном пространстве, а вторая половина (тоже 16) на левой и правой доменных частях.

Viwon
Цитата(ZASADA @ Mar 18 2014, 13:52) *
а смысл? главное чтобы они относительно общего clk выдерживали setup/hold time.


Это нужно для того чтобы с высокой точностью определить время прихода сигнала.
Схема следующая:
Есть 4 триггера, каждый из которых тактуется частотой 250МГц, но смещенной на 0, 90, 180 и 270 градусов, соответственно. На D-входы подается интересующий сигнал. Таким образом, по состоянию триггеров можно определить в какой четверти появился сигнал, имеем разрешающую способность около 1нс.
SM
Заведите сигнал на два соседних I/O пина, и используйте у них DDR режим, подав на клоки сигналы с PLL, сдвинутые на 90 градусов. Скорее всего, если clock skew позволит, получится что надо.

Еще можно попробовать жестко задать размещение в одном LAB и констрейны set_min_delay одновременно с set_max_delay, но, это на уровне идеи.
Viwon
Про DDR режим не совсем понял, как это работает, но если это требует перепайки, то этот вариант отпадает т.к. имею дело с готовым устройством.

А как Quartus'у сказать, чтобы он поместил триггеры в один LAB?
SM
DDR режим защелкивает два данных, один по фронту, второй по спаду. так вот и работает... Да, это требует железной доработки, "сопли" на соседний пин, если он свободен.

А указать размещение - location assignment есть, в нем есть способ указать конкрентный LAB для конкретного регистра.
Viwon
to SM
Спасибо!
Если set_*_delay ни как не повлияло, то set_location_assignment, очень даже помогло.
В один LAB все триггеры мне поместить не удалось, видимо в LAB’е не может быть больше 2х тактовых сигналов, но разместив в соседние LAB'ы, удалось добиться разницы в задержке меньше 0.2нс, в зависимости от реализации триггеров.


ZASADA
попробуйте размещать не в LAB, а в I/O Block.
Цитата
В один LAB все триггеры мне поместить не удалось, видимо в LAB’е не может быть больше 2х тактовых сигналов,


странно, на каждый LAB приходят 2 тактовых сигнала
Timmy
Цитата(ZASADA @ Mar 20 2014, 11:59) *
попробуйте размещать не в LAB, а в I/O Block.


странно, на каждый LAB приходят 2 тактовых сигнала

У второго циклона даже аппаратной поддержки DDR нет, DDR IO регистры он сам пихает в LAB.
Каждый LAB имеет два тактовых сигнала, а нам нужно четыре, два прямых и два инверсных. Инверторы клоков общие на весь LAB, так что вместить всё в один LAB никак.

На ECP2 у меня в аналогичной ситуации и аналогичным способом получилось skew 0.2-0.5нс в зависимости от везения. Там правда, ещё есть констрейн MAX_SKEW, но на разводку он почти не влияет, только на проверку, так что тоже пришлось руками фиксировать триггеры.
SM
Цитата(Timmy @ Mar 20 2014, 14:12) *
так что вместить всё в один LAB никак.


А почему? Клоков то надо именно два, двинутых на 90 град. А триггера - 4, два по posedge, два по negedge.
Timmy
Цитата(SM @ Mar 20 2014, 15:49) *
А почему? Клоков то надо именно два, двинутых на 90 град. А триггера - 4, два по posedge, два по negedge.

Надо два глобальных клока, двинутых на 90 град. А вот LAB-овских - уже четыре, так как LAB внутри себя работает только по posedge, а инвертировать клок можно только на вводе в LAB. Поскольку ввести можем только два клока в LAB, LABа надо два.
Viwon
Цитата(SM @ Mar 27 2014, 12:40) *
То, что пути исключены из временного анализа, как раз и приводит к тому, что оно как развелось, так и развелось, без какой либо оптимизации. Так что, как вариант, второй способ сделать время повторяемым, кроме ручного вставления LUT, может быть, задание жесткого set_max_delay на путь, чтобы он не давал возможностей втыкать эти feeder-ы, или жесткие set_max_delay и set_min_delay одновременно, чтобы он разводку делал в совсем жестких временных рамках...

А как правильно все это дело описать?
Вот к примеру следующий код:
CODE
module TRIGGERS(DATA, SIGNALa, CLK);
output [3:0] DATA;
input SIGNALa;
input CLK;

reg [3:0] triggers;
always @(posedge CLK)
triggers <= {4{SIGNALa}};
assign DATA = triggers;
endmodule

SDC-файл:
CODE
create_clock -name "CLK" -period 4.000ns [get_ports {CLK}]
create_clock -name "SIGNALa" -period 1.000us [get_ports {SIGNALa}]

set_clock_groups -asynchronous -group {SIGNALa}

set_max_delay 7.039ns -from [get_ports {SIGNALa}] -to triggers[*]
set_min_delay 7.035ns -from [get_ports {SIGNALa}] -to triggers[*]

SIGNALa – внешний асинхронный сигнал, не знаю как его правильно описать, описываю как асинхронный clock.
В итоге TimeQuest все проглотил, но вместо требуемых 7.035-7.039нс,
Цитата
report_path -from {SIGNALa} -to {triggers[*]} -npaths 10 -panel_name {Report Path}

выдает 6.900нс.

Проект в Quartus 13.0Нажмите для просмотра прикрепленного файла
SM
Какой же он клок? Не надо его клоком объявлять. Только set_max_delay, и все.

А вилка 7.035...7.039 не реализуема, должен быть либо холд виолейшн, либо сетап, так как min_delay считается для быстрого угла PVT, а max_delay - для медленного угла... Так что вилку min..max надо подбирать эмпирически как-то...

И еще, set_min/max_delay в ква учитывают еще и путь клока, и сетап внутреннего триггера. так что надо внимательно изучать репорт, что он туда навключал... Там много лишнего будет
Viwon
Цитата(SM @ Mar 27 2014, 14:05) *
Какой же он клок? Не надо его клоком объявлять. Только set_max_delay, и все.

В таком случае выдает "Critical Warning (332148): Timing requirements not met"
Не выполняется условие Hold(Launch Clock - n/a)
А report_path выдает 9.660нс.
Цитата(SM @ Mar 27 2014, 14:05) *
А вилка 7.035...7.039 не реализуема, должен быть либо холд виолейшн, либо сетап, так как min_delay считается для быстрого угла PVT, а max_delay - для медленного угла... Так что вилку min..max надо подбирать эмпирически как-то

9.660нс для 3х триггеров и 9.661 для четвертого.

Цитата(SM @ Mar 27 2014, 14:05) *
Только set_max_delay, и все.

Если только set_max_delay без set_min_delay. То предупреждений описаных выше нет, но задерка все равно не та
SM
Цитата(Viwon @ Mar 27 2014, 14:14) *
В таком случае выдает "Critical Warning (332148): Timing requirements not met"
Не выполняется условие Hold(Launch Clock - n/a)


Вот и подберите такие set_min/max_delay, при которых все сложится. Взяв для начала пути сетапа и холда из отчета, и дав по десятку пикосекунд в плюс для сетапа (max) и в минус для холда (min).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.