Учим кремний математике (Секрет символа «+»)

В любом языке программирования сложение выглядит как магия. Вы просто пишете sum = a + b, и процессор моментально выдает правильный ответ. Кажется, что внутри компьютера сидит маленький счетовод, который знает правила арифметики.

Но на самом деле кремний не умеет считать. У него нет встроенного понимания математики. Всё, что у нас есть на базовом уровне — это ток, напряжение и логические вентили (AND, OR, NOT, XOR).

Знак + в коде — это высокоуровневая иллюзия. На уровне Structural Verilog вам предстоит своими руками собрать схему, которая заставит глупые транзисторы симулировать сложение.

Как сложить два бита?

Представьте, что к нам по двум проводам приходят два сигнала (бита): A и B. Наша задача — их сложить. Давайте вспомним школьную математику в двоичной системе. Возможны всего четыре ситуации:

Пока всё просто. Результат идеально укладывается в один выходной провод. Но что произойдет, если на обоих входах будут единицы?

Ответ состоит из двух цифр! Это значит, что для сложения всего двух проводов нам физически не хватит одного выходного пина. Их должно быть два:

  1. Sum (Сумма) — это младший бит (правая цифра ответа).
  2. 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), правильно подключив к ним провода. Начинается настоящая схемотехника!