Altifigence Academy

16 / 37 · Теория

Модульные и насыщающие счётчики, импульс завершения

Задайте обработку максимума и точный цикл сигнала terminal-count.

Три разные политики выхода за диапазон

Даже для одного N-битного регистраРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее возврат к началу, удержание максимума и сообщение об ошибке — разные спецификации.

Cnextwrap=(C+1) mod 2NC_{next}^{wrap}=(C+1)\bmod2^N
Cnextsat=min⁡(C+1,2N−1)C_{next}^{sat}=\min(C+1,2^N-1)

8-битный модульный счётчик, выдающий 0 после 255, отличается от насыщающего, остающегося на 255. Накопитель с положительными и отрицательными значениями требует учёта signed-диапазона и обеих границ насыщения.

Каждый столбец — запись наблюдения одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны непосредственно перед фронтом, состояния со словом «после» в имени — сразу после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее.
Начально count=8, reset=0, enable=1. При одинаковых входах modulo-10, 4-битный циклический и 4-битный насыщающий счётчики идут по разным траекториям.

Три политики после максимального значения
Показать данные диаграммы
Данные диаграммы: каждый символ — один интервал; точка сохраняет предыдущее состояние; p — один тактовый цикл.
СигналДиаграммаЗначения шины
фронт234523452E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8
mod10 после2345234529 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7
wrap4 после2345234529 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1
sat4 после2345234..9 → 10 → 11 → 12 → 13 → 14 → 15

Сравнение с последним состоянием modulo-M

Для импульса каждые 10 событий используйте состояния 0–9 и считайте только действительные фронты с enable. Можно зарегистрировать pulse со смыслом «на этом фронте обработана 9 и выполнен возврат к 0».

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    count <= 4'd0;
    pulse <= 1'b0;
  end else begin
    pulse <= 1'b0;
    if (en) begin
      if (count == 4'd9) begin
        count <= 4'd0;
        pulse <= 1'b1;
      end else count <= count + 4'd1;
    end
  end
end

Присваивание pulse по умолчанию возвращает его к 0 на следующем фронте. Простой выход count==9 может оставаться 1 много циклов, если enable остановлен в 0. Различайте конечное состояние и событие завершения.

Откуда отсчитывать период

После reset с count=0 первый pulse появляется лишь после 10 фронтов с enable=1. Важнее последовательно определять таблицу входов, состояния и выхода, чем называть первый фронт нулевым или первым.

Интерактивный счётчик здесь — modulo-16. От начального 1110 один фронт даёт 1111, следующий — 0000. Остановите его в 1111 с enable=0. Хранение и насыщение выглядят одинаково до возобновления, после которого поведение различается. Сравните с тем, какое значение должен дать насыщающий счётчик в тех же условиях.

Остановка или циклический переход на максимуме 4 бит

Синхронный сброс приоритетнее enable. При enable=0 сохранённое значение удерживается. q=1110; q_next = (q + 1) mod 16

Попробуйте сами

В схеме выше count=9, pulse=0. Проходят два фронта с en=0, затем один с en=1. Как меняются count и pulse?

Прочитать объяснение

На двух остановленных фронтах count=9, pulse=0. На третьем count=0, pulse=1. На следующем фронте присваивание по умолчанию вернёт pulse=0.

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