Altifigence Academy

29 / 63 · Теория

Число состояний, ширина счётчика и неиспользуемые коды

Рассчитайте разрядность по диапазону счёта и определите восстановление из недопустимых состояний.

Счётчик тоже является конечным автоматом

Счётчику, повторяющему 0–9, нужны 10 состояний. Минимальная ширина хранения — ⌈log⁡210⌉=4\lceil\log_2 10\rceil=4 бита. Но 4-битный регистрРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее содержит 16 битовых шаблонов, поэтому одной правильной ширины недостаточно для modulo-10.

N=⌈log⁡2M⌉,unused codes=2N−MN=\left\lceil\log_2 M\right\rceil,\qquad \text{unused codes}=2^N-M

M — число состояний, а не максимум. Счёт от 0 до M-1 отличается от счёта от 0 до M. Если поддерживается параметр M=1, ограничьте ширину минимум одним битом и всегда удерживайте 0.

В 4-битном хранилище 16 кодов, но modulo-10 использует как нормальные только 10. После выбора ширины нужно добавить сравнение и политику восстановления.

Разрядность хранения и условие возврата задаются отдельно
  1. 10 состояний: Нормальные значения count: 0–9
  2. Хранение в 4 битах: 16 кодов; 10–15 — избыточные
  3. Следующее состояние: 0, если en=1 и count≥9

Состояния вне диапазона — тоже часть проекта

Что делать, если 4-битный modulo-10 по какой-либо причине оказался в 12? Можно доказать условия инициализации и сбросаСброс возвращает состояние к заданному начальному значению. Нужно определить, синхронен он или асинхронен и имеет ли приоритет над другими управляющими сигналами. Подробнее, исключающие это, либо возвращать в 0 при значениях от 9. Само восстановление не гарантирует устойчивости ко всем аппаратным отказам.

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

Этот пример восстанавливает неправильные значения 10–15 на фронте с en=1. При enable=0 они сохраняются. Если спецификация требует немедленного восстановления, нужно изменить приоритет условий.

Проверки ширины и функции независимы

Для 0–999 достаточно 10 бит, но свободное увеличение дойдёт до 1023. Нужны сравнение и выбор, возвращающие в 0 на заданном максимуме. В счётчиках адресов памяти, повторений и длины пакетов это различие приводит непосредственно к неверным обращениям или длинам.

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

Найдите минимальную ширину счётчика 0–99 и число неиспользуемых кодов. Что изменится, если просто прибавлять 1 с этой шириной?

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

100 состояний требуют 7 бит; неиспользуемых кодов 128−100=28128-100=28. Простое увеличение не возвращается после 99, а идёт до 127, создавая modulo-128 вместо modulo-100.

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