Уровень 37: Память и Время

Открыть уровень →

Задание

Соберите 8-битный регистр из D-триггеров. Регистр хранит 8 бит данных и обновляется по фронту тактового сигнала clk.

Модуль Reg8 принимает 8-битную шину in[7:0] и однобитный clk, на выходе — out[7:0].

Используйте конструкцию generate-for, чтобы инстанцировать 8 D-триггеров. Каждый DFF хранит один бит: q = d в момент фронта clk.

Ключевая идея: это первый sequential-уровень — симулятор обрабатывает такты последовательно, состояние сохраняется между тестами.

Материалы по теме

Решение

Регистр — это массив D-триггеров, каждый хранит один бит. Вместо того чтобы писать 8 строк кода вручную, используем generate-for.

generate-for — это робот-сборщик: он пространственно клонирует 8 DFF, расставляя их рядом друг с другом. Это НЕ цикл во времени: к моменту, когда схема заработает, «цикл» уже раскручен — на плате физически лежат 8 триггеров. Команды внутри generate-for выполняются на этапе сборки, а не при работе схемы.

  1. Объявите индексную переменную: genvar i;
  2. Откройте блок генерации: generate
  3. Цикл по 8 битам: for (i = 0; i < 8; i = i + 1) begin : dff_gen
  4. Внутри — один D-триггер на бит: dff d(out[i], in[i], clk);
  5. Закройте блок: end endgenerate

Порядок портов DFF: (q, d, clk). Выход q становится out[i], вход din[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
Схема решения уровня 37 — Память и Время
Авторское решение уровня 37 в симуляторе (тёмная тема)