Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритм умноженияв целых в доп коде.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
878 Кб
Скачать
☆

Пример умножения двух чисел 7 и -5.

Nо шага

Операция

N

OVR

XOR

РгСЧП

РгМТ

РгМТ[0]

Комментарии

0

Загрузка в Рг

0

0

0

0000

1011

1

1

+МН

0111

Загрузка в Рг

0

0

0

0111

1011

1

Сдвиг правый модиф.

0011

1101

1

2

+МН

0111

Загрузка в Рг

1

1

0

1010

1101

1

Сдвиг правый модиф.

0101

0110

0

3

+0

0000

Загрузка в Рг

0

0

0

0101

0110

0

Сдвиг правый модиф.

0010

1011

1

4

-МН

1001

Коррекция

результата

Загрузка в Рг

1

0

1

1011

1011

1

Сдвиг правый модиф.

1101

1101

1

Результат

1101

1101

или -35 дес.

Пример 3.2

Пусть необходимо умножить два числа -7 и 5.

Представим эти десятичные числа в форме четырех разрядного дополнительного двоичного кода: МН - 10012 и МТ - 01012, соответственно. Величина (–МН) равна 0111. Тогда имеют место действия, описанные таблицей 3.2.

Таблица 3.2

Пример умножения двух чисел -7 и 5.

Nо шага

Операция

N

OVR

XOR

РгСЧП

РгМТ

РгМТ[0]

Комментарии

0

Загрузка в Рг

0

0

0

0000

0101

1

1

+МН

1001

Загрузка в Рг

1

0

1

1001

0101

1

Сдвиг правый модиф.

1100

1010

0

2

+0

0000

Загрузка в Рг

1

0

1

1100

1010

0

Сдвиг правый модиф.

1110

0101

1

3

+МН

1001

Загрузка в Рг

0

1

1

0111

0101

1

Сдвиг правый модиф.

1011

1010

0

4

+0

0000

Нет коррекции результата

Загрузка в Рг

1

0

1

1011

1010

1

Сдвиг правый модиф.

1101

1101

1

Результат

1101

1101

или -35 дес.

Пример 3.3

Пусть необходимо умножить два числа -7 и -5.

Представим эти десятичные числа в форме четырех разрядного дополнительного двоичного кода: МН - 10012 и МТ - 10112, соответственно. Величина (–МН) равна 0111. Тогда имеют место действия, описанные таблицей 3.3.

Таблица 3.3

Пример умножения двух чисел -7 и -5.

Nо шага

Операция

N

OVR

XOR

РгСЧП

РгМТ

РгМТ[0]

Комментарии

0

Загрузка в Рг

0

0

0

0000

1011

1

1

+МН

1001

Загрузка в Рг

1

0

1

1001

1011

1

Сдвиг правый модиф.

1100

1101

1

2

+МН

1001

Загрузка в Рг

0

1

1

0101

1101

1

Сдвиг правый модиф.

1010

1110

0

3

+0

0000

Загрузка в Рг

1

0

1

1010

1110

0

Сдвиг правый модиф.

1101

0111

1

4

-МН

0111

Коррекция результата

Загрузка в Рг

0

0

0

0100

0111

1

Сдвиг правый модиф.

0010

0011

1

Результат

0010

0011

или +35 дес.

3.1.3. Операторная граф-схема алгоритма микропрограммной реализации операции умножения на учебном микропрограммируемом микропроцессоре

Предварительно распределим регистры микропроцессора, объявленные в подразделе 2.3.

Регистр R1 загрузим значением дополнительного кода МН.

Регистры R0 и RQ загрузим значением дополнительного кода МТ, кроме того, RQ затем будем использовать для накопления младших разрядов СЧП.

Регистр R2 - регистр старшей части СЧП, имеющий в начале нулевое значение.

Регистр R8 будем использовать как «сдвиговый регистр-счетчик» с начальным значением 1: отсчет количества циклов будем вести по старшему знаковому разряду.

Регистр R9 – вспомогательный регистр, в котором будем хранить числовое значение, необходимое для коррекции результата на последнем шаге выполнения алгоритма (или 0, или -МН).

Результат будем возвращать в регистры R2 (старшая часть результата произведения МН на МТ) и R0(младшая часть результата).

Оператор сдвига одинарной длины влево на один разряд над регистром R8, при котором выталкиваемое значение старшего разряда регистра R8[n-1] теряется, а в освободившийся младший разряд R8[0] заносится 0, обозначим как

R8 :=ЛевОдинЛог(R8+0).0;

где R8+0 – сумма значения восьмого регистра с нулем.

Оператор модифицированного сдвига двойной длины вправо на один разряд над регистрами R2 и RQ обозначим как

(R2,RQ) :=ПравДвМдф((R2+0),RQ);

где R2+0 – сумма значения второго регистра с нулем.

Причем в процессе реализации оператора одновременно выполняются следующие действия:

  • выталкиваемое значение младшего разряда регистра RQ[0] теряется,

  • выталкиваемое значение младшего разряда регистра R2[0] заталкивается в старший разряд регистра RQ[n-1],

  • в освободившийся разряд регистра R2[n-1] заносится значение результата битовой операции N xor V(OVR).

F – выход комбинационного АЛУ микропроцессора.

FZ – флаг значения признака равенства нулю результата F на выходе АЛУ микропроцессора: при FZ = 1 результат равен 0.

FN– флаг значения признака знака результата F на выходе АЛУ микропроцессора: при FN = 1 результат меньше 0.

Замечание. Установка флагов производится в конце текущего такта работы микропроцессора по результату выполнения в нем текущей микрооперации. Поэтому ветвление по этим признакам можно осуществлять только на следующем такте (не ранее).

Приняв указанные обозначения, выполним их подстановку в рассмотренный выше словесный алгоритм умножения, а затем переведем данный алгоритм на язык операторных граф-схем алгоритмов с учетом возможностей учебного микропрограммируемого микропроцессора (см. подраздел 2.3). Операторная граф-схема алгоритма реализации операции умножения, полученная таким образом, приведена рис. 3.2, 3.3.

Рис. 3.2. Операторная граф-схема алгоритма целочисленного умножения (первый вариант)

Рис. 3.3. Операторная граф-схема алгоритма целочисленного умножения (первый вариант). Окончание.

Ниже в таблице 3.4 приведем фрагмент двоичного кода микропрограммы умножения для соответствующих операторных и условных вершин из состава основного цикла граф-схемы алгоритма, приведенной на рис.3.2.

Таблица 3.4

Структура фрагмента микропрограммы (основной цикл)

AДес

ВR50

P30

М20

I86

I20

Сin

Aim

I53

АЗ0

В30

D70

01001

01110

1101

000

001

110

0

01

100

0000

0000

0000001

01010

01100

1100

000

001

011

0

01

000

0000

0010

0000000

01011

01101

0001

011*)

100

001

0

00

000

0001

0010

0000000

01100

00000

0010

011

100

011

0

00

000

0000

0010

0000000

01101

01001

0001

000

111

011

0

00

000

0000

0010

0000000

01110

00000

0010

011

100

001

0

00

000

1001

0010

0000000

01111

00000

0110

000

011

010

0

00

000

0000

0000

0000000

*) - в модели учебного микропроцессора операция двойного сдвига ПравДвМдф(…) обозначена как П_ДвАр_(…), т.е. как арифметический, однако выполняется как модифицированный сдвиг с занесением значения (N xor V) в старший разряд старшего регистра пары.

- состояние Aim, равное 012 , позволяет в модели разблокировать операцию записи очередных значений флагов операционного блока в регистр состояния учебного микропроцессора, которая по умолчанию устанавливается при пустой микрооперации (запись результата не производится, код I8..6 равен 0012).

3.1.4 Реализация устройства поразрядного умножения на VHDL

Не смотря на простоту, микропрограммная реализация алгоритма на универсальном операционном ядре, каким является учебный микропроцессор, имеет существенный недостаток – значительное время выполнения операции из-за большого числа подготовительных шагов, а также из-за временных затрат на организацию циклов и ветвлений. Очевидным решением этой проблемы является реализация алгоритма на аппаратном уровне или, другими словами, создание быстродействующей аппаратуры, жестко ориентированной на конкретный алгоритм.

Особенность современного этапа синтеза такой аппаратуры заключается в применении в процессе разработки языков описания аппаратуры таких, как VHDL. Это не только упрощает сам процесс разработки устройства, но и позволяет автоматизировать процесс синтеза и разводки проекта в базисе ПЛИС с применением современных САПР.

Рассмотрим вариант реализации с применением языка VHDL алгоритма поразрядного умножения 16-разрядных двоичных чисел со знаком, представленных в дополнительном коде. Причем проектируемое устройство должно обладать выходом с третьим состоянием. Функционально-временное моделирование будем производить в среде MaxPlus+II (v.10.2).

Предварительно разобьем задачу синтеза на две подзадачи: синтез операционной части устройства умножения и синтез автомата управления им.

В основу разработки положим структуру устройства, представленную на рисунке 3.1. Как видно из данного рисунка, в операционную часть устройства должны войти регистры множителя и множимого, регистр суммы частичных произведений, сумматор дополнительного кода, а также ряд дополнительных схем, назначение которых будет объяснено позднее.

Описание используемых библиотечных пакетов имеет следующий вид

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE IEEE.STD_LOGIC_arith.ALL;

С целью организации вновь вводимых типов и констант покажем вариант описания пакета, который может быть размещен как в отдельном файле, так и в теле текущего модуля (поместить перед вызовом рабочей библиотеки )

PACKAGE Types IS

CONSTANT INT15 : INTEGER := 15; -- константа целого типа, равная 15

CONSTANT INT31 : INTEGER := 31;

CONSTANT CONST016 : STD_LOGIC_VECTOR(INT15 DOWNTO 0) := X"0000";

CONSTANT CONST032 : SIGNED(INT31 DOWNTO 0) := X"00000000";

END Types;

Ссылку на данный пакет следует оформить следующим образом

USE WORK.Types.all;

При размещении пакета в отдельном файле необходимо помнить, что имя файла размещения пакета должно совпадать с именем самого пакета.

В случае применения типа signed необходимо к общему описанию ссылок на используемые библиотечные пакеты следует добавить ссылку на пакет IEEE.STD_LOGIC_signed:

USE IEEE.STD_LOGIC_signed.ALL;

Наиболее простым устройством из состава схемы умножителя является параллельный регистр множимого. Анализ алгоритма показывает, что данный регистр должен иметь цепи начального сброса в состояние логического 0, а также цепи начальной загрузки числового значения множимого, представленного в двоичном дополнительном коде.

Применив метод поведенческого описания, используя конструкцию «process», разработаем регистр на языке VHDL

RG_A: PROCESS (CLK, RST)

BEGIN

IF RST = '1' THEN

A<= X“0000”;

ELSIF CLK = '1' AND CLK'EVENT THEN

IF LAB = '1' THEN

A<= DA;

END IF;

END IF;

END PROCESS;

Что означает: если RST установлен в состояние логической 1, то выполнять асинхронный сброс регистра А в состояние логического 0, в противном случае по ближайшему положительному фронту CLK при установленном сигнале записи LAB, равном 1, в регистр А выполнить запись значения с входной шины DA.

Аналогичным способом синтезируем описание регистра множителя (регистр B). Данный регистр будет отличаться от регистра А тем, что помимо параллельной загрузки регистра числовым значением, устанавливаемым на входной информационной шине DB (при LAB = 1) , при наличии сигнала SHIFT, равного 1, с каждым новым тактом CLK осуществляется поразрядный сдвиг вправо числового значения множителя. Следовательно, процессное описание регистра B будет иметь вид:

RG_B: PROCESS (CLK, RST)

BEGIN

IF RST = '1' THEN

B<=CONST016;

ELSIF CLK = '1' AND CLK'EVENT THEN

IF LAB = '1' THEN

B<= DB;

ELSIF SHIFT = '1' THEN

B<='0'& B(INT15 DOWNTO 1); -- SHIFT TO RIGHT

END IF;

END IF;

END PROCESS;

Как видно из приведенного выше описания, в разрабатываемой схеме умножителя регистр множителя не используется для размещения последовательно образующихся младших разрядов суммы частичных произведений.

С учетом данного замечания, анализа алгоритма выполнения операции, регистр суммы частичных произведений имеет 32-разряда и может быть спроектирован следующим образом.

RG_P: PROCESS (CLK, RST, P)

BEGIN

IF RST = '1' THEN

P<=CONST032;

ELSIF CLK = '1' AND CLK'EVENT THEN

IF LAB = '1' THEN

P<= CONST032;

ELSIF SHIFT = '1' THEN

P<=S & P(INT15 DOWNTO 1); -- SHIFT TO RIGHT

END IF;

END IF;

END PROCESS;

Здесь величина S представляет собою сигнал, подключенный к параллельному информационному выходу мультиплексора блока суммирования/вычитания, построенного следующим образом:

-- ADD|SUB

ADDER: S<=P(INT31) & P(INT31 DOWNTO INT15+1) - SIGNED(A)

WHEN B(0) = '1' AND SIGN = '1' ELSE

P(INT31) & P(INT31 DOWNTO INT15+1) + SIGNED(A) WHEN B(0) = '1' ELSE

P(INT31) & P(INT31 DOWNTO INT15+1);

Как видно из представленного синтезируемого описания на последнем шаге алгоритма (SIGN =1) в случае, когда младший разряд только что сдвинутого вправо множителя равен 1 (множитель отрицательный), производится коррекция над полученным на предыдущем этапе значением суммы частичных произведений: из этого значения вычитается множимое, а затем весь результат сдвигается вправо на один разряд. Следует отметить, что сумматор здесь содержит (n+1)-разряд засчет использования двух разрядов для обработки знака. Такой подход позволяет легко отлавливать возможные переполнения разрядной сетки в процессе получения частичных сумм, а значит, в случае переполнения всякий раз производить восстановление знака результата путем модифицированного арифметического сдвига результата вправо.

Например:

110011

+ 110110

101001

Сдвиг модифицированный вправо 110100

Из данного примера виден механизм восстановления знака числа, который при его (при знаке) однобитном представлении был бы утерян в следствие возникшего в процессе суммирования переполнения.

Проанализировав приведенные выше описания компонентов умножителя, теперь разработаем условное графическое обозначение проектируемой операционной части умножителя. Для этого опишем заголовок объекта «операционная часть умножителя», архитектура которого только что была рассмотрена фрагментарно.

ENTITY mcu_op IS

PORT(

CLK, RST, LAB, SHIFT, SIGN, OUTHL, OE : in STD_ULOGIC;

DA, DB : in STD_LOGIC_VECTOR(INT15 DOWNTO 0);

DY : out STD_LOGIC_VECTOR(INT15 DOWNTO 0);

ZF : out STD_ULOGIC;

SF : out STD_ULOGIC

);

end mcu_op;

Это соответствует рис. , где необъявленный ранее вход OE используется для перевода в третье высокоомное состояние выходов результата умножителя.

Рис.3.4 Условно-графическое изображение операционной части устройства умножения

Установку буфера с третьим состоянием будем производить по выходу мультиплексора результата, выбор направления на котором осуществляется сигналом OUTHL (при единичном уровне сигнала на выход мультиплексора выдается параллельный код со старшей части регистра суммы частичных произведений (он же регистр результата)). В результате поведенческое описание мультиплексора выбора байта результата может иметь следующий вид:

-- SELECTOR

DP <= STD_LOGIC_VECTOR(P(INT15 DOWNTO 0)) WHEN OUTHL = '1' ELSE

STD_LOGIC_VECTOR(P(INT31 DOWNTO 16));

Создание же буфера состояний обеспечим за счет применения конструкции циклической (регулярной) генерации схем for … generate … При этом , в отличие от предыдущих подходов применим метод структурного описания объектов с вызовом объявляемых в описательной части архитектуры объекта компонентов. Например, для вызова компонента TRI следует после объявления архитектуры объекта (ARCHITECTURE) поместить ссылку:

COMPONENT TRi -- Z- буфер

PORT (A_in : IN STD_LOGIC; -- информационный вход элемента

OE : IN STD_LOGIC; -- управляющий вход элемента (при OE=1 выход

-- разрешен, иначе на выходе Z-состояние)

A_out : OUT STD_LOGIC); -- выход с Z-состоянием

END COMPONENT;

Тогда установить 16-разрядный буфер с тремя состояниями по выходу можно следующим образом:

TRIBus: FOR i IN 0 TO INT15 GENERATE

TRiBuffer: TRi PORT MAP (DP(i), OE, DY(i));

END GENERATE TRIBus;

На примере признака равенства нулю покажем, как можно сформировать выходной сигнал с открытым коллектором. Как и в случае компонента TRI, ссылку на компонент OPNDRN поместим в описательную часть тела архитектуры объекта.

COMPONENT OPNDRN -- О.К.

PORT ( a_in : IN STD_LOGIC;

a_out: OUT STD_LOGIC);

END COMPONENT;

Тогда с учетом механизма формирования флага равенства нулю результата получим

ZFI<='1' WHEN P(INT15 DOWNTO 0) = SIGNED(CONST016) ELSE '0';

OK_ZF: OPNDRN PORT MAP ( ZFI, ZF );

Теперь полностью соберем объект «операционная часть блока умножения». Таким образом синтезированный VHDL-код приведен в приложении П.1. На рис. приведен пример временной диаграммы работы операционного модуля, полученной в результате выполненного функционально-временного моделирования в среде MaxPlus+II.

Рис. 3.5 Функционально-временное моделирование операционной части устройства поразрядного умножения.

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

ENTITY mcu_ua IS

PORT(

CLK, RST, START : in STD_ULOGIC;

LAB, SHIFT, SIGN, RDY : out STD_ULOGIC

);

end mcu_ua;

При этом УГО автомата должно соответствовать рис. 3.6.

Рис. 3.6 УГО управляющего автомата устройства умножения

Из рис. 3.7 отчетливо видна последовательность подачи управляющих сигналов LAB, SHIFT и SIGN, а также синхронизированных с ними данных. Именно эту последовательность, полученную экспериментальным путем, мы положим в основу проектирования жесткой схемы управляющего автомата устройства.

С учетом холостого такта, такта загрузки, и 16 тактов пошаговой обработки (число тактов определяется разрядностью множителя) получим 18 состояний в машине состояния автомата, которые опишем перечислимым типом в описательной части архитектуры объекта

TYPE STATES IS

(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,FINISH);

И введем сигнал ST указанного типа.

SIGNAL ST : STATES;--

Синтез машины состояния выполняется в два этапа.

На первом этапе синтезируем процесс STATE, описывающий последовательность переключения автомата из одного состояния в другое. По сигналу сброса (RST = 1) автомат переключается в состояние покоя, обозначенное как FINISH. Переключение автомата в состояние работы (S1) выполняется по сигналу START.

STATE: PROCESS (CLK, RST)

BEGIN

IF RST = '1' THEN

ST<=FINISH;

ELSIF CLK = '1' AND CLK'EVENT THEN

CASE ST IS

WHEN S1 => ST<= S2;

WHEN S2 => ST<= S3;

WHEN S3 => ST<= S4;

WHEN S4 => ST<= S5;

WHEN S5 => ST<= S6;

WHEN S6 => ST<= S7;

WHEN S7 => ST<= S8;

WHEN S8 => ST<= S9;

WHEN S9 => ST<= S10;

WHEN S10 => ST<= S11;

WHEN S11 => ST<= S12;

WHEN S12 => ST<= S13;

WHEN S13 => ST<= S14;

WHEN S14 => ST<= S15;

WHEN S15 => ST<= S16;

WHEN S16 => ST<= S17;

WHEN S17 => ST<= FINISH;

WHEN FINISH => IF START='1' THEN ST<= S1;

ELSE ST<=FINISH; END IF;

END CASE;

END IF;

END PROCESS;

На втором этапе при помощи операторов условного присваивания осуществляется синтез условий для формирования таких управляющих сигналов как LAB (загрузка регистров A и B по шинам DA и DB, соответственно), SHIFT (шаг сдвига), SIGN (шаг коррекции), RDY(готовность результата) формируемых автоматом.

LAB <='1' WHEN ST=S1 ELSE '0';

SHIFT<='0' WHEN ST=S1 OR ST=FINISH ELSE '1';

SIGN <='1' WHEN ST=S17 ELSE '0';

RDY <='1' WHEN ST=FINISH ELSE '0';

На рис.__ представлены результаты функционально-временного моделирования управляющего автомата умножителя в среде MaxPlus+II, из которого видно полученной временной диаграммы с требуемой.

Рис. 3.7. Результаты функционально-временного моделирования управляющего автомата, разработанного синтезируемым способом.

С целью окончательной сборки устройства выполним подключение выходов управляющего автомата к одноименным входам операционной части устройства, остальные входы / выходы схемы подключить так, как это показано на рис.3.8. Ниже на рис.3.9 приведен пример временной диаграммы работы, доказывающий правильность выполненной сборки устройства поразрядного умножения двух 16-разрядных чисел представленных в дополнительном коде со знаком. Сигнал START устанавливается в состояние логической 1 и должен удерживаться в этом состоянии не менее оного периода CLK, но не более 17 тактов, иначе автомат может быть перезапущен вновь в работу.

Рис. 3.8 Функциональная схема устройства умножения

Рис. 3.9 Временная диаграмма работы устройства умножения

Числовые данные на шинах DA и DB выставляются одновременно с сигналом START и должны удерживаться в течение двух тактов (во втором после установки START обязательно), так как именно во втором такте после START с управляющего автомата будет сформирован сигнал LAB. После запуска автомата и получения от него сигнала готовности результата (RDY = 1) можно с регистра произведения (P) считать только что сформированный результат (при OUTHL = 0 – младшую часть, при OUTHL = 1 – старшую часть числового значения результата (см. рис. 3.9).