Spartan6, iodelay2 . How to use it for delaying of internal pulse.
За документацию на этот элемент надо расстреливать
Это релевантно для Spartan 6.
Тут подсчитывается задержка.
https://support.xilinx.com/s/article/35783?language=en_US
https://support.xilinx.com/s/article/34276?language=en_US
Задача - использовать задержку для сдвига импульса, сгенерированного внутри FPGA,
Тут есть проблема в том, что IDATAIN хочет сигнал с IOB. Это обходится проведением сигнала через двунаправленный порт, как показано на рисунке.
(https://support.xilinx.com/s/article/34276?language=en_US)
Далее, переменную задержку поддерживает только IDATAIN.
Я использовал режим
IDELAY_TYPE in VARIABLE_FROM_ZERO
COUNTER_WRAP
AROUND in WRAPAROUND
IDELAY_MODE in NORMAL
DELAY_SRC in IDATAIN
Добрый японец привел пример, как он подключил IODELAY2:
(http://nahitafu.cocolog-nifty.com/nahitafu/2010/08/spartan-6io-be0.html)
Большая хитрость была понять, что вход INT просто определяет направление счета, "1" - increment,"0" - decrement. А позитивный фронт импульса на входе CE собственно и производит "TAP". То есть , сначала устанавливаем необходимый INT, а потом тапаем CE. Счетчик был добавлен для того, что бы синхронизировать импульс СЕ с сигналом CLK. По другому у меня все работало странно.
Последовательность работы следующая:
Как минимум один раз после включения подаем положительный импульс на CAL
( Low->High->Low), ждем когда сигнал BUSY упадет в ноль. (Дополнение: Оказалось, BUSY падает в ноль, только тогда , когда на вход IDATAIN поступает два импульса(??? где-то такое читал в мануалах. Ага, нашел - https://www.xilinx.com/support/documentation/user_guides/ug381.pdf, Delay Update and BUSY Timing, p.73 "BUSY will not return Low until four input data transitions are received. Once BUSY is Low, the new value is operational." )) Модуль готов и откалиброван.
Для увеличения задержки надо установить INT в "1" и послать один импульс в CE ( Дополнение: Импульс CE должен быть как минимум два периода входного CLK). Ждем когда сигнал BUSY упадет в ноль (помним о входных импульсах). После этого можно посылать следующий "TAP". ("TAP" это одно приращение задержки, такой термин используется в документации, https://www.xilinx.com/support/documentation/user_guides/ug381.pdf)
Для сброса задержки к начальное состояние (в моем случае в VARIABLE_FROM_ZERO)
Подаем положительный импульс на RES. Ждем когда сигнал BUSY упадет в ноль.
Как то так.
Вот еще странный немец, Von Pokemonowitsch, отметился в деле изучения IODELAY2
(https://smartfpga.de/?p=1)
"Wenn man die gesamte Verzögerung z.B. inkrementieren will, setzt man erst das INC-Signal zu „1“ und danach setzt man das CE-Signal zu „1“. Genauso verfährt man, um die Verzögerung zu verkürzen, allerdings muss natürlich das INC-Signal auf „0“ gesetzt werden. Wie ich (praktisch) herausgefunden habe, entspricht die Anzahl der In- oder Dekrementschritte der Anzahl der positiven Flanken des CE-Signals. Das heißt, wenn z.B. das INC-Signal positiv ist, verursacht ein positiver Übergang des CE-Signals das Hinzufügen eines Taps zu der gesamten Verzögerung, egal wie viele Taktperioden danach das CE-Signal positiv bleibt. Die letzte wichtige Sache: um die normale Funktion eines IODELAY2 Primitives im variablen Modus zu ermöglichen, muss die Kalibrierungsprozedur der jeweiligen Primitive durchgeführt werden. Dafür muss der Zustandsautomat nach einem Reset den CAL-Eingang der Primitive auf „1“ einmal setzen."
Правда я не совсем согласен с его утверждением "egal wie viele Taktperioden danach das CE-Signal positiv bleibt. " . Мне пришлось синхронизировать CE. Хотя, может я что то сделал не так.
Успехов.
Комментарии
Отправить комментарий