Altifigence Academy

14 / 37 · Теория

Триггеры, enable и приоритет управления

Задайте хранение, загрузку и сброс функцией следующего состояния и избегайте непреднамеренного стробирования такта.

Регистр сохраняет результат функции следующего состояния

Обозначим значение перед фронтом QkQ_k, принятый на фронте вход DkD_k, обновлённое значение Qk+1Q_{k+1}. РегистрРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее с приоритетом reset перед enable:

Qk+1={0rk=1Dkrk=0, ek=1Qkrk=0, ek=0Q_{k+1}=\begin{cases} 0 & r_k=1\\ D_k & r_k=0,\ e_k=1\\ Q_k & r_k=0,\ e_k=0 \end{cases}

При enable=0 изменение D не меняет сохранённое значение. Опустить этот путь хранения в последовательном RTL — не то же самое, что пропустить присваивание в комбинационной схеме. Хранение в последовательностном блоке является частью спецификации регистра.

SystemVerilog
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.

Приоритет reset, enable и удержания
Показать данные диаграммы
Данные диаграммы: каждый символ — один интервал; точка сохраняет предыдущее состояние; p — один тактовый цикл.
СигналДиаграммаЗначения шины
фронт2345E0 → E1 → E2 → E3
reset0.10
enable01.0
D2.343C → 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, поэтому эту комбинацию тоже проверяют отдельно.

Выбор действует в этом браузере. Его можно изменить внизу страницы.