Последовательностная логика. Триггеры
Особенность организации двухступенчатых триггеров заключается в применении схем инверсии сигнала синхронизации либо схем запрещающих связей. Изменение сигналов на входе при фронте (спаде) сигнала синхронизации не вызывает изменение сигналов на выходе триггера. Такое поведение триггера называется свойством непрозрачности.
Ошибка метастабильности триггеров
Метастабильность триггеров - это состояние, в котором триггер может находиться в промежуточном, непостоянном состоянии, не находясь при этом в устойчивом нулевом или единичном состоянии. Это явление характерно для систем, в которых триггер может реагировать на входные сигналы, но обладает определённым временем задержки.
Метастабильность возникает, когда триггер сталкивается с изменениями на входе, которые происходят слишком быстро относительно его времени отклика. В таких случаях он может оказаться в промежуточном состоянии, что может привести к непредсказуемому поведению.
Примером является D-триггер, который может стать метастабильным, если на его вход подается сигнал, когда триггер находится в состоянии изменения. Это происходит, например, при использовании триггеров в цифровых схемах, где синхронизация осуществляется на низкой частоте, относительно входных сингалов. В литературе [1,4,5] приводятся подробные выкладки с диаграммами, поясняющими природу данной ошибки.
Явление метастабильности невозможно полностью исключить, но возможно снизить риск ее возникновения. Для этого применяются следующие подходы:
- Увеличение времени стабилизации. Увеличение времени формирования и установки входных сигналов может помочь триггеру стабилизироваться. Это позволяет триггеру успеть нормально реагировать на изменения во входных данных до их следующего изменения.
-
Синхронизация с тактовыми сигналами. Использование синхронизирующих триггеров для согласовывания асинхронных сигналов с тактовыми позволяет уменьшить вероятность метастабильности. Это достигается путём передачи входного сигнала через несколько последовательных триггеров, что даёт время для стабилизации (рисунок 3.15). Возникновение метастабильности на первом триггере не приведет к искажению сигнала на выходе третьего.
В приложении А приводится механизм преодоления метастабильности с применением языка описания аппаратуры Verilog HDL.
- Уменьшение частоты изменения сигналов на входах триггера либо увеличение частоты также может сильно снизить риск метастабильных состояний.
Важно! Необходимо прояснить по поводу видов синхросигналов в цепях последовательностных устройств. По "фронту синхросигнала" либо по "переднему фронту" значит, что схема записывает данные при переходе синхросигнала из низкого уровня в состояние лог. "1". По "заднему фронту" или "спадающем фронту" синхросигнала значит, что схема будет срабатывать и осуществлять запись данных в цепях при переходе синхросигнала из высокого уровня в состоянии низкого уровня. В период этого перехода происходит обработка данных. На рисунке 3.16 показано обозначение этих самых динамических входов по "фронту" и по "спаду" для ANSI и ЕСКД (а), Logisim Evoluion(б).
В лабораторной работе 2 необходимо выполнить проектирование двухступенчатого D-триггера.
Свойство непрозрачности МS-триггера использовано для построения интересного и широко применяемого JК-триггера, схема которого показана на рисунке 3.17. JK-триггер является наиболее используемым из всех конструкций триггеров и считается универсальной схемой триггера.
Схема JK-триггера похожа на SR, а его последовательная работа точно такая же. Разница в том, что JK-триггер не имеет недействительных или запрещенных входных состояний как SR, даже когда на оба входа подается управляющий сигнал.
JК-триггер - это непрозрачный триггер, выходы которого петлями инвертирующих обратных связей (накрест) заведены на элементы 1 и 2 (2И-НЕ). Из-за данных связей система моделирования Logisim Evolution не может смоделировать JK-триггер на дискретных комбинационных элементах.
При J=К=0 С-сигнал не может открыть входные элементы 1 и 2, и триггер находится в режиме хранения. При J=1, К=0 синхросигналом может быть открыт лишь элемент 1 и только при условии, что перед поступлением С-сигнала на выходе триггера был 0 (Q=0, ). Тогда по спаду синхросигнала триггер переключится в 1. Если же триггер до синхросигнала был в 1, то он так и останется в этом состоянии. Таким образом, J-вход выполняет функции синхронизированного S-входа. В силу симметрии схемы легко показать, что К-вход выполняет функции синхронизированного R-входа, переводя триггер в сброшенное состояние. Таким образом, при разноименных уровнях на J и К-входах JК-триггер ведет себя как синхронный непрозрачный RS-триггер. При сигнале на J=K=1 поведение JК-триггера сильно отличается от SR. При любом состоянии триггера обратные связи при поступлении С-сигнала откроют тот элемент И-НЕ, который переведет триггер в противоположное состояние. Таким образом при J=K=1 триггер переключается в противоположное
состояние. Данный режим называется счетным или T (toggle - кувыркаться), а работающий в таком режиме триггер называется Т-триггером.
В таблице 3.4 приведена таблица истинности (работы) JK- триггера.
C | J | K | Q(T) | Q(t+1) | Пояснения |
---|---|---|---|---|---|
0 | X | X | 0 | 0 | Режим хранения |
0 | X | X | 1 | 1 | |
1 | 0 | 0 | 0 | 0 | |
1 | 0 | 0 | 1 | 1 | |
1 | 0 | 1 | 0 | 1 | Режим сброса |
1 | 0 | 1 | 1 | 1 | |
1 | 1 | 0 | 0 | 0 | Режим установки |
1 | 1 | 0 | 1 | 0 | |
1 | 1 | 1 | 0 | 1 | J=K=1, счетный режим |
1 | 1 | 1 | 1 | 0 |
На рисунке 3.18а приведено условно-графическое обозначение синхронного JK-триггера в ANSI, а на рисунке 3.18б в ЕСКД.
Т-триггер представляет собой триггер, у которого отсутствуют сигналы J и К, а тактирование осуществляется по счётному входу Т. Синхронный Т триггер объединяет для счетного входа J и K. Вход C остается включенным так, как показано на рисунке 3.17. Т-триггер в силу особенностей обратных связей в среде невозможно смоделировать на дискретных элементах Logisim Evolution.
В таблице 3.5 приведена таблица истинности для синхронного Т триггера.
C | T | Q(t) | Q(t+1) | Пояснения |
---|---|---|---|---|
0 | X | 0 | 0 | Режим хранения |
0 | X | 1 | 1 | |
1 | 0 | 0 | 0 | |
1 | 0 | 1 | 1 | |
1 | 1 | 0 | 1 | Режим установки |
1 | 1 | 1 | 0 | Режим сброса |
На рисунке 3.19а приведено условно-графическое обозначение синхронного T-триггера в ANSI, а на рисунке 3.19б в ЕСКД.
Триггеры могут быть взаимозаменяемыми при изменении схемы включения и добавления элементов комбинационной логики. Решение задачи взаимозаменяемости триггеров осуществляется в практической работе 3.
В среде Logisim Evolution в разделе "Память" находятся синхронные триггеры. Разработчики обеспечили защиту виртуальных элементов от неверного срабатывания, например, "гонки сигналов".
В таблице 3.6 приведено условно-графическое обозначение данных триггеров, а также назначение сигналов. Для всех синхронных триггеров в их основным свойством является срабатывание, определяющее вид синхросигнала, переключающего триггер в заданное состояние:
- "Передний фронт" - по фронту синхросигнала;
- "Задний фронт" - по спаду синхросигнала;
- "Высокий уровень" - статический вход управления лог. "1";
- "Низкий уровень" - статический вход управления лог. "0".
Вид триггера | Условно-графическое обозначение | Назначение сигналов |
---|---|---|
Синхронный D-триггер |
1 - синхронный D вход; 2 - вход синхронизации (С); 3 - асинхронный вход S; 4 - асинхронный вход R; 5 - прямой выход Q; 6 - инверсный выход Q. |
|
Синхронный T-триггер |
1 - синхронный T вход; 2 - вход синхронизации (С); 3 - асинхронный вход S; 4 - асинхронный вход R; 5 - прямой выход Q; 6 - инверсный выход Q. |
|
Синхронный JK-триггер |
1 - синхронный J вход; 1 - синхронный K вход; 3 - вход синхронизации (С); 4 - асинхронный вход S; 5 - асинхронный вход R; 6 - прямой выход Q; 7 - инверсный выход Q. |
|
Синхронный SR-триггер |
1 - синхронный J вход; 2 - синхронный K вход; 3 - вход синхронизации (С); 4 - асинхронный вход S; 5 - асинхронный вход R; 6 - прямой выход Q; 7 - инверсный выход Q. |
Лабораторная работа 3. "Двухступенчатого триггера"
Целю лабораторной работы является:
- Закрепление навыков работы с триггерами путем реализации двухступенчатого триггер DV.
- Получение навыков работы с инструментом симуляции "Хронограмма".
В среде Logisim Evolution создать новый файл и сохранить его под именем DV. Построить схему, приведенную на рисунке 3.20. На элементах D3, D4 реализован ведущий RS триггер. Элементы D1, D2 образуют комбинационную схему, реализующую функцию синхронизации и работы линии D. На элементах D5-D8 реализован синхронный SR-триггер. Его синхронизация осуществляется в противофазе входному сигналу С за счет включения в линию инвертора D9.
Попеременно подавая сигналы на входы D и С, необходимо убедится в работоспособности собранной схемы.
Для работы с инструментом "Хронограмма7quot; подключить элемент "выход" к линиям S и R и выходу инвертора D9 (рисунок 3.21).
Далее вызвать перейти в меню "Моделировать" - "Запись в журнал". Во вкладке "Options" в секции "Logging Mode" выбрать "Clocked mode". В открывшемся диалоговом окне, аналогичному приведенному на рисунке 3.12 выбрать в качестве синхронизируемого входа - С. В выпадающем списке "Time scale" задать "1.0 s". В списке "Clock Discipline" выбрать "capture on both edges". В меню "Моделировать" тактовая частота задать 2 Гц и выбрать такты включены. Перейти во вкладку "Хронограмма" (рисунок 3.22). В меню быстрого доступа нажать на кнопку "Запускайте симулятор непрерывно" (выделена на рисунке областью красного цвета).
На рисунке 3.23 приведена диаграмма работы триггера. На ней можно видеть режимы сброса триггера при включении, переходы в период смены сигнала на входе.
Для обеспечения стабильной работы триггера защелки на высоких частотах разработчики могут вводить дополнительный вход управления записью - стробирование, именуемый V. Видоизменим схему, добавив еще один вход элементам D1 и D3. Вход V объединяется у элементов D1 и D2 (рисунок 3.24).
Самостоятельно
- Реализовать схему двухступенчатого синхронного D-триггера с запрещающими связями (рисунок 3.25).
- Получить для него временную диаграмму, используя инструмент "Хронограмма".
- Дать описание его работы.
- Определить отличие в работе от D-триггера, описанного выше.
В среде Quartus на языке Verilog HDL требуется создать два вида двухтактных триггеров и разработать тесты. В листинге 3.1 приведен код для двухтактной защелки, которая управляется уровнем сигнала на входе clk.
module latch_MS (input clk,D, output reg Q); reg c; \\ регистровая переменная с always @(*) if (clk) \\если на входе лог. 1 c=D; \\присвоить переменной значение с D always @(*) \\анализируем уход лог 1 с входа d if (~clk) Q=c; \\выходу Q присвоить содержимое с EndmoduleЛистинг 3.1.
На рисунке 3.26 представлен вид RTL для данного листинга.
В листинге 3.2 приведен код двухтактного триггера, анализирующего перепад за счет ввода ключевых слов, анализирующих сигнал posedge - по фронту сигнала, negedge - по спаду. Также присваивание = заменено на <=, что будет более правильным вариантом записи, исключающим "гонку сигналов".
module latch_MS1 (input clk, D, output reg Q); reg master; // переменная ведущего триггера reg slave; // переменная подчиненного триггера // проверяем возникновение фронта сигнала clk always @(posedge clk) begin master <= D; // Capture data on the rising edge of the clock end // проверяем изменение синхронизации на спад always @(negedge clk) begin slave <= master; // передача данных между регистровыми переменными end // анализируем изменения сигналов always @(*) begin Q = slave; // выходу присваивается содержимое ведомого триггера end endmoduleЛистинг 3.2.
На рисунке 3.27 представлен вид RTL для листинга 3.2.
В листинге 3.3 приведено содержимое файла testbench.v для двухтактного синхронного триггера.
module testbench; reg D; // вход D reg clk; // синхровход clk wire Q; // Выход Q // привязка линий триггера latch_MS1 uut ( .D(D), .clk(clk), .Q(Q) ); // генерация сигнала initial begin clk = 0; forever #5 clk = ~clk; // цикл синхросигналов end initial begin // Начальное состояние на линии D D = 0; // задержка #10; // тестирование такта 1 D = 1; #10; // период ожидание $display("D=%b, Q=%b", D, Q); // Check outputs // тестирование такта 2 D = 0; #10; $display("D=%b, Q=%b", D, Q); // тестирование такта 3 D = 1; #10; $display("D=%b, Q=%b", D, Q); // тестирование такта 4 состояния итог D = 0; #10; $display("D=%b, Q=%b", D, Q); // окончание симуляции $stop; end endmoduleЛистинг 3.3.
На рисунке 3.28 приведена диаграмма тестирования синхронного триггера.
Самостоятельно
- Добавить описание инверсного выхода триггера - Qn.
- Добавить дополнительно вход управления V.
- Разработать код теста с учетом добавленных сигналов. Выполнить симуляцию.
Практическая работа 3. "Замещение триггеров"
На рисунке 3.29 приведен вариант реализации синхронного SR-триггера на D-триггере.
Ниже на рисунке 3.30 показана временная диаграмма работы триггера, с использованием инструмента "Хронограмма". Диаграмма реализована на частоте 1Гц. (во вкладке "Options" качестве "Clock Source" задан вход С). По данной диаграмме проводится сверка с диаграммой работы для синхронного SR-триггера Logisim Evolution. Далее проверятся условие перехода триггера из индивидуального задания в запрещенное состояние.
Задание выполняется по варианту из таблицы 3.7
№ варианта | Создаваемые синхронные триггеры | Базовый триггер | Срабатывание базового триггера |
---|---|---|---|
1,7,13,19 | JK, T | D | Передний фронт |
2,8,14,20 | JK, T | D | Задний фронт |
3,9,15,21 | D, T | SR | Передний фронт |
4,10,16,22 | D, TC | SR | Задний фронт |
5,11,17,23 | SR, T | JK | Передний фронт |
6,12,18,24 | SR, T | JK | Задний фронт |
В таблице 3.8 приведено структурное описание на языке Verilog HDL SR-триггера, также приведен его тест.
Необходимо реализовать структурное описание JK-триггера на языке Verilog HDL и разработать тестовое окружение.
Описание триггера | Тестовое окружение триггера |
---|---|
module sr_latch ( input wire S, //установка (Set) input wire R, //сброс (Reset) output wire Q, //выход Q output wire Qn //выход Qn (инверсный) ); wire n1, n2; //внутренние соединения // первый NAND элемент nand (n1, S, Qn); // второй NAND элемент nand (n2, R, Q); assign Q = n1; //выход Q assign Qn = n2; //выход Qn endmodule |
module testbench; reg S; //установка reg R; //сброс wire Q; //выход Q wire Qn; //выход Qn // связывание SR-триггера sr_latch uut ( .S(S), .R(R), .Q(Q), .Qn(Qn) ); initial begin // Инициализация S = 0; R = 0; // тестовые сигналы #10 S = 1; R = 0; // установить триггер //в 1 #10 S = 0; R = 1; // сбросить триггер в //0 #10 S = 0; R = 0; // хранение #10 S = 1; R = 0; //установить Q в 1 снова #10 S = 0; R = 1; //сбросить Q в 0 $finish; //завершить симуляцию end // вывод состояний initial begin $monitor("Time: %0t | S = %b, R = %b | Q = %b, Qn = %b", $time, S, R, Q, Qn); end endmodule |
Результат симуляции представлен на рисунке 3.31.
Дать ответы на следующие вопросы:
- В чем отличие синхронного триггера от асинхронного?
- Что такое запрещенное состояние, как можно избавиться от запрещенного состояния в асинхронном триггере?
- Какие входы синхронные или асинхронные имеют приоритет и почему (пояснить на схеме двухтактного триггера)?
- Для чего в D триггер вводится сигнал V?
Приложение А
Для преодоления метастабильности можно увеличить времени на установку (setup time), путем задания задержки входного сигнала.
Для реализации необходимо создать описание D-триггера (листинг 3.4).
module D_dff ( input wire D, input wire clk, input wire reset, output reg Q ); reg D_reg; always @(posedge clk or posedge reset) begin if (reset) begin D_reg <= 0; end else begin D_reg <= D; end end always @(posedge clk or posedge reset) begin if (reset) begin Q <= 0; end else begin Q <= D_reg; end end endmoduleЛистинг 3.4.
Далее создается файл, выполняющий задержку распространения сигнала (листинг 3.5).
module D_meta( input wire clk, input wire D, output wire Q ); reg D_stable; // Задержка входного сигнала D always @(posedge clk) begin // Обновление только если clk высокий достаточно долго D_stable <= D; end // подключение D-триггера D_dff ( .D(D_stable), .clk(clk), .reset(1'b0), .Q(Q) ); EndmoduleЛистинг 3.5.
На рисунке 3.32 приведено RTL представление полученного триггера.
Для создания схемы преодоления метастабильности с применением нескольких триггеров создадим базовый D-триггер (листинг 3.4) и файл верхнего уровня, приведенный в листинге 3.6
module D_meta ( input wire D, input wire clk, output wire Q ); wire D_intermediate; // Первый триггер D_dff first_ff( .D(D), .clk(clk), .reset(1'b0), .Q(D_intermediate) ); // Второй триггер D_dff second_ff ( .D(D_intermediate), .clk(clk), .reset(1'b0), .Q(Q) ); EndmoduleЛистинг 3.6.
На рисунке 3.33 приведено RTL представление полученного триггера.
Дополнительная литература
- Микушин А.В. Цифровые устройства и микропроцессоры: учебн. пособие. - СПб.: БХВ-Петербург, 2010 - 832 с.: ил. (С. 107 - 117).
- Угрюмов Е.П. Цифровая схемотехника: учеб. пособие для вузов. - 2-е изд., перераб. и доп. СПб.: БХВ-Петербург, 2007. - 800 с.: ил. (С. 179 -194).
- С. Харрис, Д. Харрис. Цифровая схемотехника и архитектура компьютера RISC-V/ пер. с англ. В.С. Яценкова, А.Ю. Романова; под. ред. А.Ю. Романова.-М.: ДМК Пресс, 2021. - 810 с.: ил. (С. 151-154)
- Неизвестное об известном, или что такое метастабильность триггеров
- Еще о метастабильности