Алгоритм сложения ДДК

Текущему значению суммы частичных произведений добавляется множимое, если соответствующий разряд равен «1» и далее суммы частичных произведений сдвигаются вправо и т.д. Перенеся условную точку вправо через (n-1) разряд мы получим результат.

Алгоритм операции умножения.

Будем считать, что операнды представлены прямым кодом, т.е. старший разряд знаковый, остальные – числовые.

  1. Берутся модули от сомножителей;
  2. Сумма частичных произведений полагается равной нулю;
  3. Анализируется младший разряд множителя, если значение «1», то к текущему значению суммы частичных произведений добавляется множимое;
  4. Содержимое регистра множителя и сумматора частичных произведений сдвигается вправо на одно деление;
  5. п.3 и п.4 повторяются для всех разрядов множителя.
  6. Для окончательного размещения результата в двоичном виде производят сдвиг вправо на 1 разряд.
  7. Знак результата полагается «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. Опции с ДДК со знаками сводятся к определению реальных опций, которые затем выполняются по приведенным схемам.