Цифровая логика: от вентилей до регистров
Как устроена цифровая логика: базовые вентили и их таблицы истинности, как по таблице получить формулу и схему, как упростить её картой Карно, и как из логических элементов получаются защёлки, триггеры и регистры — со встроенными калькуляторами для своих функций.
Обновлено Редакция GAW
Цифровая логика работает с сигналами, у которых всего два значения: 0 и 1, ложь и истина. Любое цифровое устройство — от счётчика до процессора — собрано из логических элементов, которые выполняют операции булевой алгебры, и элементов памяти, которые хранят их результат. Применить алгебру логики к переключательным схемам предложил Клод Шеннон в работе о релейных схемах, выполненной в MIT.
Логические элементы
| Элемент | Обозначение | Выход равен 1, когда | A=0 B=0 | A=0 B=1 | A=1 B=0 | A=1 B=1 |
|---|---|---|---|---|---|---|
| И (AND) | A · B | оба входа равны 1 | 0 | 0 | 0 | 1 |
| ИЛИ (OR) | A + B | хотя бы один вход равен 1 | 0 | 1 | 1 | 1 |
| И-НЕ (NAND) | ¬(A · B) | хотя бы один вход равен 0 | 1 | 1 | 1 | 0 |
| ИЛИ-НЕ (NOR) | ¬(A + B) | оба входа равны 0 | 1 | 0 | 0 | 0 |
| Исключающее ИЛИ (XOR) | A ⊕ B | входы различаются | 0 | 1 | 1 | 0 |
| Исключающее ИЛИ-НЕ (XNOR) | ¬(A ⊕ B) | входы совпадают | 1 | 0 | 0 | 1 |
Инвертор (НЕ) меняет 0 на 1 и обратно. Элементы И-НЕ и ИЛИ-НЕ универсальны: из одних двухвходовых И-НЕ можно собрать любую функцию. В КМОП-схемах каждый каскад по природе инвертирует, поэтому И-НЕ и ИЛИ-НЕ получаются одним каскадом, а И и ИЛИ — двумя. Важная тонкость: И-НЕ и ИЛИ-НЕ не ассоциативны — трёхвходовый И-НЕ нельзя получить, соединив два двухвходовых каскадом, как это делают с И. Исключающее ИЛИ нужно в сумматорах и при расчёте чётности и контрольных сумм, например CRC.
На том же XOR построены коды, исправляющие ошибки. Бит чётности — XOR всех бит слова — замечает одиночную ошибку, но не показывает, где она. Код Хэмминга ставит несколько проверок чётности по перекрывающимся группам позиций: проверочный бит в позиции 1, 2, 4, 8, … охватывает все позиции, в двоичном номере которых есть этот разряд, и сработавшие проверки, прочитанные как двоичное число, дают номер ошибочного бита. Для 4 бит данных хватает 3 проверочных — код (7,4). Щёлкните по биту слова, чтобы внести ошибку и увидеть синдром; подробный разбор, SECDED и коды до (256,247) — в калькуляторе кода Хэмминга:
Исходные данные
1–247
первый бит — d1, он идёт в позицию 3; пробелы можно
ошибки канала: номера через запятую или щелчок по биту слова
Результат
- Кодовое слово, позиция 1 — первая
0111100- код (7,4): 3 проверочных бита, доля данных 57,1 %
- Проверочные биты
- 011p1 p2 p4 в позициях 1, 2, 4
- Данные
1100 = 0x3d1 = D0 — младший бит числа- Принятое слово
0111000инвертированы позиции 5- Синдром
- 101₂ = 5Ошибка в позиции 5 — исправлена
Синдром 5 — это номер позиции с ошибкой: бит 5 (d2) инвертирован обратно.
Исправлено верно: данные совпадают с исходными.
Принятое слово по позициям
Щёлкните по биту, чтобы внести ошибку, — синдром покажет её позицию. Под номером позиции — имя бита: p — проверочный, d — данные, P — общая чётность.
Как получены проверочные биты
Каждый проверочный бит — XOR бит данных в позициях, где в номере стоит его разряд.
- p1 = 1 ⊕ 1 ⊕ 0 = 0позиции 3 (d1), 5 (d2), 7 (d4)
- p2 = 1 ⊕ 0 ⊕ 0 = 1позиции 3 (d1), 6 (d3), 7 (d4)
- p4 = 1 ⊕ 0 ⊕ 0 = 1позиции 5 (d2), 6 (d3), 7 (d4)
Проверки принятого слова
Каждая проверка — XOR всех покрытых позиций вместе с проверочным битом; 1 — проверка не сошлась. Синдром s4 s2 s1 = 101₂ = 5.
| Позиция | 1 | 2 | 3 | 4 | 5 | 6 | 7 | XOR |
|---|---|---|---|---|---|---|---|---|
| В двоичном | 001 | 010 | 011 | 100 | 101 | 110 | 111 | |
| Бит | p1 | p2 | d1 | p4 | d2 | d3 | d4 | |
| p1 бит 0 номера | 0 | · | 1 | · | 0 | · | 0 | s1 = 1 |
| p2 бит 1 номера | · | 1 | 1 | · | · | 0 | 0 | s2 = 0 |
| p4 бит 2 номера | · | · | · | 1 | 0 | 0 | 0 | s4 = 1 |
Проверочные биты на C
Маска на каждый проверочный бит; __builtin_parity, __builtin_parityl и __builtin_parityll есть в GCC и Clang. Слово до 32 бит идёт в __builtin_parityl: unsigned long не короче 32 бит, поэтому данные не обрежутся и там, где int 16-битный (AVR).
/* Hamming (7,4): D0 = bit 0 of data, code position 3
(bits above D3 must be zero) */
#include <stdint.h>
static const uint32_t hamming_mask[3] = {
0x0000000BUL, /* p1: code position 1 */
0x0000000DUL, /* p2: code position 2 */
0x0000000EUL, /* p4: code position 4 */
};
/* Check bit p(2^i) in bit i. */
uint16_t hamming_check_bits(uint32_t data) {
uint16_t check = 0;
for (int i = 0; i < 3; i++)
check |= (uint16_t)(__builtin_parityl(data & hamming_mask[i]) << i);
return check;
}
/* Syndrome: the stored check bits XOR the recomputed ones; for a single error its
low 3 bits are the code position of the bad bit. */
Таблица истинности и формула
Функцию задают таблицей истинности: для N входов в ней 2^N строк, по одной на каждую комбинацию. По таблице всегда можно записать формулу в виде суммы произведений (дизъюнктивной нормальной формы, СДНФ): для каждой строки, где выход равен 1, пишут произведение всех переменных — прямых, если в строке 1, и инверсных, если 0, — и объединяют эти произведения через ИЛИ. Двойственная форма — произведение сумм (СКНФ) — строится по строкам, где выход равен 0. Сумма произведений сразу превращается в схему: инверторы, вентили И на каждое произведение и вентиль ИЛИ на выходе.
Калькулятор строит таблицу по выражению или вектору значений, записывает СДНФ и СКНФ и находит минимальные формы:
Исходные данные
Переменные — латинские буквы (a, B, x1). Операции: ¬ ! not, ∧ & and, ∨ | + or, ⊕ ^ xor, → ->, ≡ ==; «AB» — то же, что A ∧ B, A' — отрицание
Результат
- Минимальная ДНФ
- a ∧ ¬c ∨ b ∧ ¬c
- Минимальная КНФ
- (a ∨ b) ∧ ¬c
- СДНФ
- ¬a ∧ b ∧ ¬c ∨ a ∧ ¬b ∧ ¬c ∨ a ∧ b ∧ ¬c
- СКНФ
- (a ∨ b ∨ c) ∧ (a ∨ b ∨ ¬c) ∧ (a ∨ ¬b ∨ ¬c) ∧ (¬a ∨ b ∨ ¬c) ∧ (¬a ∨ ¬b ∨ ¬c)
- Вектор значений
- 00101010единиц — 3, нулей — 5
Таблица истинности
8 строк; номер строки — двоичное число из значений переменных, первая переменная — старший разряд.
| № | a | b | c | a ∨ b | ¬c | (a ∨ b) ∧ ¬c |
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| 1 | 0 | 0 | 1 | 0 | 0 | 0 |
| 2 | 0 | 1 | 0 | 1 | 1 | 1 |
| 3 | 0 | 1 | 1 | 1 | 0 | 0 |
| 4 | 1 | 0 | 0 | 1 | 1 | 1 |
| 5 | 1 | 0 | 1 | 1 | 0 | 0 |
| 6 | 1 | 1 | 0 | 1 | 1 | 1 |
| 7 | 1 | 1 | 1 | 1 | 0 | 0 |
Минимизация и карта Карно
Совершенная форма обычно избыточна: два произведения, которые отличаются значением одной переменной, сливаются в одно без неё — A · B + A · ¬B = A. Найти такие пары проще, если переставить строки таблицы так, чтобы соседние отличались ровно одним битом. Это и делает карта Карно: таблица истинности записывается двумерной таблицей, строки и столбцы нумеруются кодом Грея (00, 01, 11, 10), а крайние столбцы и строки считаются соседними — карту надо представлять свёрнутой в цилиндр (для 4 переменных — в тор).
Единицы обводят прямоугольными группами по 1, 2, 4, 8 клеток; каждая группа — одно произведение, из которого выпадают переменные, меняющиеся внутри группы. Чем больше группа, тем короче произведение. Комбинации входов, которые никогда не встречаются, помечают как безразличные (x) и включают в группы, если это их увеличивает.
Исходные данные
номера строк таблицы истинности от 0 до 15, например 1, 3, 5-7; или нажимайте на клетки карты
значение не важно: его можно взять и 0, и 1
Результат
- Минимальная ДНФ
- AB' + AC' + BCD'
- Группа 1: 4 клетки
- AB'
- Группа 2: 4 клетки
- AC'
- Группа 3: 2 клетки
- BCD'
Мультиплексор
Мультиплексор (MUX) выбирает один из входов по сигналу выбора: при S = 0 на выход идёт вход D0, при S = 1 — D1. Его формула — Y = ¬S · D0 + S · D1. Мультиплексор тоже универсален: на нём можно собрать инвертор, И и ИЛИ, а значит, и любую функцию.
Память: защёлка и триггер
Если выход мультиплексора завести обратно на его вход D0, получится элемент памяти — D-защёлка. Пока управляющий вход G равен 1, выход повторяет вход D (защёлка «прозрачна»); когда G становится 0, выход сохраняет последнее значение. Чтобы значение запомнилось надёжно, вход D должен быть стабильным некоторое время до спада G — это время установки (setup time) — и некоторое время после него — время удержания (hold time).
Две защёлки, включённые друг за другом и управляемые противофазными сигналами, образуют D-регистр, или D-триггер. Он записывает вход только в момент фронта тактового сигнала — нарастающего, перехода из 0 в 1 — и хранит значение до следующего фронта; между фронтами изменения входа на выход не проходят. На таких регистрах и строится синхронная логика: между регистрами стоит комбинационная схема, и такт должен быть длиннее её задержки с учётом времени установки.
Из регистров собирают остальные узлы: регистр из N триггеров с общим тактом хранит N-битное число, сдвиговый регистр — цепочка триггеров, где выход одного подан на вход следующего, — сдвигает данные на разряд за такт, счётчик — регистр с комбинационной схемой прибавления единицы на входе.
Частые вопросы
Чем вентиль И-НЕ отличается от И?
И-НЕ (NAND) — это И с инверсией на выходе: он выдаёт 0, только когда все входы равны 1, и 1 во всех остальных случаях. Из одних двухвходовых И-НЕ можно собрать любую логическую функцию — инвертор, И, ИЛИ и всё остальное, — поэтому такой элемент называют универсальным. В КМОП-технологии И-НЕ и ИЛИ-НЕ реализуются одним каскадом, а И и ИЛИ требуют ещё инвертора.
Что такое карта Карно?
Это таблица истинности, переписанная в виде прямоугольной таблицы, где строки и столбцы пронумерованы кодом Грея: соседние клетки отличаются значением ровно одной переменной, а крайние столбцы и строки тоже считаются соседними. Группа соседних единиц размером 2, 4, 8 клеток заменяется одним произведением без переменных, которые в группе меняются. Так находят минимальную формулу без перебора тождеств.
Чем защёлка отличается от триггера?
Защёлка (latch) прозрачна, пока на её управляющем входе активный уровень: выход повторяет вход, а при смене уровня значение запоминается. Триггер, или D-регистр, собран из двух защёлок, работающих в противофазе, и записывает вход только в момент фронта тактового сигнала — между фронтами изменения входа на выход не проходят. Поэтому синхронные схемы строят на триггерах.
Сколько строк в таблице истинности?
Для N входов — 2^N строк: каждая строка — одна комбинация входов. Для 3 входов это 8 строк, для 6 — 64, а для схемы сложения двух 32-битных чисел — 2^64, поэтому большие функции описывают формулами, а не таблицами.
Источники
- C. Terman. 6.004 Computation Structures, Spring 2017. MIT OpenCourseWare, 4.1 Combinational Logic: Annotated Slides — таблица истинности на 2^N строк, сумма произведений по таблице, вентили И, ИЛИ, НЕ, И-НЕ, ИЛИ-НЕ, универсальность И-НЕ, неассоциативность И-НЕ и ИЛИ-НЕ, карта Карно в коде Грея, мультиплексор
- C. Terman. 6.004 Computation Structures, Spring 2017. MIT OpenCourseWare, 5.1 Sequential Logic: Annotated Slides — защёлка на мультиплексоре с обратной связью, время установки и удержания, D-регистр из двух защёлок, срабатывание по фронту тактового сигнала, сдвиговые регистры
- C. E. Shannon. A symbolic analysis of relay and switching circuits. Thesis (M.S.), Massachusetts Institute of Technology, 1940 — работа, в которой булева алгебра применена к релейным и переключательным схемам
- R. W. Hamming. Error Detecting and Error Correcting Codes. The Bell System Technical Journal, 1950, vol. 29, no. 2, pp. 147–160 — §2 — проверка чётности; §3 — проверочные позиции 1, 2, 4, 8, каждая проверка охватывает позиции с соответствующим разрядом в номере, проверочное число указывает позицию ошибки; табл. I — код из семи позиций с четырьмя информационными
Нашли ошибку?
Смотрите также
- Таблица истинностиТаблица, СДНФ и СКНФ, минимальные ДНФ и КНФ
- Карта КарноМинимальная ДНФ и КНФ, группы клеток на карте
- ТеорияОсновы схемотехники: от закона Ома до ОУ, АЦП и источников питания
- MOSFET и IGBTУстройство, логический уровень, заряд затвора, потери, ключ и IGBT
- Конвертер HEX, BIN, DECДополнительный код, float, байты и биты
- Калькулятор CRCCRC-8, CRC-16, CRC-32, Modbus, блок CRC STM32, код на C