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

Схемотехнические трюки для ПЛИСоводов

До кучи, @SM лет 14 назад, выкладывал на форум детектор метастабильности для своего хитрого процессора. ЕМНП там в теме было обсуждение и выкладывание информации по метастабильности по разным технологиям. Можно попробовать поискать, но очень давно это было

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


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

2 часа назад, Мур сказал:

Понимаю. 

Тут речь о жесткой логике (это для нашего XOR), которая уровни выше 0,8В ("серая" зона) для 5 вольтовой логики воспринимает как лог.1...

Хотелось бы увидеть картинку для моп структуры. Ибо ттл структура для плис не актуальна. Помниться на 133 серии 5 вольтовой ттл логике на висячем 

входе был уровень 1.3 В и уверенно воспринимался как лог.1

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


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

3 hours ago, des00 said:

Ну, у того же спартана 3 го это время было порядка сотен нс, софт то общий для всех. Таблица режимов DRC совсем не показатель.

Вы  можете открыть дизайн для последних US+  и  посмотреть какое MBTF считается  для  CDC цепочек. Команда report_synchronizer_mtbf.  Только вот  эта команда  один триггер  за  CDC не считает. Даже для US+.   :unknw:
А для цепочки минимальной длинны 2 у меня получаются  во такие  цифры.  При этом 10^12 по умолчанию в Vv считается как "../ маловато будет". 

Spoiler

100 MHz -> 100 MHz 
+----------+-----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| CDC Path |    MTBF         | Data Toggle Rate(Mtrs) | Data Sample Rate(Mhz) | Total Settling Time(ns) | Sending Domain | Receiving Domain | Number Stages | CDC Net Name |
+----------+-----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| 1        | 8.57e+192 years | 6.25                   | 100                   | 19.4                    | CLK1           | CLK2             | 2             | din_r        |
+----------+-----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+

100 MHz -> 500 MHz 
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| CDC Path |    MTBF        | Data Toggle Rate(Mtrs) | Data Sample Rate(Mhz) | Total Settling Time(ns) | Sending Domain | Receiving Domain | Number Stages | CDC Net Name |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| 1        | 4.38e+23 years | 6.25                   | 500                   | 3.35                    | CLK1           | CLK2             | 2             | din_r        |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+

+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| CDC Path |    MTBF        | Data Toggle Rate(Mtrs) | Data Sample Rate(Mhz) | Total Settling Time(ns) | Sending Domain | Receiving Domain | Number Stages | CDC Net Name |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| 1        | 5.48e+22 years | 50                     | 500                   | 3.35                    | CLK1           | CLK2             | 2             | din_r        |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+

500 MHz -> 602 MHz
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| CDC Path |    MTBF        | Data Toggle Rate(Mtrs) | Data Sample Rate(Mhz) | Total Settling Time(ns) | Sending Domain | Receiving Domain | Number Stages | CDC Net Name |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| 1        | 4.98e+15 years | 31.2                   | 602                   | 2.67                    | CLK1           | CLK2             | 2             | din_r        |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+

+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| CDC Path |    MTBF        | Data Toggle Rate(Mtrs) | Data Sample Rate(Mhz) | Total Settling Time(ns) | Sending Domain | Receiving Domain | Number Stages | CDC Net Name |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| 1        | 6.22e+14 years | 250                    | 602                   | 2.67                    | CLK1           | CLK2             | 2             | din_r        |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+

500 MHz -> 700 MHz 
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| CDC Path |    MTBF        | Data Toggle Rate(Mtrs) | Data Sample Rate(Mhz) | Total Settling Time(ns) | Sending Domain | Receiving Domain | Number Stages | CDC Net Name |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| 1        | 1.18e+11 years | 31.2                   | 699                   | 2.25                    | CLK1           | CLK2             | 2             | din_r        |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+

+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| CDC Path |    MTBF        | Data Toggle Rate(Mtrs) | Data Sample Rate(Mhz) | Total Settling Time(ns) | Sending Domain | Receiving Domain | Number Stages | CDC Net Name |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| 1        | 1.48e+10 years | 250                    | 699                   | 2.25                    | CLK1           | CLK2             | 2             | din_r        |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+


500 MHz -> 600 MHz  XOR и ENA на LUT
+----------+------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| CDC Path |    MTBF    | Data Toggle Rate(Mtrs) | Data Sample Rate(Mhz) | Total Settling Time(ns) | Sending Domain | Receiving Domain | Number Stages | CDC Net Name |
+----------+------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| 1        | UNDEFINED  | 28.9                   | 602                   | INFINITE                | CLK2           | CLK2             | 2             | p_3_out[0]   |
+----------+------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+

500 MHz -> 600 MHz  XOR и ENA на выделенный пин триггера ENA
+----------+------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| CDC Path |    MTBF    | Data Toggle Rate(Mtrs) | Data Sample Rate(Mhz) | Total Settling Time(ns) | Sending Domain | Receiving Domain | Number Stages | CDC Net Name |
+----------+------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+
| 1        | UNDEFINED  | 31.2                   | 602                   | INFINITE                | CLK1           | CLK2             | 2             | din_r        |
+----------+------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+--------------+

 

Кстати  Vv  конструкцию с XOR  выбрасывает при синтезе (если жестко атрибутам не прибить), ведь с точки зрения логики это эквивалентно обычному D триггеру. 
Если прибить то варианта с XOR вообще  за  CDC не считается для еще и ругается,  что впрочем и ожидаемо:

Source Clock: CLK1
Destination Clock: CLK2
CDC Type: No Common Primary Clock

Row  ID      Severity  Description                                     Depth  Exception            Source (From)  Destination (To)
---  ------  --------  ----------------------------------------------  -----  -------------------  -------------  ----------------
  1  CDC-1   Critical  1-bit unknown CDC circuitry                         0  Asynch Clock Groups  din_r_reg/C    cdc_reg_1/CE
  2  CDC-15  Warning   Clock enable controlled CDC structure detected      0  Asynch Clock Groups  din_r_reg/C    cdc_reg_1/D

 

P.S. А  вот так выглядит расчет для 10 и  100 таких цепочек 
 

Spoiler

600 -> 700 Mhz
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+----------------+
| CDC Path |    MTBF        | Data Toggle Rate(Mtrs) | Data Sample Rate(Mhz) | Total Settling Time(ns) | Sending Domain | Receiving Domain | Number Stages | CDC Net Name   |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+----------------+
| 1        | 2.11e+10 years | 31.2                   | 699                   | 2.16                    | CLK1           | CLK2             | 2             | g_bit[0].din_r |
| 2        | 2.88e+10 years | 31.2                   | 699                   | 2.18                    | CLK1           | CLK2             | 2             | g_bit[1].din_r |
| 3        | 3.92e+10 years | 31.2                   | 699                   | 2.19                    | CLK1           | CLK2             | 2             | g_bit[2].din_r |
| 4        | 5.13e+08 years | 31.2                   | 699                   | 1.98                    | CLK1           | CLK2             | 2             | g_bit[3].din_r |
| 5        | 5.96e+10 years | 31.2                   | 699                   | 2.21                    | CLK1           | CLK2             | 2             | g_bit[4].din_r |
| 6        | 5.89e+07 years | 31.2                   | 699                   | 1.88                    | CLK1           | CLK2             | 2             | g_bit[5].din_r |
| 7        | 1.31e+10 years | 31.2                   | 699                   | 2.14                    | CLK1           | CLK2             | 2             | g_bit[6].din_r |
| 8        | 5.58e+10 years | 31.2                   | 699                   | 2.21                    | CLK1           | CLK2             | 2             | g_bit[7].din_r |
| 9        | 4.21e+10 years | 31.2                   | 699                   | 2.2                     | CLK1           | CLK2             | 2             | g_bit[8].din_r |
| 10       | 1.79e+10 years | 31.2                   | 699                   | 2.16                    | CLK1           | CLK2             | 2             | g_bit[9].din_r |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+----------------+
* Summary: Overall Synchronizer MTBF:5.2e+07 years

...

| 96       | 1.75e+10 years | 31.2                   | 699                   | 2.15                    | CLK1           | CLK2             | 2             | g_bit[96].din_r |
| 97       | 1.57e+10 years | 31.2                   | 699                   | 2.15                    | CLK1           | CLK2             | 2             | g_bit[97].din_r |
| 98       | 2.19e+10 years | 31.2                   | 699                   | 2.17                    | CLK1           | CLK2             | 2             | g_bit[98].din_r |
| 99       | 1.97e+11 years | 31.2                   | 699                   | 2.27                    | CLK1           | CLK2             | 2             | g_bit[99].din_r |
| 100      | 5.55e+09 years | 31.2                   | 699                   | 2.1                     | CLK1           | CLK2             | 2             | g_bit[9].din_r  |
+----------+----------------+------------------------+-----------------------+-------------------------+----------------+------------------+---------------+-----------------+
* Summary: Overall Synchronizer MTBF:2.02e+07 years

 

 

Заметьте как "гуляет" MBTF от актуального Setting time. Которое как я понимаю зависит от  clock skew и задержек роутинга между регистрами цепочки.   

 

 

3 hours ago, Мур said:

Тут речь о жесткой логике (это для нашего XOR), которая уровни выше 0,8В ("серая" зона) для 5 вольтовой логики воспринимает как лог.1...

Даже  для  обычной TTL логики производитель гарантировал что все что <0.8 это точно 0,  а >2.4 это точно 1.  А вот как будет трактоваться все что между этим производитель не гарантировал.
Может и 1, а может и линейный режим с генерацией или усилением помех  из питания. 
А уж гадать  как уровень метастабильности трактовать внутри FPGA ...  это надо к бабке гадалке на прием идти :biggrin:

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


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

2 hours ago, RobFPGA said:

Даже  для  обычной TTL логики производитель гарантировал что все что <0.8 это точно 0,  а >2.4 это точно 1.  А вот как будет трактоваться все что между этим производитель не гарантировал.
Может и 1, а может и линейный режим с генерацией или усилением помех  из питания. 
А уж гадать  как уровень метастабильности трактовать внутри FPGA ...  это надо к бабке гадалке на прием идти :biggrin:

Сразу видно, что вы не практик!...

"Железо" четко реагирует на "Серый уровень" как на не ноль!... А на эпюрах с осциллографа бесполезно ожидать реакции от логических элементов, если не достигнут уровень 0.8В. Так и останется лог1.  Как буд-то там все 5В! Можно известным методом ввести элемент в активную зону усиления, но это уже аналоговая техника.

Так что смело можно считать доминантой в лог.1 все что выше 0.8В. Первое, что делает наладчик,- удостоверяется, что есть верный лог.0! Если нет,- жди проблем...

3 hours ago, sazh said:

Хотелось бы увидеть картинку для моп структуры. Ибо ттл структура для плис не актуальна. Помниться на 133 серии 5 вольтовой ттл логике на висячем 

входе был уровень 1.3 В и уверенно воспринимался как лог.1

Совершенно верно! Именно так и было...  Может такое сравнение не уместно, но думаю, что переходы из 0 в 1 и из 1 в 0 имеют также разные величины.  Насыщение и отсечка у транзистора сильно влияют на симметрию перехода...

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


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

1 hour ago, Мур said:

Сразу видно, что вы не практик!...

Конечно сейчас "не видно",  я с 5-вольтовой TTL последний раз работал наверное в конце 90-х, а начинал в начале 80.  :wink2: 
Так что можете считать в промежутке от 0.8 до 2.4 есть жизнь (как на Марсе). :yes3:   Но это никоим образом не меняет того  что костыль с XOR нельзя  использовать для защиты от метастабильности.    

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


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

12 hours ago, RobFPGA said:

Вы  можете открыть дизайн для последних US+  и  посмотреть какое MBTF считается  для  CDC цепочек. Команда report_synchronizer_mtbf.  Только вот  эта команда  один триггер  за  CDC не считает. Даже для US+.   :unknw:

Да нет у меня таких чипов в работе и на компе. Нищеброды мы) Подозреваю что команда ищет синхронизаторы по паттерну, а паттерн 2 подряд триггера. От того и такое поведение. По хорошему стенд надо собирать. Ну или можно на ieee порыться, по любому кто-то из студентов писал диссер с исследованиями современных технологий. 

А цифры интересные, даже в худшем случае, 10^7 лет, это при среднем сроке жизни изделия 10-20 лет непрерывной работы) 

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


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

9 hours ago, RobFPGA said:

Конечно сейчас "не видно",  я с 5-вольтовой TTL последний раз работал наверное в конце 90-х, а начинал в начале 80.  :wink2: 
Так что можете считать в промежутке от 0.8 до 2.4 есть жизнь (как на Марсе). :yes3:   Но это никоим образом не меняет того  что костыль с XOR нельзя  использовать для защиты от метастабильности.    

Я не много раньше...  77!  Считаю не уместным сравнение с TTL . Но это намеренно, чтобы усвоили, что на самом деле техническая система на ПЛИС не симметрична по уровням 1\0. И есть разные времена.

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

Спасибо.

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


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

Just now, Мур said:

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

@RobFPGA тоже прав, как и вы. Ваше решение имеет место быть, но и диапазон применения у него тоже ограничен) Да и вообще, есть у меня проекты, где настройки задаются в поле регистров на частоте проца, асинхронной всему проекту. Никакой дополнительной логики я не использую. Просто передаю эти константы) ну выпадет пара отсчетов в цифровом фильтре, никакой беды в моих проектах не сделает) 

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


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

2 hours ago, des00 said:

... Подозреваю что команда ищет синхронизаторы по паттерну, а паттерн 2 подряд триггера. От того и такое поведение.

Как раз Vv  находит все ситуации переходов  между клоками.  Только вот не все считается правильным CDC.
Логика на пути от регистра на одном клоке до регистра на другом (цепь CDC)  -  ошибка CDC.
Fanout  >1  в этой же цепи -  ошибка CDC. Цепочка  синхронизатора <2 - "это вообще  что такое" ?   :scratch_one-s_head: ...

Я  просто как раз сейчас в Vv "чищу" один старый но большой проект как раз на предмет CDC. :cray: В том числе и от похожих "оптимизаций" типа XOR.  

3 hours ago, des00 said:

Просто передаю эти константы) ну выпадет пара отсчетов в цифровом фильтре, никакой беды в моих проектах не сделает) 

Так тоже можно делать если четко понимаешь чем это грозит.  А то вдруг потом в набор таких констант попадает порог для какого ни будь счетчика в FSM из другого клока и начинается "веселье" ...       

3 hours ago, des00 said:

А цифры интересные, даже в худшем случае, 10^7 лет, это при среднем сроке жизни изделия 10-20 лет непрерывной работы) 

Это цифры можно считать идеальными. Пустой vu09p-2 чип, только синхронизаторы.  Но вот зависят они как видно от реальных задержек в цепочке синхронизации
Соответвенно если запас по setup|hold , будет минимальным  то это может сильно уменьшить время MBTF. Ну и если таких переходов в проекте много то это тоже снижает это время.
Вот и получается что одним триггером делать CDC ну очень стремно, особенно для высоких целевых клоков.    

 

3 hours ago, Мур said:

При некотором воображении в нем можно увидеть те же решения, которые вы признали (см. удаленный Т-триггер).

При "богатом" воображении увидеть все что угодно. Но сути реальных вещей это увы не меняет.  Тот же Т-триггер работает как toggle CDC только через обычный синхронизатор. А без  синхронизатора как CDC не работает.  

3 hours ago, Мур said:

Вам рекомендую нарисовать временную диаграмму критичного поведения (в вашем понимании) и выставить тут для обоих случаев переходов. Это будет лучше любых текстов.

Тоже советую и вам. И сравнить поведение конструкции XOR с обычным D триггером. 

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


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

Есть схема(триггер + искл.ИЛИ). Есть обозначения сигналов. Можно видеть временные диаграммы для 2х случаев метастабильного поведения (именно критичные случаи). Вы просили сигнал с выхода  искл.ИЛИ?  Это точка Е.  Что тут не понятного?

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


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

4 hours ago, Мур said:

yfЕсть схема(триггер + искл.ИЛИ). Есть обозначения сигналов. Можно видеть временные диаграммы для 2х случаев метастабильного поведения (именно критичные случаи). Вы просили сигнал с выхода  искл.ИЛИ?  Это точка Е.  Что тут не понятного?

Я просил сравнить поведение ваше схемы из вашего кода с поведением обычного синхронизатора на D триггере.  На приведенной картинке не совсем то что в вашем коде.

  
Но даже так,  на верхней как я понял вы показываете случай когда  метастабильность  длиннее такта клока. Так?  И что  будет  при этом со следующим триггером  в схеме ?  Скорее все так как на выходе out2.
Вот и получается - XOR от  попадания триггера в метастабильность не защищает.  Если триггер попал в метастабильность и не вышел из нее до следующего такта то эта метастабильность идет дальше со всеми вытекающими печальными последствиями, ведь вы думаете что эта чудесная схема "защитит" от метастабильности.  
Если же  триггер  вывалился из метастабильности  чуть раньше чем следующий клок  то он .... снова туда может попасть ведь есть задержка от выхода триггера через XOR на вход E. И пока сигнал с выхода на вход доберется то может попасть аккурат на новый фронт. Пример розовым нарисовал, чтобы не страшно было :biggrin: 

 

Заодно пририсовал там и поведение простого D триггера из обычной цепочки синхронизации. И чем это поведение отличается  от вашей схемы?

 

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

xor.png

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


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

56 minutes ago, RobFPGA said:

Заодно пририсовал там и поведение простого D триггера из обычной цепочки синхронизации. И чем это поведение отличается  от вашей схемы?

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

Итак, Есть отличие только в одном,- передающая сторона не управляет моментом записи нового результата. Он выявляется по смене уровня. И этот процесс может длиться бесконечно при неудачных вбросах, когда метастабильность не уходит. Достоинство в самом стробировании\разрешении, которое дозировано адаптивно результату на выходе. Пусть это мелочь, но это потребление.

Спасибо. Разобрался.

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


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

4 часа назад, Мур сказал:

Итак, Есть отличие только в одном,- передающая сторона не управляет моментом записи нового результата. Он выявляется по смене уровня. И этот процесс может длиться бесконечно при неудачных вбросах, когда метастабильность не уходит. Достоинство в самом стробировании\разрешении, которое дозировано адаптивно результату на выходе. Пусть это мелочь, но это потребление.

Спасибо. Разобрался.

Вы привели графический вариант, который отличается от вашего проекта rg_ch. А функционально Ваш проект - это д триггер, реализованный на д триггере со входом разрешения и xor в цепи обратной связи. Синтезатор его должен в д триггер превратить. И где тут борьба с метастабильностью. Добавьте еще триггер, будет как в старые добрые времена.

Кстати хочу по VHDL проехаться. 

--signal tg_s : std_logic := '0';
--signal one_tic : std_logic := '0';

Давать указание симулятору - выход логики в ноль установить ? Он конечно проигнорировал, но ему по барабану, сигнал и сигнал.

У меня получилось так. Разницы не увидел.

module rg_ch
(
input  clk, change_a, change_b,
output [1:0] rg_oa, rg_ob
);

reg         tg_sa = 1'b0;
reg         tg_sb = 1'b1;
reg [1:0] rg_dff = 2'b10;
 
wire one_tica = change_a ^ tg_sa,
     one_ticb = change_b ^ tg_sb;
          
always @(posedge clk)
begin
if(one_tica)        tg_sa <= change_a;
if(one_ticb)        tg_sb <= change_b;
rg_dff <= {change_b, change_a};
end

assign rg_oa = {tg_sb, tg_sa},
         rg_ob = rg_dff;
endmodule

 

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


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

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

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

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

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

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

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

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

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

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