Цитата(yes @ Aug 18 2016, 16:14)

что-то не так в этой теме

там где можно применить констрейны, там никакой метастабильности не возникает (не должно в результате следования процессу разработки)
возможное место метастабильности - асинхронные сигналы, то есть такие сигналы момент изменения которого не известен на этапе проектирования
там ставится синхронизатор - два или больше последовательных триггера
почему это помогает - существует время выхода триггера из метастабильности, как правило в современных ПЛИС и АЗИКах оно очень короткое (и тема метастабильности и применения больше чем 2х последовательных триггеров не имеет сейчас практического смысла) и к моменту следующего тактового сигнала и защелкивания следующим триггером этот выход имеет определенное значение
а вот если бы за первым триггером была комбинаторная логика, а не триггер, то эта задержка на выход из метастабильности добавилась бы к пути и в следующих стадиях защелкивалась бы ошибка (хотя формально констрейн на эту логику, input_delay (upd : вернее clock, так как между триггерами дизайна) был бы удовлетворен синтезом)
также окно входного сигнала триггера, которое защелкнется метастабильно гораздо уже, чем значение выхода в метастабильном состоянии - это применялось, когда строили цепочки из более чем 2х триггеров
обычно асинхронный сигнал в виде импульса не ловят, это фронт, поэтому не важно, как разрешится метастабильность в 0 или 1 в этой цепочке - это просто приводит к задержке на 1 такт такта получателя, что приемлемо для асинхронного приемника
-----------
на пальцах как-то так - если порыться в книжках или в сети, то можно найти и формулы
Я пока только учусь, и вопросы у меня глупые
К чему я вообще эту тему создал. Я на просторах интернета как-то обнаружил тему про метастсбильность триггеров, прочитал, ничего не понял, но оставил пометку "РАЗОБРАТЬСЯ".
Поигравшись с семисегментными индикаторами, реализовав на макетной плате всякие динамические индикации, часы, и прочую лабуду решил перейти к более серьезным вещам. Решил разобраться с протоколом UARТ, и всё что с ним связано. Сам протокол простой. А вот его регистровая модель - тихий ужас. Скачал на сайте проекта OpenCore готовую реализацию микросхемы UART приемопередатчика принялся его разбирать по винтикам. И обнаружил там такую штуку
Код
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY GH_EDGE_DET IS
PORT
(
CLK : IN STD_LOGIC;
RST : IN STD_LOGIC;
D : IN STD_LOGIC;
RE : OUT STD_LOGIC; -- RISING EDGE (NEED SYNC SOURCE AT D)
FE : OUT STD_LOGIC; -- FALLING EDGE (NEED SYNC SOURCE AT D)
SRE : OUT STD_LOGIC; -- SYNC'D RISING EDGE
SFE : OUT STD_LOGIC -- SYNC'D FALLING EDGE
);
END GH_EDGE_DET;
ARCHITECTURE A OF GH_EDGE_DET IS
SIGNAL Q0 : STD_LOGIC;
SIGNAL Q1 : STD_LOGIC;
BEGIN
PROCESS
(
CLK,
RST
)
BEGIN
IF (RST = '1') THEN
Q0 <= '0';
Q1 <= '0';
ELSIF (RISING_EDGE(CLK)) THEN
Q0 <= D;
Q1 <= Q0;
END IF;
END PROCESS;
RE <= D AND (NOT Q0);
FE <= (NOT D) AND Q0;
SRE <= Q0 AND (NOT Q1);
SFE <= (NOT Q0) AND Q1;
END A;
И очень часто там применяется выражение типа DATA <= SRE OR SFE
Код
DATA_SEND_READY : GH_EDGE_DET
PORT MAP
(
CLK => CLK,
RST => RST,
D => DSRN,
SRE => DSRN_RE,
SFE => DSRN_FE
);
IDDSR <= DSRN_RE OR DSRN_FE;
Я заинтересовался этим, поскольку с "наскока" понять смысл данной операции невозможно.
Поковыряв этот модуль (GH_EDGE_DET) я обнаружил что его RTL описание, отображенное в виде схемы, очень похоже на то, что и в статьях про метастабильность триггера: так-же 2 D-триггера, идущих подряд. И решил разобраться в этой теме. Поскольку мне показалось, что автор приемопередатчика как раз и написал этот модуль, чтобы избавляться от метастабильности.
Я правильно понял задумку ?