Чтение онлайн

ЖАНРЫ

Разработка устройств на основе цифровых сигнальных процессоров фирмы Analog Devices с использованием Visual DSP++

Вальпа Олег Дмитриевич

Шрифт:

Рис. 14.4. Операция DIVQ

Пусть NL — число разрядов влево и NR — число разрядов вправо от двоичной точки делимого, DL и DR — соответственно то же самое, только для делителя. Тогда частное состоит из NL-DL+1 битов слева от двоичной точки и содержит NR-DR-1 битов справа. Ниже показан пример формата чисел при выполнении операции деления.

Делимое: XXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXX

NL=5 бит NR=27 бит

Делитель: XX.XXXXXXXXXXXXXX

DL=2 бит DR=14

бит

Частное: XXXX.XXXXXXXXXXXX

(NL-DL+1)=4 бит (NR-DR-1)=12 бит

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

Чтобы разделить два целых числа (делимое в формате 32, а делитель в формате 16), необходимо перед делением привести делимое к формату 31, т.е. сдвинуть его влево на один разряд. Если результат не может быть представлен в формате частного, как сказано выше, или когда делитель равен нулю или меньше делимого по абсолютному значению, происходит переполнение.

При реализации алгоритма деления для знаковых операндов делитель должен храниться в AX0 и AX1 или в любом регистре с шины R. Старшее слово делимого может быть загружено в AY1 или AF, и младшее слово делимого загружается в AY0. Чтобы вычислить частное, сначала выполняется команда DIVS, которая вычисляет знак частного, за которой следуют 15 команд DIVQ, для вычисления 15 бит частного. Пример подпрограммы знакового деления с фиксированной точкой показан ниже. Эта подпрограмма берет делитель из регистра AX0, старшее слово делимого из AF и младшее слово делимого из AY0. Частное возвращается в AY0.

.MODULE Sig_Div_FP; {

 Входные данные:

AF = старшее слово делимого

AY0 = младшее слово делимого

AX0 = 16-битный делитель

 Выходные данные:

AY0 = 16-битный результат

 Изменяемые регистры:

AY0, AF

 Время вычисления=17 циклов

}

.ENTRY sdivfp;

sdivfp: DIVS AF, AX0; {Вычисление знакового бита}

DIVQ AX0; DIVQ AX0; DIVQ AX0; {Вычисление 15 бит частного}

DIVQ AX0; DIVQ AX0; DIVQ AX0;

DIVQ AX0; DIVQ AX0; DIVQ AX0;

DIVQ AX0; DIVQ AX0; DIVQ AX0;

DIVQ AX0; DIVQ AX0; DIVQ AX0;

RTS;

.ENDMOD;

Ниже приводится полный список команд ALU в соответствии с принятыми ранее условными сокращениями. Назначение команд очевидно из их записи и комментариев для некоторых из команд. Команды сложения и сложения с переносом:

[IF cond] |AR| = xop + |yop |;

|AF| |C |

|yop + C |

|constant|

Команды

вычитания и вычитания с займом:

[IF cond] |AR| = xop - |yop |;

|AF| |yop+С-1 |

|constant|

[IF cond] |AR| = yop - |xop |;

|AF| |xop+C-1 |

|constant|

Команды логических операций И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ:

[IF cond] |AR| = xop |AND| yop;

|AF| |OR |

|XOR|

Команды передачи:

[IF cond] |AR| = PASS|xop |;

|AF| |yop |

|constant|

Команды смены знака:

[IF cond] |AR| = - |xop|;

|AF| |yop|

Команды логического отрицания HE:

[IF cond] |AR| = NOT |xop|;

|AF| |yop|

|0 |

Команды вычисления абсолютного значения:

[IF cond] |AR| = ABS |xop|;

|AF|

Команды инкремента:

[IF cond] |AR| = |yop+1|;

|AF|

Команды декремента:

[IF cond] |AR| = |yop-1|;

|AF|

Команды битовых операций:

[IF cond] |AR| = |TSTBIT n xop|; {операция логического «И» разряда n с 1}

|SETBIT n xop|; {операция установки разряда n в 1}

|CLBIT n xop|; {операция установки разряда n в 0}

|TGBIT n xop|; {операция «ИСКЛЮЧАЮЩЕЕ ИЛИ» бита n с 1}

Здесь n могут принимать значения от 0 до 15

Команды поразрядного деления:

[IF cond] |AR| = DIVS yop, xop;

[IF cond] |AR| = DIVQ xop;

Команды тестирования результата:

NONE = <ALU>;

Последняя команда выполняет заданную команду АЛУ, устанавливает флаги и сбрасывает значение результата. Она позволяет тестировать значения в регистрах без изменения содержимого AR или AF. Строка <ALU> — это любая безусловная команда АЛУ, кроме DIVS, DIVQ и дополнительных команд АЛУ с константами.

Для всех приведенных выше команд ALU разрешено использовать следующие операнды:

xop: AX0, АХ1, AR, MR0, MR1, MR2, SR0, SR1; yop: AY0, AY1, AF;

constant: 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32767, -2, -3, -5, -9, -17, -33, -65, -129, -257, -513, -1025, -2049, -4097, -8193, -16385, -32768.

Команда DIVS не может использовать регистр AY0 как оператор yop. Коды условия IF соответствуют кодам, приведенным ранее в табличном виде.

Примеры записи команд:

AR=AX0+AY0+C; /* Присвоить регистру AR значение суммы регистров AX0, AY0

Поделиться с друзьями: