Уровень 37: Память и Время
Задание
Соберите 8-битный регистр из D-триггеров. Регистр хранит 8 бит данных и обновляется по фронту тактового сигнала clk.
Модуль Reg8 принимает 8-битную шину in[7:0] и однобитный clk, на выходе — out[7:0].
Используйте конструкцию generate-for, чтобы инстанцировать 8 D-триггеров. Каждый DFF хранит один бит: q = d в момент фронта clk.
Ключевая идея: это первый sequential-уровень — симулятор обрабатывает такты последовательно, состояние сохраняется между тестами.
Материалы по теме
- D-триггер — умный запоминатель
- DFF — D-триггер
Решение
Регистр — это массив D-триггеров, каждый хранит один бит. Вместо того чтобы писать 8 строк кода вручную, используем generate-for.
generate-for — это робот-сборщик: он пространственно клонирует 8 DFF, расставляя их рядом друг с другом. Это НЕ цикл во времени: к моменту, когда схема заработает, «цикл» уже раскручен — на плате физически лежат 8 триггеров. Команды внутри generate-for выполняются на этапе сборки, а не при работе схемы.
- Объявите индексную переменную:
genvar i; - Откройте блок генерации:
generate - Цикл по 8 битам:
for (i = 0; i < 8; i = i + 1) begin : dff_gen - Внутри — один D-триггер на бит:
dff d(out[i], in[i], clk); - Закройте блок:
end endgenerate
Порядок портов DFF: (q, d, clk). Выход q становится out[i], вход d — in[i], а clk — общий для всех.
Симулятор подаёт тактовые сигналы через поле inClock каждого тестового вектора:
- Такт 0:
in = 42, фронт clk →out = 42 - Такт 1:
in = 42, clk = 0 →outсохраняет 42 - Такт 2:
in = 100, clk = 0 →outвсё ещё 42 - Такт 3:
in = 100, фронт clk →out = 100