Altifigence Academy

16 / 63 · Теория

Сумматоры и структуры распространения переноса

Выведите формулы полного сумматора и совместно проанализируйте функцию, разрядность и задержку последовательного переноса.

Сумма одного разряда представляется двумя битами

Сумма ai,bi,cia_i,b_i,c_i лежит в диапазоне 0–3, поэтому нужны бит суммы sis_i и перенос в следующий разряд ci+1c_{i+1}. Нечётное число единиц на трёх входах даёт sum=1, минимум две единицы — carry=1.

si=ai⊕bi⊕cis_i=a_i\oplus b_i\oplus c_i
ci+1=aibi+(ai⊕bi)cic_{i+1}=a_ib_i+(a_i\oplus b_i)c_i

Определим generate gi=aibig_i=a_ib_i и propagate pi=ai⊕bip_i=a_i\oplus b_i. Тогда ci+1=gi+picic_{i+1}=g_i+p_ic_i, где ++ означает OR. Полусумматор — частный случай без входного переноса: сумма задаётся XOR, перенос — AND.

Меняйте три входа и проверяйте постоянство a+b+cin = sum+2×cout. Перенос становится входом следующего разряда; его вес отличается от веса sum.

Сумма одного разряда и перенос в следующий

a + b + cin = sum + 2 × cout

Насколько далеко распространяется перенос

Рассмотрим 4-битное 1111 + 0001. Перенос возникает в бите 0 и проходит ещё три разряда. Сохраняемая сумма — 0000, старший carry — 1. В структуре ripple-carry перенос младшего разряда может заставить старшие разряды ждать.

c2=g1+p1g0+p1p0c0c_2=g_1+p_1g_0+p_1p_0c_0

Раскрытие выражений показывает возможность параллельного расчёта переносов. Быстрые сумматоры объединяют групповые propagate/generate, но возникает компромисс площади и задержки с учётом fan-in, проводников и библиотеки ячеек. Оператор + в RTL не обязательно реализуется одним конкретным ripple-carry-сумматором.

Явно сохраняйте ширину суммы в проекте

SystemVerilog
logic [3:0] a, b, sum;
logic cin, cout;
logic [4:0] wide_sum;
assign wide_sum = {1'b0, a} + {1'b0, b} + {4'b0000, cin};
assign sum = wide_sum[3:0];
assign cout = wide_sum[4];

Максимум 15+15+1=3115+15+1=31, поэтому 5 бит достаточно. Сначала решите, нужна ли лишь младшая часть суммы, передаётся ли carry дальше и нужно ли насыщение. Интерактивный элемент проверяет таблицу истинностиТаблица истинности перечисляет все возможные комбинации входов и выход для каждой из них. Изменения во времени проверяют отдельно по временным диаграммам. Подробнее одного полного сумматора, а не измеряет задержку реального результата синтеза.

Измените входы

Попробуйте сами

Для 4-битных unsigned a=9a=9, b=6b=6, cin=1c_{in}=1 найдите полную сумму, 4-битную сумму и carry. Можно ли судить о переполнении только по carry, интерпретируя ту же схему как знаковое сложение?

Прочитать объяснение

Полная сумма 16, битовая строка 10000, поэтому sum=0000, carry=1. В знаковой интерпретации 1001 равно −7, так что −7+6+1=0-7+6+1=0 находится в диапазоне. Carry и знаковое переполнение — разные условия.

Выбор действует в этом браузере. Его можно изменить внизу страницы.