Алгоритм сложения ДДК
Текущему значению суммы частичных произведений добавляется множимое, если соответствующий разряд равен «1» и далее суммы частичных произведений сдвигаются вправо и т.д. Перенеся условную точку вправо через (n-1) разряд мы получим результат.
Алгоритм операции умножения.
Будем считать, что операнды представлены прямым кодом, т.е. старший разряд знаковый, остальные – числовые.
- Берутся модули от сомножителей;
- Сумма частичных произведений полагается равной нулю;
- Анализируется младший разряд множителя, если значение «1», то к текущему значению суммы частичных произведений добавляется множимое;
- Содержимое регистра множителя и сумматора частичных произведений сдвигается вправо на одно деление;
- п.3 и п.4 повторяются для всех разрядов множителя.
- Для окончательного размещения результата в двоичном виде производят сдвиг вправо на 1 разряд.
- Знак результата полагается «0», если сомножители имеют одинаковый знак и «1» (отрицательный результат), если сомножители имеют разные знаки. Операция не производится, если один из «0», и результат равен «0».
Основа для алгоритма является: Z=X(множимое)*Y(множитель)
Y – представим как соответствующие степени
Y=±yn-2 2n-2 + yn-32n-3+ y0 20 , тогда
Z=x*( yn-2 2n-2 + yn-32n-3+y0 20) =x*2n-1(yn-2 2-1 + yn-32-2+ y0 2--(n--1))=
=2n-1(( ..(0+x* y0)z--1 + x* y1 )* 2--1 +…+x*y n-1 ) 2-1 =A*2n-1.
![]() | |||||||
![]() | |||||||
![]() | |||||||
![]() |
Рг1 для приёма множимого; Рг2 для приёма множителя. Входной РгА сумматора для размещения в нём очередной добавляемой компоненты к сумме частичных произведений. Входной РгБ См используется для размещения текущего значения суммы частичных произведений. Рг2' используется для формирования сдвига множителя вправо по разрядной сетке. Выходной РгСм, в котором формируются текущее значение суммы частичных произведений. Счётчик циклов используется для отображения количества обрабатываемых разрядов множителя.
На 1-м этапе выполняется размещение множимого в Рг1. Множимое может передаваться в РгА в прямом или инверсном кодах. На 2-м этапе в Рг2 размещается множитель, поступающий по ШД. Обнуляется содержимое РгВ, используемое вы качестве начального значения суммы частичных произведений. Далее анализируется младшая цифра множителя в Рг2. Если она =1, то в РгА передаётся содержимое Рг1 и на выходе См формируется текущее значение суммы частичных произведений. Одновременно передают множитель для анализа очередной цифры. Для этого его содержимое передаётся в Рг2' с сдвигом вправо на 1 по разрядной сетке. В свободный разряд Рг2' помещается младший разряд со входа См. Остальные разряды См предаются в РгСм со сдвигом вправо на 1 разряд. После этого значение РгСм размещается в РгВ. Содержимое Рг2' размещается в Рг2 и значение СчЦ уменьшается на 1 по отношению к первоначальному значению, равному количеству числовых разрядов.
Процесс продолжается для следующей цифры множителя. Когда содержимое СчЦ становится =0, процесс анализа завершается с получением в РгСм старших разрядов и в Рг2 младших разрядов произведения. После этого выполняется ещё 1 цикл с 0 значением РгА для правилного размещения результата в разрядной сетке двойного слова.
До сих пор мы полагали, что перемножаем целые неотрицательные числа. Для умножения чисел со знаками, можно отдельно умножать модули чисел, если они записаны в прямом коде, и затем формировать знак результата. Если отрицательные числа представлены в обратном или дополнительном коде, то для взятия модулей используется дополнительная операция, связанная с добавлением 1. Поэтому для умножения чисел со знаками используется практически тот же алгоритм с некоторыми модификациями.
Алгоритм умножения целых чисел с использованием прямого кода для положительных чисел и дополнительного для отрицательных.
1.Фиксируется знак сомножителей в специальных триггерах.
2.Сумма частичных произведений полагается =0.
3.Анализируется младшая цифра множителя. Если она =1, то к сумме частичных произведений добавляется множимое в том коде, в котором оно представлено. Если она =0, то добавление не производится.
4.Выполняется сдвиг вправо суммы частичных произведений на 1 разряд, причём, если значение суммы ≥0, то производится обычный сдвиг. Если текущее значение суммы частичных произведений <0, то производится модифицированный сдвиг с занесением 1 в знаковый разряд.
5.Пункты 3 и 4 повторяются для всех числовых разрядов множителя.
6.Если множитель ≥0, то текущее значение суммы частичных произведений представляет собой результат в прямом коде для положительного значения и в дополнительном коде для отрицательного значения. Если множитель <0, то к текущему значению суммы частичных произведений необходимо добавить множимое с обратным знаком.
7.Размещение результатов в формате двойного слова путём сдвига суммы частичных произведений вправо на 1 разряд.
Z = X * Y, Y > 0
Алгоритм тот же, за исключением модифицированного сдвига. При этом может возникнуть следующее: если младший разряд множителя =0, а множимое <0, то нет необходимости выполнять модифицированный сдвига (нельзя), поскольку сумма частичных произведений =0, а нуль в дополнительном коде знака не имеет. И лишь только с появлением отрицательного значения суммы частичных произведений сдвиг должен быть модифицированным.
Y < 0
Yдоп = 2n - |Y|
Весовой коэффициент: 2n-1. Поэтому, если вычислить псевдопроизведение:
Z' = X * (2n-1 - |Y|) = -X * |Y| + X * 2n-1
Z' больше истинного значения на величину множимого, поэтому на завершительном этапе перед размещением результатов в формате двойного слова перед последним сдвигом необходимо из результата вычесть множимое. Поэтому при СчЦ = 0 к текущему значению суммы частичных произведений добавляют множимое с обратным знаком.
Особенности АЛУ с двоично-десятичными кодами (ДДК)
Двоичные коды достаточно громоздкие и поэтому в качестве входной и выходной информации часто используют ДДК. ДДК получают при преобразовании десятичного числа в двоичное путем замены каждой десятичной цифры числа ее двоичным эквивалентом, выделяя при этом под каждую десятичную цифру 4 двоичных разряда. Очевидно, что такие преобразования не соответствуют переводу числа из десятичного формата в двоичный. Однако такой способ является весьма простым. Поэтому, при использовании ДДК чисел необходимо выполнять необходимые корректирующие действия , которые приводят полученное значение к истинному результату.
Пример: 37=
АЛУ, построенное для обработки ДДК базируется на традиционном двоичном сумматоре с выполнением дополнительных корректирующих действий. Основная идея корректирующих механизмов заключается в том, что при обработке десятичных разрядов переносы в смежные разряды возникают при значениях, превышающих число 10, а при сложении ДДК перенос в смежный разряд возникает при превышении в разряде 16. Единицей данных при обработке ДДК является т. наз. тетрада, представляющая собой 4 последовательных бита. Для компенсации искажений, возникающих при сложении ДДК, формируют операнд, каждая цифра которого имеет избыток, равный 6. В таком случае:
z[i]=x[i]+y[i]+P[i]
Если при обработке i-того разряда десятичного кода при сложении i-того разряда первого операнда, i-того разряда второго операнда и входного переноса в i-тый разряд, значение превышает 10, то в i-том разряде остается
z[i]=x[i]+y[i]+P[i]-10
P[i+1]=1
Формируется сигнал переноса в следующий разряд. Поэтому при сложении операндов с избытком в (х6) получаем:
zt=x6+Y
В таком случае в i-том разряде zt будет такое значение:
тогда zt$16. В таком случае в i-том разряде zr будет:
zr[i]=6+x[i]+y[i]+P[i]-16=x[i]+y[i]+P[i]-10=z[i]
P[i+1]=1 –перенос в следующий разряд
При получении псевдосуммы zt обнаруживается ситуация, когда разряды (тетрады), из которых был перенос в старший разряд, содержат правильное значение цифры этого разряда. Разряды, из которых не было переносов в старший разряд, содержат цифру с избытком, равным 6. Поэтому полученное значение требует корректировки. Она может быть проведена путем вычитания из разрядов, из которых не было переносов, значения 6. На практике, вместо вычитания к этим разрядам добавляют значение равное 10 и блокируют межтетрадные переносы:
Упрощенная схема АЛУ
1. РгВ принимает первый операнд, затем в РгА формируют числосо значением 6 в каждой тетраде.
2. В РгСм формируется код первого операнда с избытком 6, который принимается в РгВ.
3. В РгА принимается второй операнд. Сумматор формирует значение zr=x6+y. При этом тетрады, из которых не возникли сигналы переноса, фиксируются.
4. В ргА формируется операнд, в тетрадах которого размещено число 10, если в соответствующих тетрадах zr не возникал сигнал переноса. zr из РгСм передается в РгВ.
5. Корректировка zr путем добавления операнда с 10 в РгА с блокировкой межтетрадных переносов. Полученный результат передается на выходную шину данных.
Для вычитания ДДК производятся такие действия:
1. Второй операнд Yпреобразуют в обратный код инвертированием каждого бита, при этом получается обратный код с избытком 6, т.к. каждая тетрада является дополнением до 15.
2. Выполняется суммирование . Если из старшей тетрады zr при формировании был перенос, то получено положительное значение результата. Если переноса не было из старшей тетрады, то результат является отрицательным в дополнительном коде. При этом дополнительный код инвертируется и добавляется 1 к младшему разряду. Полученное значение требует корректировки. Если при получении zr из тетрады был перенос, то в последствии к этой тетраде надо добавить 10 с блокировкой межтетрадных переносов.
3. Опции с ДДК со знаками сводятся к определению реальных опций, которые затем выполняются по приведенным схемам.