# Архитектура компьютера ## Лекция 4 ## Цифровая схемотехника. Кодирование информации Пенской А.В., 2026 --- ## Цифровая схемотехника
1. Комбинационные схемы 1. двоичная логика; 2. булев базис: - И, ИЛИ, НЕ; - штрих Шеффера
$x|y = \overline{x y}$; - стрелка Пирса
$x \downarrow y = \overline{x \vee y}$. 2. Схемы с состоянием 1. триггеры, регистры; 2. память.

----
Комбинационная схема (КС)
схема, составленная из набора логических элементов, в совокупности реализующая заданную таблицу истинности.
Элементы комбинационных схем:  ---- ### КС: Возможности Реализация функций — отображение множества $A$ на множество $B$. $A$ и $B$ конечны (представимы конечной последовательностью бит) $\longrightarrow$ возможно построить комбинационную схему. #### КС: Подход к построению 1. через таблицу истинности (чёрный ящик); 2. через алгоритмизацию (белый ящик, алгоритм/структура). *Offtopic*: логарифмическая линейка и арифмометр. --- #### Формирование через таблицу истинности
1. Формирование таблицы истинности. 2. Запись таблицы истинности в каноническую форму (ДНФ или КНФ), отображаемую в комбинационную схему. 3. Минимизация булевой функции (сокращаем размер схемы). **Подробнее**: дискретная математика, Поляков: ККНФ и КДНФ, минимизация булевых функций, метод Петрика, карты Карно и т.д.
  Пример (4 to 2 encoder) — на следующем слайде.
---- ##### Шифратор (Encoder, 4-to-2)
##### 1. Таблица истинности  ##### 2. КДНФ $o_1 = \overline{i_3} i_2 \overline{i_1} \overline{i_0} \vee i_3 \overline{i_2} \overline{i_1} \overline{i_0}$ $o_0 = \overline{i_3} \overline{i_2} i_1 \overline{i_0} \vee i_3 \overline{i_2} \overline{i_1} \overline{i_0}$
##### 3. Минимизированная функция $o_1 = i_3 \vee i_2$ $o_0 = i_3 \vee i_1$ 
--- #### Через алгоритмизацию Схема строится на основе понимания функции, взаимосвязи входа и выхода. Творческий процесс. Схема может быть каскадной.
Полный сумматор (1-bit): - $A$, $B$ — биты операндов; - $S$ — результат; - $C_{in}$, $C_{out}$ — бит переноса.

------------------
Каскадный сумматор: - Размер: $O(n)$. - Для таблицы истинности: $O(n^2)$.
 (Полный сумматор)
---- ##### Процесс каскадного сумматора
 (отражено, сигнал слева направо) 
```text C0 _____________________________ (0) _______________________ (1) A0 _____/ (0) _______________________ (1) B0 _____/ (0) S0 _____________________________ (0) _________________ (1) C1 ___________/ (0) _______________________ (1) A1 _____/ (0) B1 _____________________________ (0) ______ S1 ___________/ \__________ (0) __________ (1) C2 __________________/ (0) A2 _____________________________ (0) B2 _____________________________ (0) ____ (1) S2 ________________________/ (0) ^ ^ ^ ^ ------------- time ----------------> ```
--- #### Свойства комбинационных схем
1. **Стабильное состояние** при корректном входе (нет циклов). 1. **Задержка** установления после изменения входа. 1. **Накопление ошибки** (физический процесс). 1. **Параллелизм уровня бит** (узлы с параллельным включением работают параллельно). 1. **Уровень линии**, не сигнал (как и в реле).
```text C0 _____________________________ (0) _______________________ (1) A0 _____/ (0) _______________________ (1) B0 _____/ (0) S0 _____________________________ (0) _________________ (1) C1 ___________/ (0) _______________________ (1) A1 _____/ (0) B1 _____________________________ (0) ______ S1 ___________/ \__________ (0) __________ (1) C2 __________________/ (0) A2 _____________________________ (0) B2 _____________________________ (0) ____ (1) S2 ________________________/ (0) ^ ^ ^ ^ ------------- time ----------------> ``` *Та же временная диаграмма каскадного сумматора*
--- #### Реальная ситуация с двоичным кодированием Вы ведь не думаете, что это на самом деле два состояния? - Очевидное `0` и `1`. ---- Из Verilog (Hardware Description Language, HDL). - Очевидное `0` и `1`. - `x` — неизвестно, значение может быть произвольным, так как таблица истинности определена частично. Примеры: - деление на `0`; - квадратный корень из отрицательного числа; - пример "Шифратор (4-to-2)" выше. - `z` — отключено, когда ваш источник данных (провод) висит в воздухе. `0` обычно не кодируют нулевым уровнем сигнала. Почему двоичное? См. в разделе "Кодирование". --- **Вопрос**: Как получить условный оператор? Два сценария: 1. Как выбрать данные из двух источников? 2. Как отправить данные в один из двух источников? --- ### Условный оператор. Выборка "Скрутки" — запрещены $\rightarrow$ **Мультиплексор** 
```verilog assign in0 = f0(...); // Verilog assign in1 = f1(...); assign out = sel ? in0 : in1; ```
```python in0 = f0(...) # Python in1 = f1(...) out = in0 if sel else in1 ```
Почему не реализуется как "переключатель" (обычно)? 1. Нет усиления/восстановления сигнала. 1. Риск зависшего/неопределённого выхода. ---- #### Цифровой мультиплексор (таблица истинности)
| $sel$ | $in_0$ | $in_1$ | $out$ | | :---: | :----: | :----: | :---: | | 0 | 0 | 0 | 0 | | 0 | 0 | 1 | 0 | | 0 | 1 | 0 | 1 | | 0 | 1 | 1 | 1 | | 1 | 0 | 0 | 0 | | 1 | 0 | 1 | 1 | | 1 | 1 | 0 | 0 | | 1 | 1 | 1 | 1 |
```text ¬sel ──┐ ├──[AND]──┐ in0 ──┘ │ ├──[OR]──► out sel ──┐ │ ├──[AND]──┘ in1 ──┘ ``` $out = \overline{sel} \cdot in_0 \vee sel \cdot in_1$
---- #### Условный оператор. Отправка Демультиплексор — зеркало мультиплексора: один вход, $N$ выходов.
| $sel$ | $X$ | $A$ | $B$ | | :---: | :---: | :---: | :---: | | 0 | 0 | 0 | 0 | | 0 | 1 | 1 | 0 | | 1 | 0 | 0 | 0 | | 1 | 1 | 0 | 1 |
```text ┌──(¬sel)──[AND]──► A X ───┤ └──( sel)──[AND]──► B ``` $A = X \cdot \overline{sel}$, $\quad B = X \cdot sel$
**Не использовать в схемах!** Почему?
0
и
1
— равноправные значения!
--- ### Схемы с состоянием
Триггер
элемент схемы хранящий 1 бит — выход зависит не только от входов, но и от состояния.
Позволяет: 1. Зафиксировать состояние линии на длительное время. 1. Ограничить распространение сигнала по схеме. 1. Разорвать цикл. 1. Сократить задержку в комбинационной схеме.
Виды триггеров: 1. Условие изменения: - **по фронту**; - по уровню. 1. Интерфейс: - **D-триггер** — Delay (запоминает вход). - RS-триггер — Reset/Set. - и др.
---- #### `DFF` (D Flip-Flop), D-триггер `D` меняется когда угодно, но `Q` перескакивает на новое значение только в момент фронта `clk` — и держит его до следующего фронта.
```text ┌───────┐ D ────►│ DFF ├────► Q │ │ clk►│ │ └───────┘ ```
```text _____________________________ (1) D ______/ (0) ______________ (1) clk __________/ \__________ (0) ________________________ (1) Q ____________/ (0) ^ ^ ------------- фронт ---------------------> ```
--- #### Регистр. Защёлкивание по условию: Enable
1. `clk` тикает одинаково каждый такт. 2. Мультиплексор определяет, будет ли обновлено значение. - `en = 1` — новое значение. - `en = 0` — старое значение.
```text D_new ──┐ ├──[ MUX ]──► D ──[ DFF ]──┬──► Q ┌───►┘ ▲ ▲ │ │ │ │ │ │ en clk │ │ │ └───────────────────────────────┘ ``` ```text ______ ______ (1) clk ______/ \__________/ \_____ (0) ________________ (1) en ____________________/ (0) ________________________________ (1) D ____/ (0) ____________ (1) Q ________________________/ (0) ^ ^ en=0 -- Q en=1 -- Q не меняется захватывает D ```
----
Регистровый файл
массив из $2^n$ регистров с произвольным доступом по номеру.
1. **Запись**: `WADDR` ($n$ бит) $\rightarrow$ `decoder` $\rightarrow$ `enable` ($1$ бит) для одного регистра - по фронту `clock`. 1. **Чтение**: `RADDR` ($n$ бит) $\rightarrow$ `multiplexor` выбирает значение одного регистра - комбинационное. 1. Число независимых портов чтения/записи = число мультиплексоров/декодеров.

--- #### Многотактовые схемы ##### (1) **Конвейерное исполнение**  1. Количество стадий — количество параллельных задач. 1. Больше "разбиений" — ниже задержка, выше частота. ---- ##### (2) **Синхронная схемотехника** 1. меньше гонок, проще синхронизация; 1. частота по самой медленной комбинационной схеме; 1. дискретизация входных сигналов по времени; 1. синхронность — в заданном диапазоне.  ---- ##### (3) **Spatial** vs. **Temporal** Computation
Сложение 16-битных чисел: 1. сумматор на 16 бит и 1 такт; 1. сумматор на 8 бит и 2 такта + система управления.

---- Сумматор на 8 бит и 2 такта + система управления ```text +---------+ A[15:8] +-----+ receive always, latch if needed | +---------------->| | : | A[15:0] | | MUX +-----+ : | +---------------->| | | A/2 : +--------+ +-------+-+ A[7:0] +--+--+ | +----->| C_high | ^ ^ | | +---+----+ | | | +-----+ | ^ latch_A-+ sel_A ---+ +-------->+ | C[7:0] | | | sum +------+----------+ latch_C +-------->+ | | | high +---------+ B[15:8] +-----+ | +--+--+ | | | +---------------->| | | B/2 ^ | C[8] | +--------+ | B[15:0] | | MUX +-----+ | | +----->| C_low | | +---------------->| | | | +---+----+ +-------+-+ B[7:0] +-----+ +-----+ ++-----+ ^ ^ ^ sel---->+ MUX | |carry | | | | carry ++---++ ++---+-+ latch_C latch_B-+ sel_B ---+ ^ ^ | ^ low | | | | 0-----+ +-------+ latch_carry ``` Notes: 0. `latch_A, latch_B` $\longrightarrow$ `sel_A = sel_B = low; sel_carry = 0` 1. `latch_C_low, latch_carry` $\longrightarrow$ `sel_A = sel_B = high; sel_carry = C[8]` 2. `latch_C_high` $\longrightarrow$ ... ---- ##### (4) **Программное управление** Выбираем регистры входа, регистр выхода, и комбинационную схему. ```text ┌──────────────────────────────────────┐ │ Регистр инструкции │ └─┬───────┬──────┬─────────────────┬───┘ │ │ │ │ waddr raddr1 raddr2 sel │ │ │ │ │ ▼ ▼ └────────────────────┐ │ ┌────────────┐ │ └───►│ ├──── rdata1 ─────┐ │ │ РегФайл │ │ │ ┌───►│ ├──── rdata2 ─────┤ │ │ └────────────┘ │ │ │ ▼ │ │ ┌─────────────────────────────┐ │ │ │ КС1 ... КС2 ... │ │ │ └─────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌───────────┐ │ │ │ MUX │<──────────┘ │ └─────┬─────┘ │ wdata │ └───────────────────────────────────┘ ``` --- ## Кодирование ### Двоичное кодирование  ----
#### Достоинства двоичного 1. Надежно и помехоустойчиво. 2. Простая арифметика. 3. Диапазоны и точность наращиваются разрядностью (слева и справа). 4. Погрешности "by design", а не "by implementation". #### Недостатки 1. Нечитаемое представление. 2. Простые десятичные дроби — бесконечные двоичные. 3. Дискретное кодирование сигналов (точность).

--- ### Представления чисел и данных
Машинное слово
фрагмент данных фиксированного размера, естественный для обработки вычислителем как единое целое. Примеры: сложение, пересылка и т.п.
 Что удобнее? (см. далее)
1. Целые числа: - Позиционные системы счисления. - Дополнительный код. - Big & Little endian. 1. Дроби: - С фиксированной точкой. - С плавающей точкой. 1. Перечисления: - Двоично-десятичное кодирование. - Символы (старые кодировки).
----  Адресация внутри машинного слова. Обращение к байтам, смещения. ---
Позиционная система счисления
значение цифры зависит от её позиции (разряда): $N = \sum_i d_i \cdot b^i$, $b$ — основание (2, 10, 16...).
Дополнительный код (two's complement)
представление отрицательных целых — инвертировать биты и прибавить 1. Позволяет складывать и вычитать положительные и отрицательные числа одной и той же схемой.
Пример (4 бита): $5 = 0101$, $-5 = \overline{0101} + 1 = 1011$. ----
One-hot кодирование
способ кодирования $N$ состояний $N$-битным словом, в котором ровно один бит установлен в
1
, остальные — в `0`.
**Где применяется**: 1. Chip Select (CS), Write enable (WE) — "активен ли я". 1. Состояния конечного автомата.
| Значение | Двоичный | One-hot | |:--------:|:--------:|:-------:| | 0 | `00` | `0001` | | 1 | `01` | `0010` | | 2 | `10` | `0100` | | 3 | `11` | `1000` | ----
BCD
каждый десятичный разряд — отдельным 4-битным кодом.
**Зачем**: точная десятичная арифметика без периодических дробей. **Где применяется**: - Калькуляторы. - Кассы. - Семисегментные индикаторы.

----
Код Грея
соседние по значению комбинации отличаются только в одном разряде (код циклический).
**Зачем**: при обычном счёте возможен glitch — одновременная смена нескольких бит. В коде Грея — всегда один бит. **Где применяется**: - Энкодеры положения. - Счётчики состояний. - Карты Карно.
 **Построение**: $g_i = b_i \oplus b_{i+1}$, $b_n = 0$. **Декодирование**: $b_i = g_i \oplus b_{i+1}$ (от старшего разряда).
---- #### Коды обнаружения и исправления ошибок (offtopic)
Защита от случайного изменения бита. 1. **Бит чётности (parity)** — лишний бит делает сумму единиц чётной. 1. **Код Хэмминга** — несколько битов чётности расположены так, что их комбинация указывает номер ошибочного бита.
Где используется: - Шины передачи данных. - Error-Correcting Code (ECC) память. - Там, где "молча перевернувшийся бит" дороже одного лишнего провода.