16 / 37 · Теория
Модульные и насыщающие счётчики, импульс завершения
Задайте обработку максимума и точный цикл сигнала terminal-count.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Три разные политики выхода за диапазон
Даже для одного N-битного регистраРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее возврат к началу, удержание максимума и сообщение об ошибке — разные спецификации.
8-битный модульный счётчик, выдающий 0 после 255, отличается от насыщающего, остающегося на 255. Накопитель с положительными и отрицательными значениями требует учёта signed-диапазона и обеих границ насыщения.
Каждый столбец — запись наблюдения одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны непосредственно перед фронтом, состояния со словом «после» в имени — сразу после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее.
Начально count=8, reset=0, enable=1. При одинаковых входах modulo-10, 4-битный циклический и 4-битный насыщающий счётчики идут по разным траекториям.
Показать данные диаграммы
| Сигнал | Диаграмма | Значения шины |
|---|---|---|
| фронт | 234523452 | E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8 |
| mod10 после | 234523452 | 9 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 |
| wrap4 после | 234523452 | 9 → 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».
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. Хранение и насыщение выглядят одинаково до возобновления, после которого поведение различается. Сравните с тем, какое значение должен дать насыщающий счётчик в тех же условиях.
Синхронный сброс приоритетнее 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.