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

Знатоки FPGA, подскажите

Тем что выход первого триггера используется в дальнейшей логике. В классическом синхронизаторе из двух триггеров, предназначенном для борьбы с метастабильностью, выход первого триггера подключают исключительно к входу второго.

////////////////////////////

Наверно имеет смысл при этом добавить - при приеме данных.

Приведенная выше схема под названием синхронный одновибратор давно уже имеено в таком виде озвучена у Тицце и Шенка.

Идея в том что эта схема обычно используется для преобразования именно клока, который сопровождает данные. Gate clk - в enable clk. И если данные, сопровождаемые gate клоком укладываются хотя бы в два периода глобального клока, то уже без разницы, как воспримет второй триггер метастобильность первого. Данные уверенно будут приняты или в первом такте или во втором.

Да и от частоты клока очень многое зависит. В свое время забавно было читать, как два теоретика рассуждали о том , что лучше принимать данные на частоте 20 мГц чем на 40. И их мало интересовало, есть ли у пользователя такие частоты.

 

Спасибо, но это добавлять было не нужно. Титце с Шенком ничего не пишут про метастабильность, о которой написал я. Действительно, эффекты метастабильности критичны именно для высокочастотных схем, работающих вблизи технологического предела. Если схема работает на частотах, гораздо меньше предельных - то небольшое увеличение времени установления на выходе первого триггера, действительно, не будет для нее существенным, и можно обычно безопасно использовать синхронизатор не из двух, а из одного триггера. Как в обсуждаемой схеме. С другой стороны, то, что используется синхронизатор из двух последовательно включенных триггеров, а не скажем, из пяти, связано только с отношением постоянной времени в законе распределения вероятности для метастабильности к периоду клока. Но вроде бы для применяемых технологий одного такта на предельной частоте клока вполне достаточно для надежного установления логического уровня.

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


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

Я согласен с Вашими замечаниями... В этом вопросе так глубоко не копал (распределение вероятности, экспонента,метастабильность.... сложные вопросы)

Приведённая мной схема очень проста , но в большенстве случаев работает.

Тогда может вы подскажите другое решение.

Что лучше использовать при приёме данных? Какую схему используете вы?

 

Я стараюсь не работать с асинхронными шинами. Если же приходилось - старался ставить синхронизатор из двух последовательно включенных триггеров. Мне хватало. Если бы не хватило - копал бы в сторону синхронизатора с одним триггером с соответсвующими констрейнтами на выход первого триггера. Но это гораздо сложнее - чтобы доказать работоспособность такой схемы вблизи жестких ограничений - нужно провести измерения параметров метастабильности по методикам, изложенным в аппнотах производителей кристаллов, и все равно, оставались бы сомнения по поводу зависимости этих параметров, например, от температуры. Так что если не хочется об этом задумываться проще ставить два триггера.

 

В Вашей схеме в качестве синхронизатора используется именно один триггер.

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


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

Чем же это она бесполезна??? Подобную прибабаху использую уже лет 10 именно для синхронизации асихронных сигналов (если нет требования сохранения длительности) и все прекрасно работает. Типичное применение - запись в синхронное FIFO от чего-то асинхронного или бегущего в другом clock domain. ИМХО - масса вариантов, когда очень удобно использовать... Если надо сохранить длительность (с точностью до клока) - Shift Reg, но принцип тот же самый

 

Тем что выход первого триггера используется в дальнейшей логике. В классическом синхронизаторе из двух триггеров, предназначенном для борьбы с метастабильностью, выход первого триггера подключают исключительно к входу второго. Идея - в любой технологии при приходе фронта асинхронного сигнала на вход триггера одновременно с приходом клока время установления логического уровня сигнала на выходе триггера может возрастать до бесконечности, но практически лишь слегка, не скажу точно за распределение вероятности - но экспонента в нем была точно. Этот эффект и называется метастабильностью. В большинстве случаев за время одного такта на выходе первого триггера устанавливается логический уровень с очень высокой вероятностью, и поэтому второй триггер его уже быстро защелкивает в пределах времени установления из даташита. Если же выход первого триггера подать на комбинаторную схему, да еще он попадет в критический путь, да еще схема работает на пределе частоты. да еще в констрейнтах ничего не сказано про увеличенное время установления - то даже небольшое связанное с метастабильностью увеличение времени установления сигнала на выходе первого триггера может стать причиной сбоев.

Спасибо за пояснения, но что такое "метастабильность" и как с нею бороться я знаю последние лет 25, а может и больше. Хотя за пояснения все равно спасибо - кому-нибудь точно пригодится. Мои аргументы "за" приведенныю схему ни сном ни духом не утверждают, что она предназначена для борьбы с метастабильностью, но у нее есть свои применения. А вот Shift Reg (как Вы описали - 2-х битовый) делает как раз то, что надо.

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


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

Раз уж тема о проблеммах синхронизации, хотелось бы узнать ваше мнение по поводу использования глобальных частот. Думаю эти вопросы возникают у многих.

Как вы считаете можно ли глобальную тактовую частоту подавать на ногу ввода вывода?

Например в РLL частота умножается да 60 мегагерц. Могу ли я эту частоту подать на выход ПЛИС??

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


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

Спасибо за пояснения, но что такое "метастабильность" и как с нею бороться я знаю последние лет 25, а может и больше. Хотя за пояснения все равно спасибо - кому-нибудь точно пригодится. Мои аргументы "за" приведенныю схему ни сном ни духом не утверждают, что она предназначена для борьбы с метастабильностью, но у нее есть свои применения. А вот Shift Reg (как Вы описали - 2-х битовый) делает как раз то, что надо.

 

Это так - свои применения у схемы есть. Но не для всякой синхронизации асинхронных сигналов её можно использовать не задумываясь - об этом и было замечание. То есть совет использовать эту схему в качестве синхронизатора мог оказаться вредным. Вот если на вход этой схему подключить еще один триггер - то совет будет гораздо безопаснее для начинающих. :biggrin:

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


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

Если набрать слово метастабильность в конференции, можно многое чего узнать.

________________.zip

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


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

Раз уж тема о проблеммах синхронизации, хотелось бы узнать ваше мнение по поводу использования глобальных частот. Думаю эти вопросы возникают у многих.

Как вы считаете можно ли глобальную тактовую частоту подавать на ногу ввода вывода?

Например в РLL частота умножается да 60 мегагерц. Могу ли я эту частоту подать на выход ПЛИС??

 

Конечно можно. Только учесть дополнительные задержки, правильно развести плату и поаккуратнее законстрейнить дтизайн.

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


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

Например в РLL частота умножается да 60 мегагерц. Могу ли я эту частоту подать на выход ПЛИС??

 

Желательно уточнить тип ПЛИС к которой отностися вопрос.

Выводить можно, только надо учитывать несколько неприятных моментов:

 

1. В ПЛИС с которыми я работал нет "прямого" пути дял Global Clock на вход I в I/O Block, тогда имплементатор пропускает Global Clock через несколько коммутаторов, добавляя, тем самым, некоторую (в общем случае неодинаковую) транспортную задержку. Если у вас несколько выходов с этим Global Clock, то желательно довавить соответствующий Constaint (у Xilinx это Skew).

 

2. Видел я какой-то XAPP (найти его сейчас не смог), там была применена такая идея: Global Clock не может быстро попасть на на вход I в I/O Block, но может попасть на вход OCLK в I/O Block и быстро, и синхронно с остальными выходами. Тогда можно запитать в ПЛИС с DDR выходом этим клоком DDR коммутатор, который будет мультиплексировать две константы '1' и '0', эмулируя, тем самым, выход Global Clock.

 

3. При работе ФАПЧ неизбежно появляется jitter. Если PLL цифровой, то jitter может быть весьма "большим" (в десятки пикосекунд) - что для некоторых высокоточных задач - неприемлемо.

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


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

Да действительно , не конкретный вопрос я задал ...

Плисс у меня Cyclone II. Я знаю у этих микросхемм есть специальные выводы тактовых частот наружу. Называются они в документации PLL<#>_OUT, привязываются они к специальным ногам плисы. Но при разводке платы я это не учел. Если просто подавать Global Clock на выход плис,то получается криво... мы имею не только плохую частоту на выходе плисс, но и все схемы тактируемые этим Global Clock ведут себя странно.

Наверное лучше спросить по другому .

Можно ли сигналы Global Clock выводить наружу плис без специальных выводов. Если можно то как?

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


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

мы имею не только плохую частоту на выходе плисс, но и все схемы тактируемые этим Global Clock ведут себя странно.

 

Если все тактируемые схемы ведут себя странно - то дело скорее всего в разводке рлаты...

Есть такой термин - Signal Integrity. Обратите на него пристальное внимание - для клоков он особенно критичен.

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


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

Тогда может вы подскажите другое решение.

Что лучше использовать при приёме данных? Какую схему используете вы?

 

Я для приема данных использу FIFO, в случае когда данных очень много оно организуется на двух внешних ОЗУ'шках (одну читает потребитель, и пока она полностью не прочитанна, в другую пишет источник данных), если ОЗУ надо мало, то вполне для FIFO подходит и блоки внутреннего ОЗУ. Как работают счетчики на запись/чтение данных в/из FIFO - зависит от конкретной задачи. Главное, что блок синхронизации я применяю один и тот же.

 

Идея блока такова:

Есть CLK_1 и есть некое событие, на которое надо отреагировать импульсом длинной в один такт на CLK_2. Наличие события кодируется импульсом, длинной в один такт CLK_1 на линии START. Исходник блока синхронизации (разработал сам):

 

 

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

 

entity sync_clk is port (

START: in std_logic;

CLK_1: in std_logic;

CLK_2: in std_logic;

 

Q: out std_logic );

end entity;

 

architecture sync_clk_body of sync_clk is

 

signal F1_FD0: std_logic := '0';

signal F2_FD1: std_logic := '0';

signal F2_FD2: std_logic := '0';

 

begin

process (CLK_1, F2_FD2)

begin

if F2_FD2 = '1' then

F1_FD0 <= '0';

elsif rising_edge(CLK_1) then

if (START = '1') then

F1_FD0 <= '1';

end if;

end if;

end process;

 

process (CLK_2)

begin

if rising_edge(CLK_2) then

F2_FD1 <= F1_FD0;

F2_FD2 <= F2_FD1 xor F2_FD2;

end if;

end process;

 

Q <= F2_FD2;

end architecture;

 

Эта схема используется в (БСС) Блоках Сетевой Синхронизации Первого и Второго "сортов" в STM (телефонии). За все время тестирований и измерений ни разу не пропустила ни одного импульса. (любой пропушенный умпульс, в данных системах, тут же отзывется плавным, но быстрым, набегом фазы на 1 такт) В БСС второго сорта схема закатана в XCR3256-7TQ144. Работает с частотами около 131.072 МГЦ (практически на предельном быстродействии XPLA3). В Spartan-2E в менее скоростной задачи, за год эксплуатации пока тоже сбоев не обнаружено.

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


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

мы имею не только плохую частоту на выходе плисс, но и все схемы тактируемые этим Global Clock ведут себя странно.

С Altera не работаю, архиректуру Cyclone II не представляю.

Но ловил подобный глюк в Spartan-IIE при GCLK более 200 МГц. Дело было исправлено добавлением к каждому блокировочному конденсатору 0.1 мкФ (Murata X7R) еще и 0.01 мкФ (Murata X7R). После этого все стало работать нормально. В том проекте 0.1 мкФ конденсаторы стояли на каждой ноге питания ПЛИС. В описании конденсаторов Murata для X7R обнуружил, что конденсаторы 0.1 мкФ более или менее хорошо работают на частотах до 20 МГц.

Хоть у Вас частота только 60 Мгц, но все-же может быть дело с блокировочными конденсаторами (?), попробуйте - дорого не выйдет.

Если вы применяете Y5V конденсаторы, то может быть поможет такая наводка: у некоторых из Y5V мы обнаруживали пъезо эффект, т.е. любой удар по плате отзывается небольшим броском напряжения - очень забавно выглядит при просмотре данных с 12-разрядного АЦП, оцифровывающего высокостабильное постоянное напряжение. Если ваше устройство работаете в условиях вибраций... то в таком случае итог будет печален.

 

Может конечно, дело еще в чем-то...

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


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

мы имею не только плохую частоту на выходе плисс, но и все схемы тактируемые этим Global Clock ведут себя странно.

 

Если все тактируемые схемы ведут себя странно - то дело скорее всего в разводке рлаты...

Есть такой термин - Signal Integrity. Обратите на него пристальное внимание - для клоков он особенно критичен.

 

спасибо , сейчас бегло просмотрел в quartusii_handbook, штука интересная. Раньше об этом не знал.

Вечерком попробую разобраться что к чему.

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


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

Тогда может вы подскажите другое решение.

Что лучше использовать при приёме данных? Какую схему используете вы?

 

Я для приема данных использу FIFO, в случае когда данных очень много оно организуется на двух внешних ОЗУ'шках (одну читает потребитель, и пока она полностью не прочитанна, в другую пишет источник данных), если ОЗУ надо мало, то вполне для FIFO подходит и блоки внутреннего ОЗУ. Как работают счетчики на запись/чтение данных в/из FIFO - зависит от конкретной задачи. Главное, что блок синхронизации я применяю один и тот же.

 

Идея блока такова:

Есть CLK_1 и есть некое событие, на которое надо отреагировать импульсом длинной в один такт на CLK_2. Наличие события кодируется импульсом, длинной в один такт CLK_1 на линии START. Исходник блока синхронизации (разработал сам):

 

 

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

 

entity sync_clk is port (

START: in std_logic;

CLK_1: in std_logic;

CLK_2: in std_logic;

 

Q: out std_logic );

end entity;

 

architecture sync_clk_body of sync_clk is

 

signal F1_FD0: std_logic := '0';

signal F2_FD1: std_logic := '0';

signal F2_FD2: std_logic := '0';

 

begin

process (CLK_1, F2_FD2)

begin

if F2_FD2 = '1' then

F1_FD0 <= '0';

elsif rising_edge(CLK_1) then

if (START = '1') then

F1_FD0 <= '1';

end if;

end if;

end process;

 

process (CLK_2)

begin

if rising_edge(CLK_2) then

F2_FD1 <= F1_FD0;

F2_FD2 <= F2_FD1 xor F2_FD2;

end if;

end process;

 

Q <= F2_FD2;

end architecture;

 

Эта схема используется в (БСС) Блоках Сетевой Синхронизации Первого и Второго "сортов" в STM (телефонии). За все время тестирований и измерений ни разу не пропустила ни одного импульса. (любой пропушенный умпульс, в данных системах, тут же отзывется плавным, но быстрым, набегом фазы на 1 такт) В БСС второго сорта схема закатана в XCR3256-7TQ144. Работает с частотами около 131.072 МГЦ (практически на предельном быстродействии XPLA3). В Spartan-2E в менее скоростной задачи, за год эксплуатации пока тоже сбоев не обнаружено.

 

 

Moget Ja ne sovsem ponimaju no pochemu XOR vo vtorom processe?

Po moemu u Vas F2_FD2 moget zalipnut' v edinice.

Ne proshe li tak?

 

process (CLK_2)

begin

if rising_edge(CLK_2) then

F2_FD1 <= F1_FD0;

F2_FD2 <= '0';

if F2_FD1='1' then F2_FD2<='1'; end if;

end if;

end process;

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


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

А XOR потому, что:

Есть CLK_1 и есть некое событие, на которое надо отреагировать импульсом длинной в один такт на CLK_2.

 

Как вы должны догадываться, эта выложенная схема, далеко не первая, а результат последовательной оптимизации ряда схем, в т.ч. гибрида схемы leevv(#29) + что-то вроде Alex_vod(#2) - 4 триггера, время реакции не менее 3T CLK2, время релаксации не менее 4T CLK2, по моему в моей схеме с этим получше, а?

 

Насколько я изучил ПЛИС, логика в них работает как фильтр нижних частот, т.е. ее конечное быстродействие несколько ниже, чем у триггера. А при метостабильном состоянии у триггера на выходе достаточно высокочастотные колебания, которые в чистом виде через логику пройти не могут. Но это пол дела.

 

В добавок в моей схеме, у триггера F2_FD1 заложено время на выход из метастабильного режима = 1T CLK2 - (Troutes delay + Txor delay). Если для вас этого мало - модифицируйте схему под свои нужды. Но все-таки:

Эта схема используется в (БСС) Блоках Сетевой Синхронизации Первого и Второго "сортов" в STM (телефонии). За ВСЕ ВРЕМЯ ТЕСТИРОВАНИЙ и измерений ни разу не пропустила ни одного импульса. (любой пропушенный умпульс, в данных системах, тут же отзывется плавным, но быстрым, набегом фазы на 1 такт) В БСС второго сорта схема закатана в XCR3256-7TQ144. Работает с частотами около 131.072 МГЦ (практически на предельном быстродействии XPLA3). В Spartan-2E в менее скоростной задачи, за год эксплуатации пока тоже сбоев не обнаружено.

А время тестирования БСС это не 2 минуты и не час. БСС-1 только в захват застоты входит несколько чавов, а затем его еще и тестируют, как он "фильтрует" эту захваченную частоту, со своей-то постоянной времени. Если бы эта схема глючила в ПЛИС, то это было бы видно - уж поверьте. Тем более зависнуть!

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


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

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

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

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

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

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

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

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

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

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