Учим кремний математике (Секрет символа «+»)
В любом языке программирования сложение выглядит как магия. Вы просто пишете sum = a + b, и процессор моментально выдает правильный ответ. Кажется, что внутри компьютера сидит маленький счетовод, который знает правила арифметики.
Но на самом деле кремний не умеет считать. У него нет встроенного понимания математики. Всё, что у нас есть на базовом уровне — это ток, напряжение и логические вентили (AND, OR, NOT, XOR).
Знак + в коде — это высокоуровневая иллюзия. На уровне Structural Verilog вам предстоит своими руками собрать схему, которая заставит глупые транзисторы симулировать сложение.
Как сложить два бита?
Представьте, что к нам по двум проводам приходят два сигнала (бита): A и B. Наша задача — их сложить. Давайте вспомним школьную математику в двоичной системе. Возможны всего четыре ситуации:
- 0 + 0 = 0
- 0 + 1 = 1
- 1 + 0 = 1
Пока всё просто. Результат идеально укладывается в один выходной провод. Но что произойдет, если на обоих входах будут единицы?
- 1 + 1 = 10 (в двоичной системе это двойка).
Ответ состоит из двух цифр! Это значит, что для сложения всего двух проводов нам физически не хватит одного выходного пина. Их должно быть два:
- Sum (Сумма) — это младший бит (правая цифра ответа).
- Carry (Перенос) — это старший бит (левая цифра ответа, которая «переносится» в следующий разряд, как при сложении в столбик).
Железная логика арифметики
Теперь давайте посмотрим на эти два выхода как инженеры, вооруженные логическими вентилями.
Сначала разберемся с выходом Sum (Младший бит):
Посмотрите на результаты сложения 0+0, 0+1, 1+0 и 1+1. Младший бит равен 1 только тогда, когда входы разные (один равен 0, другой 1). Если входы одинаковые (оба 0 или оба 1), младший бит равен 0.
Узнаете паттерн? Это идеальное описание работы вентиля Исключающее ИЛИ (XOR)!
Вывод: Чтобы получить бит суммы, нам нужно просто пропустить провода
AиBчерез вентильxor.
Теперь разберемся с выходом Carry (Бит переноса):
В каком единственном случае у нас возникает перенос единицы в следующий разряд? Только тогда, когда складываются две единицы (1+1). То есть, перенос равен 1 только если A = 1 И B = 1.
Знакомая логика? Это же классический вентиль Логическое И (AND).
Вывод: Чтобы получить бит переноса, нам нужно пустить те же самые провода
AиBчерез вентильand.
Рождение Полусумматора
Только что вы изобрели одну из самых важных микросхем в истории вычислительной техники — Полусумматор (Half Adder).
Почему он называется «Полу»? Потому что он умеет складывать только два начальных бита. Если мы захотим складывать большие числа в столбик, нам понадобится схема, которая сможет принимать еще и третий бит (перенос от предыдущих вычислений). Но об этом мы поговорим в следующий раз.
На уровне 33 ваша задача — перенести эту логику в код на Verilog. Вам нужно объявить модуль HalfAdder с двумя входами и двумя выходами, а затем внутри него одновременно вызвать два встроенных вентиля (xor и and), правильно подключив к ним провода. Начинается настоящая схемотехника!