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)




С модуля PLL я подал 250Мгц на вход IOCLK и CLK.
Большая хитрость была понять, что вход 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. Хотя, может я что то сделал не так. 

Успехов.















Комментарии

Популярные сообщения из этого блога

iNAV work around

How to build coil for Minelab Explorer. DIY

Вычисление азимута и расстояния между двумя точками