Найти тему
IT. Как это работает?

Verilog. Разбираемся с триггерами

Оглавление

Видео в конце...

Базовый элемент памяти

Базовым элементом памяти является триггер. Устройство, предназначенное для хранения одного бита информации.

Режимы работы RS-триггера
Режимы работы RS-триггера

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

Схема D-триггера
Схема D-триггера

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

Промышленные триггеры работают по фронту или спаду тактирующего сигнала.

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

Схема промышленного D-триггера
Схема промышленного D-триггера

При низком уровне тактового сигнала содержимое D записывается в зеленую половину, но как только низкий уровень тактирующего сигнала сменяется на высокий, содержимое зеленой половины записывается в красную. Состояние линии D записывается в триггер только по переднему фронту тактового сигнала. При этом записанный бит появляется на выходе Q.

Описание элемента памяти на языке Verilog

В языке Verilog для описания триггеров предусмотрена довольно простая конструкция. Это процедурный блок, где в списке чувствительности значится передний фронт тактового сигнала. Для переднего фронта предназначено слово posedge, для заднего фронта negedge.

Описание D-триггера на языке Verilog
Описание D-триггера на языке Verilog

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

Как мы помним, в состав логической ячейки ПЛИС кроме LUT таблицы входит еще элемент памяти. Это D-триггер с разрешением и асинхронным сбросом. Опишем такой элемент при помощи языка Verilog. Для того чтобы сбрасывать состояние триггера не зависимо от тактового сигнала, необходимо в списке чувствительности указать еще один сигнал, по фронту которого произойдет некоторое событие.

Описание D-триггера с асинхронным сбросом и разрешением
Описание D-триггера с асинхронным сбросом и разрешением

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

Промоделируем этот триггер. Для этого разработаем модуль теста.

Модуль теста триггера
Модуль теста триггера

Количество проводов соответствует количеству входов и выходов триггера. Вписываем триггер в состав теста. Соединяем его входы и выходы с проводами. Каждые 50 пикосекунд состояние тактовой линии будет меняться на противоположное. Чтобы это все заработало, нужно задать начальное состояние тактовой линии и сделать это можно в секции initial begin. В начальный момент времени среди всех входных сигналов и у тактовой линии есть какое-то состояние. Посмотрим результат моделирования.

Временные диаграммы триггера
Временные диаграммы триггера

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

Потом в тесте разрешим работу триггера (en=1) и отправим на некоторое время единицу на вход D. Как раз, в момент прихода переднего фронта тактового сигнала бит единица записался в триггер и оказался на его выходе. Как только состояние входного бита изменилось, то запись не произошла сразу, для записи опять же необходим передний фронт тактового сигнала. На этом этапе нужно особенно внимательно подойти к пониманию этих процессов, иначе потом будет непросто.

Использование элементов памяти в модулях поведенческого стиля описания

Теперь посмотрим как ненавязчиво создавать элементы памяти и не перегружать схемы структурным стилем описания. При структурном стиле мы вынуждены описывать экземпляры триггеров и соединять их проводами. Но все можно делать более незаметно. Ниже описание триггера и конъюнкции, причем запоминание результата происходит по переднему фронту тактового сигнала.

Упоминание про тактовый сигнал заставляется результат "запомниться"
Упоминание про тактовый сигнал заставляется результат "запомниться"

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

Триггеры-защелки (latch)

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

Устранение защелок в проектах
Устранение защелок в проектах

Но что делать когда разрешения нет? Это не ошибка, компилятор считает, что результат операции нужно сохранить до тех времен, пока не появится сигнал разрешения. А сохранить результат можно в триггере. Такие триггеры называют защелками.

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

Ранее мы рассматривали некоторые синтаксические конструкции и при помощи них создавали цифровые устройства.

Модуль мультиплексора и логического устройства
Модуль мультиплексора и логического устройства

И стоило бы нам ошибиться, как появился бы элемент памяти, который не ждали. Кстати, в конструкции case существует секция default. Она служит для того, чтобы не забыть описать что делать, если не все случаи описаны выше. Если не все опишем, то получим защелку.

Продолжение следует...

Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.