реклама на сайте
подробности

 
 
> Как использовать временные ограничения в FPGA?
Vadim_nsk
сообщение Apr 25 2017, 05:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-09-05
Из: г. Новосибирск
Пользователь №: 8 335



Работаю с FPGA Xilinx, Spartan-3e[6]
У кого-нибудь есть пример использования временных ограничений (констрейнов)? Документация то понятно. Но как на реальном примере этим всем пользоваться? Интересует что-нибудь очень простенькое, вроде захвата данных с АЦП или шины SRAM с процессором. Я всегда считал, что стробирования входных и выходных сигналов триггерами, расположенными в IOB в моменты, где данные уже устаканились (смотрел осциллографом) достаточное условие для правильного захвата данных. А также, использование клоком, порожденных от одного входного посредством DCM. Но вот столкнулся с тем, что изменение в проекте стали затрагивать правильность захвата данных с АЦП. Люди советуют использовать констрейны. Посмотрел документацию и понял, что этого не достаточно. Не хватает понимания как всем этим пользоваться. Нужны простые примеры от которых можно было бы оттолкнуться в более сложные ситуации.

1. Например, имеем АЦП с параллельной шиной и выходной клок: ADC_clk, ADC_data(11 downto 0). Я всегда смотрю на задержку данных относительно выхода клока и стробирую по фронту в безопасной зоне, имея ввиду, что задержка во входном буфере будет порядка 4 нс. И слежу, чтобы все сигналы проходили через триггеры в IOB.

2. Самый частый пример это шина с каким-нибудь контроллером. Там есть шина адреса, данных, управления. Тут тоже, просто стробирую входные сигналы сначала повышенной частотой, затем рабочей. Оба клока получаются посредством DCM, следовательно синфазны. Таким образом, снижаю задержку на перестробирование и ухожу от метастабильности. Но и тут никогда не использую констрейны, т.к. все сигналы проходят через триггеры в IOB. Говорят, этого недостаточно. А как делать правильно?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GAYVER
сообщение Apr 27 2017, 09:19
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 3-04-13
Пользователь №: 76 333



свежий пример с 6 спартана )))

CODE
#Created by Constraints Editor (xc6slx4-tqg144-3) - 2017/04/18
NET "CLK_EXT" TNM_NET = CLK_EXT;
NET "CLK_EXT" LOC = P134;
NET "CLK_EXT" IOSTANDARD = LVCMOS33;
TIMESPEC TS_CLK_EXT = PERIOD "CLK_EXT" 31.25 ns HIGH 50%;

NET "IZP" LOC = P81;
NET "IZP" IOSTANDARD = LVCMOS33;

NET "KIZP[0]" LOC = P78;
NET "KIZP[0]" IOSTANDARD = LVCMOS33;
NET "KIZP[1]" LOC = P79;
NET "KIZP[1]" IOSTANDARD = LVCMOS33;
NET "KIZP[2]" LOC = P80;
NET "KIZP[2]" IOSTANDARD = LVCMOS33;
NET "KIZP[3]" LOC = P82;
NET "KIZP[3]" IOSTANDARD = LVCMOS33;
NET "KIZP[4]" LOC = P83;
NET "KIZP[4]" IOSTANDARD = LVCMOS33;
NET "KIZP[5]" LOC = P102;
NET "KIZP[5]" IOSTANDARD = LVCMOS33;
NET "KIZP[6]" LOC = P104;
NET "KIZP[6]" IOSTANDARD = LVCMOS33;
NET "KIZP[7]" LOC = P105;
NET "KIZP[7]" IOSTANDARD = LVCMOS33;
#добавить размещение 2 разрядов КИЗП, когда будет в наличии плата!!!!!!!!!!!!!
#SPI INPUT
NET "DI_I" LOC = P43;
NET "DI_I" IOSTANDARD = LVCMOS33;
NET "DO_I" LOC = P44;
NET "DO_I" IOSTANDARD = LVCMOS33;
NET "CS_I" LOC = P45;
NET "CS_I" IOSTANDARD = LVCMOS33;
NET "SCLK_I" LOC = P50;
NET "SCLK_I" IOSTANDARD = LVCMOS33;


#SPI OUTPUT
NET "DI_O" LOC = P6;
NET "DI_O" IOSTANDARD = LVCMOS33;
NET "DO_O" LOC = P140;
NET "DO_O" IOSTANDARD = LVCMOS33;
NET "CS_O" LOC = P5;
NET "CS_O" IOSTANDARD = LVCMOS33;
NET "SCLK_O" LOC = P7;
NET "SCLK_O" IOSTANDARD = LVCMOS33;


# Termodatchik-1
NET "WIRE[1]" LOC = P100 |IOSTANDARD = LVTTL;
NET "UBUF[1]" LOC = P99;
NET "UBUF[1]" IOSTANDARD = LVCMOS33;
# Termodatchik-2
NET "WIRE[2]" LOC = P94 |IOSTANDARD = LVTTL;
NET "UBUF[2]" LOC = P93;
NET "UBUF[2]" IOSTANDARD = LVCMOS33;




#Created by Constraints Editor (xc6slx4-tqg144-3) - 2017/04/18
INST "KIZP_inst/rgu_for[0].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[1].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[2].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[3].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[4].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[5].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[6].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[7].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[8].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[9].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[10].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[11].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[12].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[13].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[14].fd_rgu" TNM = tg_rgu;
INST "KIZP_inst/rgu_for[15].fd_rgu" TNM = tg_rgu;


#Created by Constraints Editor (xc6slx4-tqg144-3) - 2017/04/18
INST "KIZP_inst/rg_izp_for[0].fd_izp" TNM = tg_rg_izp;
INST "KIZP_inst/rg_izp_for[1].fd_izp" TNM = tg_rg_izp;
INST "KIZP_inst/rg_izp_for[2].fd_izp" TNM = tg_rg_izp;
INST "KIZP_inst/rg_izp_for[3].fd_izp" TNM = tg_rg_izp;
INST "KIZP_inst/rg_izp_for[4].fd_izp" TNM = tg_rg_izp;
INST "KIZP_inst/rg_izp_for[5].fd_izp" TNM = tg_rg_izp;
INST "KIZP_inst/rg_izp_for[6].fd_izp" TNM = tg_rg_izp;
INST "KIZP_inst/rg_izp_for[7].fd_izp" TNM = tg_rg_izp;
#раскоментить когда будут известны расположение этих пинов на плисине!!!!!!!!!!
#INST "KIZP_inst/rg_izp_for[8].fd_izp" TNM = tg_rg_izp;
#INST "KIZP_inst/rg_izp_for[9].fd_izp" TNM = tg_rg_izp;
##INST "KIZP_inst/rg_izp_for[10].fd_izp" TNM = tg_rg_izp;
##INST "KIZP_inst/rg_izp_for[11].fd_izp" TNM = tg_rg_izp;
##INST "KIZP_inst/rg_izp_for[12].fd_izp" TNM = tg_rg_izp;


#Created by Constraints Editor (xc6slx4-tqg144-3) - 2017/04/18
TIMESPEC TS_izp = FROM "tg_rgu" TO "tg_rg_izp" 8 ns;





Цитата(Golikov A. @ Apr 25 2017, 14:06) *
Дальше кратко по сути:
- Задавать в 0 и пусть пыжится не вариант. Он будет долго пыжится, а потом может устать и вообще бросить что-то делать, то что получится не факт что самое лучшее или что это не сожрет кучу ресурсов.


если мне не изменяет память то в настройках задается количество неудачных проходов, через которые прекращается разводка. и, опять же, если мне не изменяет память то по умолчанию это 4 или 5 проходов
Go to the top of the page
 
+Quote Post
Vadim_nsk
сообщение Apr 27 2017, 12:27
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-09-05
Из: г. Новосибирск
Пользователь №: 8 335



Цитата(GAYVER @ Apr 27 2017, 16:19) *
CODE
#Created by Constraints Editor (xc6slx4-tqg144-3) - 2017/04/18
# Termodatchik-1
NET "WIRE[1]" LOC = P100 |IOSTANDARD = LVTTL;
NET "UBUF[1]" LOC = P99;
NET "UBUF[1]" IOSTANDARD = LVCMOS33;

Это ошибка копипаста или что-то осмысленное? Почему в одном случае "|IOSTANDARD", а в другом отдельной строкой и через пробел? Разве нельзя сразу через пробел писать "IOSTANDARD = LVCMOS33" или "|IOSTANDARD = LVCMOS33" для всех сигналов?

Вопросы касательно моего примера
Цитата(Vadim_nsk @ Apr 25 2017, 17:43) *
[code]NET "clock_p" LOC = P53;
NET "emc_ncs1" LOC = P107;
NET "emc_ncs1" PERIOD = 22.5 ns HIGH 33%;
NET "emc_ncs1" CLOCK_DEDICATED_ROUTE = FALSE;
NET "emc_ncs1" SLEW=FAST;
NET "emc_ncs1" IBUF_DELAY_VALUE = 0;
NET "emc_ncs1" IFD_DELAY_VALUE = 0;

NET "emc_data<7>" LOC = P125;
NET "emc_data<7>" SLEW=FAST;
NET "emc_data<7>" DRIVE = 16;
NET "emc_data<7>" IBUF_DELAY_VALUE = 0;
NET "emc_data<7>" IFD_DELAY_VALUE = 0;

1. Можно ли к неклоковым сигналам применять параметр "PERIOD = 22.5 ns HIGH 33%;", тем самым как бы задавая частоту следования этого сигнала вместо того, чтобы прописывать путь к следующим сигналам и задержки? (ну, например, если их 5 штук, проще указать один раз период, чем 5 маршрутов, да еще и поддерживать их актуальность при динамичном изменении проекта)
2. Я счет, что это также влияет на скорость переключения, но не уверен: "NET "emc_data<7>" SLEW=FAST;"
3. Посчитал, что ток пина: "DRIVE = 16;" определяет подключение последовательного сопротивления, следовательно, тока заряда емкости нагрузки и скорость фронта, значит переключения.
4. Где-то в документации на сайте Xilinx прочитал, что для пинов данных, зависимых от частоты, задержки по умолчанию устанавливаются не нулевые, чтобы скомпенсировать разницу с величиной задержки буфера клока. А раз так, полезно эти задержки занулить: "IBUF_DELAY_VALUE = 0;", "IFD_DELAY_VALUE = 0;".

Сообщение отредактировал Vadim_nsk - Apr 27 2017, 12:28
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Vadim_nsk   Как использовать временные ограничения в FPGA?   Apr 25 2017, 05:34
- - Nick Potapov   Идеология хорошо расписана вот здесь http://embedd...   Apr 25 2017, 06:23
- - litv   Насчет триггеров - правильно . https://habrahabr...   Apr 25 2017, 06:32
- - Golikov A.   Когда то беседовал со службой поддержки ксалинкса....   Apr 25 2017, 07:15
- - Vadim_nsk   Не со всем предложенным еще ознакомился, но кое чт...   Apr 25 2017, 10:43
|- - iosifk   Цитата(Vadim_nsk @ Apr 25 2017, 13:43) Не...   Apr 25 2017, 10:59
- - Golikov A.   во-первых, у ксалинкса есть визард написания конст...   Apr 25 2017, 11:06
|- - Vadim_nsk   Цитата(Golikov A. @ Apr 25 2017, 18:06) в...   Apr 25 2017, 11:55
- - Golikov A.   Правильно понимаете. Вы иминуете сигнал SysClk как...   Apr 25 2017, 12:44
- - Golikov A.   ЦитатаЭто ошибка копипаста или что-то осмысленное?...   Apr 28 2017, 06:29
|- - Vadim_nsk   Цитата(Golikov A. @ Apr 28 2017, 13:29) Я...   Apr 28 2017, 09:31
- - Golikov A.   | - это как раз знак что несколько параметров в о...   Apr 28 2017, 14:31


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016