14 / 37 · Теория
Триггеры, enable и приоритет управления
Задайте хранение, загрузку и сброс функцией следующего состояния и избегайте непреднамеренного стробирования такта.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Регистр сохраняет результат функции следующего состояния
Обозначим значение перед фронтом , принятый на фронте вход , обновлённое значение . РегистрРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее с приоритетом reset перед enable:
При enable=0 изменение D не меняет сохранённое значение. Опустить этот путь хранения в последовательном RTL — не то же самое, что пропустить присваивание в комбинационной схеме. Хранение в последовательностном блоке является частью спецификации регистра.
module enabled_register (
input logic clk, rst, en,
input logic [7:0] d,
output logic [7:0] q
);
always_ff @(posedge clk) begin
if (rst) q <= 8'b0;
else if (en) q <= d;
end
endmoduleЭто синхронный reset с высоким активным уровнем. На фронте с reset=enable=1 сохраняется 0. Перестановка условий меняет функцию, поэтому фиксируйте приоритет не только в комментарии, но и в коде и тестах.
Каждый столбец — запись наблюдений одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны до фронта, состояния со словом «после» в имени — после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее. Изначально Q=0xA5: первый столбец — хранение, второй — запись, третий — конфликт reset и enable.
Показать данные диаграммы
| Сигнал | Диаграмма | Значения шины |
|---|---|---|
| фронт | 2345 | E0 → E1 → E2 → E3 |
| reset | 0.10 | |
| enable | 01.0 | |
| D | 2.34 | 3C → 99 → 77 |
| Q после | 234. | A5 → 3C → 00 |
Enable не должен произвольно обрезать тактовый сигнал
Использование произвольного выражения gated_clk = clk & en как такта может создавать короткие импульсы или неожиданные фронты при изменении en. Отображение RTL с clock enable на ячейки — задача синтеза и реализации. Стробирование такта для снижения мощности проектируют отдельно с подходящими ячейками и проверкой временных ограничений.
Приоритет проявляется при одновременных reset, load, enable. Поочерёдного включения каждого управления недостаточно. Например, при q=A5, en=0, d=3C значение сохраняется, а на следующем фронте с en=1 должно записаться 3C.
Попробуйте сами
При q=0xA5 проходит фронт с rst=1, en=1, d=0x3C, а следующий — с rst=0, en=0. Каково q после каждого из двух фронтов?
Прочитать объяснение
После первого фронта 0 из-за приоритета reset; после второго остаётся 0, поскольку enable=0. Если reset вложить внутрь en, можно пропустить сброс при en=0, поэтому эту комбинацию тоже проверяют отдельно.