Метастабильность и синхронизаторы

(По материалам статьи http://chernykh.net/content/view/646/)

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

Временные параметры триггера в момент возникновения состояния метастабильности и выхода из этого состояния приведены на рисунке. Время tSU (setup time) — это минимальное время перед синхроимпульсом, в течение которого логический уровень сигнала должен оставаться стабильным. Время tH (hold time) — это минимально необходимое время удержания стабильного сигнала на входе триггера после синхроимпульса. Задержка tCO (clock to output delay) — время срабатывания триггера. Время состояния метатастабильности случайно и зависит от многих параметров. На рисунке оно обозначено tMET.

Метастабильное состояние не всегда приводит к неправильной работе цифрового устройства. Если время ожидания устройства после прихода импульса синхронизации достаточно велико, то триггер может успеть перейти в устойчивое состояние, и мы даже ничего не заметим. То есть если мы будем учитывать время метастабильности tMET то метастабильность никак не скажется на работе остальной цифровой схемы.

Если же это время будет неприемлемым для работы схемы, то можно поставить два триггера последовательно, как это показано на рисунке. Это снизит вероятность возникновения метастабильного состояния.

Еще одна хорошая статья: "Что такое метастабильное состояние и как с ним бороться?".

Синхронизатор

Пример синхронизатора на языке Verilog:

module synchronizer (
    input clk, 
    input reset, 
    input din,
    output dout
);
    reg d;
    always @(posedge clk, posedge reset) begin
        if (reset) begin
            d <= 0;
            dout <= 0;
        end else begin
            d <= din;
            dout <= d;
        end
    end 
endmodule
 
proj/xilinx/synchronizers.txt · Последние изменения: 2009/06/05 07:07 vak
 
Copyright (C) 1996-2013 Serge Vakulenko
serge@vak.ru