Тактовый генератор и D-триггер
SR-защёлка — отличная вещь, но у неё есть проблема: она слишком хаотична. Если сигналы в большом процессоре придут на входы с микросекундной разницей, схема может запомнить случайный мусор. Процессору, как большому симфоническому оркестру, нужен дирижёр, чтобы все инструменты играли строго в один ритм.
Этим дирижёром выступает тактовый генератор (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 перед фронтом | Фронт Clock | Q после фронта |
|---|---|---|
| 0 | 0→1 | 0 |
| 1 | 0→1 | 1 |
| Любое | Нет фронта | 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 — и получится честный регистр, про который читай статью «Регистры: первый байт памяти».
Частые ошибки
- Подключить D, но забыть Clock: без фронтов триггер никогда не запомнит данные.
- Подавать данные на вход Clock вместо D: такты должны приходить от тактового генератора, а не от случайного сигнала.
- Менять D одновременно с фронтом: в момент перехода 0→1 триггер должен видеть стабильное значение.
Резюме
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.