Тактовый генератор и D-триггер

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

Решение уровня «D-триггер»: DFF запоминает значение по фронту Clock
D-триггер: авторское решение уровня

Этим дирижёром выступает тактовый генератор (Clock). Он выдаёт стабильный пульс: тик-так, 1-0, 1-0. Знакомые всем гигагерцы (GHz) в характеристиках ПК — это как раз скорость этого пульса: миллиарды тиков в секунду.

Чтобы память слушалась дирижёра, инженеры придумали D-триггер. Он делает то же самое, что и SR-защёлка, но с одним важным условием: обновляет свою память строго в момент «тика» тактового генератора — по фронту, когда Clock переходит с 0 на 1. Всё остальное время он глух к изменениям на входе. Благодаря этому синхронному пульсу данные по процессору текут упорядоченно и без ошибок.

Зачем схеме дирижёр

Вспомни комбинационные схемы из прошлых уровней: их выход меняется мгновенно вслед за входами. Но как только появляется память — SR-защёлки, регистры — в игру входит время. Если каждая защёлка запоминала бы данные в случайный момент, результат зависел бы от микроскопических задержек проводов: кто-то успел, кто-то опоздал — и процессор выдал бы мусор.

Решение — договориться: пусть все ячейки памяти обновляются только в один, строго определённый момент. Такой момент задаёт тактовый генератор — один общий провод, по которому бежит регулярный пульс из 1 и 0. Пока сигнал бежит, комбинационная логика считает; по фронту все триггеры одновременно «фотографируют» свои входы.

Тактовый генератор: миллиарды ударов в секунду

Частота процессора — это количество таких фронтов в секунду. Процессор с частотой 3.5 GHz делает 3.5 миллиарда тактов в секунду, и длина одного такта — всего 1 / 3 500 000 000 ≈ 0.28 наносекунды. За это время сигнал должен пробежать через десятки вентилей, дойти до нужных триггеров и стабилизироваться — поэтому разработчики так тщательно проектируют критические пути.

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

D-триггер: память, которая слышит только команды

DFF (D Flip-Flop) — «умная» версия SR-защёлки из статьи про магию обратной связи. У него два входа: D (данные) и Clock. В момент фронта (переход Clock с 0 на 1) он запоминает значение на входе D и держит его до следующего фронта. Между фронтами триггер игнорирует любой шум на входе D — именно это отличает его от «прозрачной» защёлки, которая всё время следит за входом.

В игре DFF строится по схеме master-slave из четырёх NAND: первая пара (master) принимает данные, когда Clock=1, вторая пара (slave) запоминает их, когда Clock=0. На выходе всегда стабильное значение, записанное на последнем фронте. На уровне уже стоит готовый тактовый генератор — осталось подключить его к триггерам.

Таблица поведения D-триггера

D перед фронтомФронт ClockQ после фронта
00→10
10→11
ЛюбоеНет фронтаQ не меняется

Первые две строки — запись бита по фронту. Третья строка — самая главная: без фронта ничего не происходит. Какой бы «грязный» сигнал ни пришёл на D между тактами, выход останется прежним.

Три такта на временно́й шкале

Проследим за триггером на временно́й шкале из трёх тактов, в которые мы хотим записать биты 1, 0 и 1.

1. Перед первым фронтом подаём D=1. В момент перехода 0→1 триггер захватывает единицу: Q=1.

2. Между тактами сигнал «гуляет»: D прыгает 0→1→0. Это шум, но фронта нет — и Q упрямо остаётся 1.

3. Перед вторым фронтом D=0. По фронту триггер записывает 0: Q=0.

4. Перед третьим фронтом D=1. По фронту Q становится 1.

В конце шкалы в триггере лежит последнее записанное значение — 1. Мы записали три бита за три такта, и ни один шум ничего не испортил. Теперь соедини несколько триггеров общим Clock — и получится честный регистр, про который читай статью «Регистры: первый байт памяти».

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

Резюме

1. Комбинационные схемы работают мгновенно, а память требует времени — им нужен общий ритм.

2. Тактовый генератор выдаёт регулярный пульс 0→1→0; частота в гигагерцах — это миллиарды тактов в секунду.

3. D-триггер запоминает значение входа D только по фронту Clock (переход 0→1).

4. Между фронтами триггер игнорирует шум на входе — память остаётся стабильной.

5. DFF строится из четырёх NAND по схеме master-slave.

6. Несколько триггеров с общим Clock образуют регистр.

На уровне 1.11 тебе предстоит собрать D-триггер из четырёх NAND по схеме master-slave и подключить к нему предустановленный тактовый генератор. Помни: данные запоминаются только по фронту Clock.

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