Регистры: первый байт памяти

Один D-триггер — это прекрасно, но он может запомнить всего один жалкий бит. Компьютеры же любят работать с более крупными порциями данных, например, с байтами (8 бит).

Решение уровня «Осязаемая память»: 8-битный регистр из восьми D-триггеров
8-битный регистр: авторское решение уровня

Как сделать память на целый байт? Элементарно! Берём восемь D-триггеров и ставим их в ряд. Затем соединяем все их входы Clock одним общим проводом. Теперь по одному «тику» все восемь триггеров одновременно откроют свои двери и запомнят 8-битную комбинацию нулей и единиц, пришедшую по информационной шине.

Такая связка называется регистром. Регистры — это сверхбыстрые «карманы» процессора. Если обычная оперативная память (ОЗУ) — это огромный склад, куда нужно долго идти за данными, то регистры лежат прямо под рукой у АЛУ. Именно в них процессор держит те числа, с которыми выполняет математические операции прямо сейчас.

Восемь триггеров в ряд

Register8 — это восемь независимых DFF с общим тактовым входом. Каждый триггер хранит свой бит, а все вместе — целый байт. Про каждый такой триггер мы говорили в статье про тактовый генератор и D-триггер: напомним, что DFF запоминает значение входа только по фронту Clock.

В игре регистр собирается из трёх блоков: Splitter разбирает входную шину на 8 отдельных битов, восемь DFF хранят эти биты, а Maker собирает их обратно в 8-битную шину. Выход подключается к LED8 — светодиоды показывают, что именно запомнил регистр: горящий светодиод — 1, погашенный — 0.

Параллелизм: все биты записываются одновременно

Ключевое слово — одновременно. Если соединить все восемь входов Clock общим проводом, фронт тактового сигнала дойдёт до каждого DFF практически в один и тот же момент, и все восемь битов запишутся за один такт. Именно так регистры работают в реальном процессоре: одно событие — фронт — обновляет сразу все ячейки.

Число битов в регистре — это его «разрядность». Восемь триггеров — 8-битный регистр, шестнадцать — 16-битный. Разрядность определяет, какие числа помещаются в регистр: 8 бит — это числа от 0 до 255, и любое из них влезает в наш байт.

Как записать число в регистр

Запись происходит по фронту Clock. До фронта на шине данных должно стоять нужное значение — именно оно и попадёт в триггеры. После фронта вход можно менять сколько угодно: регистр будет хранить старое значение до следующего фронта.

МоментData (шина)ClockQ (выход)
До фронта42 (00101010)0старое значение
Фронт42 (00101010)0→142 (00101010)
После фронталюбое042 (00101010) — хранится

У готового чипа Register, который ты получишь в награду за уровень, есть ещё вход WE (Write Enable): запись разрешена только когда WE=1. Это «дверь» регистра — пока она закрыта, данные внутрь не попадут.

Числовой пример: сохраняем 42

Разберём по шагам, как в регистр попадает число 42. В двоичной системе 42 = 00101010, то есть 32 + 8 + 2.

1. Выставляем на шине Data значение 42: биты принимают вид 0 0 1 0 1 0 1 0.

2. Splitter разбирает шину: первый DFF получает младший бит 0, второй — 0, третий — 1, и так далее до старшего бита 0.

3. Подаём фронт Clock — все восемь триггеров одновременно запоминают свои биты.

4. Проверяем выход: Maker собирает биты обратно — на выходе снова 00101010, то есть 42.

5. Меняем Data на что угодно — регистр по-прежнему выдаёт 42, пока не придёт следующий фронт.

Запись «42 в регистр» и чтение «42 из регистра» идут через одну и ту же шину — различается только направление. Это свойство пригодится, когда мы соединим память и процессор: читай статью про Harvard-архитектуру.

Почему регистры такие быстрые

Практический пример. Регистр — самая быстрая память в компьютере. Доступ к нему занимает около 0.3 наносекунды. Для сравнения: чтение из оперативной памяти (ОЗУ) — 10 наносекунд, а с жёсткого диска — 10 миллисекунд (в 30 миллионов раз медленнее!). Именно поэтому процессор держит текущие данные в регистрах, а не гоняет их туда-сюда из ОЗУ. В x86-процессорах всего 16 регистров общего назначения — и программисты ведут за них настоящую битву при оптимизации.

Регистры живут прямо в ядре процессора, рядом с АЛУ: не нужно гонять сигнал по внешним шинам, данные бегут по коротким внутренним проводам. Отсюда и скорость.

Частые ошибки

Резюме

1. Регистр — это несколько D-триггеров с общим тактовым входом; восемь триггеров образуют 8-битный регистр.

2. Все биты записываются одновременно по одному фронту Clock — это параллелизм в действии.

3. В игре регистр собирается из Splitter + 8×DFF + Maker, а выход показывается на LED8.

4. Запись и чтение идут через одну шину; готовый чип Register добавляет вход WE — разрешение записи.

5. Регистры — самая быстрая память: около 0.3 нс против 10 нс у ОЗУ и 10 мс у диска.

6. Несколько регистров и общая шина данных — первый шаг к настоящему процессору (Harvard-архитектура).

На уровне 1.12 тебе предстоит собрать 8-битный регистр: Splitter разберёт шину на 8 битов, восемь D-триггеров запомнят их по общему фронту Clock, а Maker соберёт биты обратно в байт. Подключи выход к LED8 — и увидишь свою первую «осязаемую» память.

Попробовать в симуляторе →