Регистры: первый байт памяти
Один 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 (шина) | Clock | Q (выход) |
|---|---|---|---|
| До фронта | 42 (00101010) | 0 | старое значение |
| Фронт | 42 (00101010) | 0→1 | 42 (00101010) |
| После фронта | любое | 0 | 42 (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 регистров общего назначения — и программисты ведут за них настоящую битву при оптимизации.
Регистры живут прямо в ядре процессора, рядом с АЛУ: не нужно гонять сигнал по внешним шинам, данные бегут по коротким внутренним проводам. Отсюда и скорость.
Частые ошибки
- Подать на DFF разные тактовые сигналы — тогда биты запишутся в разное время, и на выходе получится «каша» из разновозрастных значений.
- Забыть Splitter или Maker: без них шина и отдельные DFF просто не соединятся друг с другом.
- Менять данные одновременно с фронтом — триггер должен увидеть стабильное значение на входе в момент перехода 0→1.
Резюме
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 — и увидишь свою первую «осязаемую» память.