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


РегистрПримечание
Регистры данных <dreg>
AX0, АХ1, AY0, AY1
AR
MX0, МХ1, MY0, MY1
MR0, MR1, MR2
SI, SE, SR0, SR1
Остальные регистры <reg>
I0, I1, I2, I3, I4, I5, I6, I7
M0, M1, M2, M3, M4, M5, M6, M7
L0, L1, L2, L3, L4, L5, L6, L7
TX0, TX1, RX0, RX1
SB, PX
ASTAT, MSTAT
SSTATТолько чтение
IMASK, ICNTL
IFCТолько запись
CNTR
OWRCNTRТолько запись

Следует обратить внимание на то, что регистры <dreg> являются подмножеством регистров <reg>, поэтому их можно применять в командах, где используется условное сокращение <reg>.

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

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

|AF| | C |

| yop + C |

| constant |

Она означает, что если условие cond предыдущей команды выполняется, то в регистр AR или AF будет занесен результат сложения операнда xop с операндом yop или с переносом или с константой. Разрешенные операнды xop, yop и константы constant указываются для группы команд индивидуально, поскольку они не всегда могут быть произвольными. Например, для команд АЛУ разрешено использовать в качестве операнда xop регистры; AX0, АХ1, AR, MR0, MR1, MR2, SR0, SR1. В качестве операнда yop допускается использование регистров: AY0, AY1 и AF. Причем команда DIVS не может использовать регистр AY0.

Коды условий cond с описанием их назначения приведены в табл. 13.5.

Таблица 13.5 Коды условий cond с описанием их назначения

Код условия cond оператора IFОписание
EQРавно нулю
NEHe равно нулю
LTМеньше нуля
GEБольше или равно нулю
LEМеньше или равно нулю
GTБольше нуля
ACПеренос АЛУ
NOT ACНет переноса АЛУ
AVПереполнение АЛУ
NOT AVНет переполнения АЛУ
MVПереполнение умножителя
NOT MVНет переполнения умножителя
NEGВходной операнд xop отрицателен
POSВходной операнд xop положителен
NOT CEСчетчик циклов не пуст
FLAG_IN*Вывод FI = 1
NOT FLAG_IN*Вывод FI = 0

* Только для команд JUMP и CALL.

Таким образом, предыдущая запись означает, что команда сложения может быть записана в одном из следующих вариантов:

IF EQ AR=AX0+AY1;

IF EQ AR=AR+AY1+C;

IF EQ AF=AX0+AY1;

IF NE AF=AX0+AY1;

AR=AX0+AF;

и т.п.

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

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

Для завершения обзора команд сигнального процессора нам остается рассмотреть многофункциональные команды и команды, которые нельзя отнести к какой-либо конкретной группе в силу того, что они выполняют различные функции. Здесь они будут называться дополнительными командами.

Многофункциональные команды

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

Рассмотрим многофункциональную команду выполнения операций АЛУ и MAC с одновременным чтением операндов из памяти данных и памяти программ. Пример такой команды приведен ниже:

MR=MR+MX0*MY0(SS), MX0=DM(I3,M0), MY0=PM(I7,M4);

В первой части этой команды в регистр MR (регистр результата MAC), записывается сумма его предыдущего значения и произведения текущих значений входных регистров умножителя MX0 и MY0. Здесь оба слагаемых рассматриваются в знаковом формате.

Вторая и третья части данной многофункциональной команды осуществляют выбор двух новых операндов. Один операнд выбирается из памяти данных DM по адресу, указанному в индексном регистре I3, содержимое которого затем модифицируется с помощью значения регистра модификации M0. Второй операнд выбирается из памяти программы PM по адресу, указанному в регистре I7, содержимое которого затем модифицируется величиной, содержащейся в регистре модификации M4. Значения индексов берутся из регистров генераторов адреса данных. Любой индексный регистр I одного генератора адреса данных может использоваться в паре с любым регистром модификации M того же генератора адреса данных.

Поскольку считывание данных из регистров процессора производится в начале цикла, а запись в регистры - в конце цикла, операнды, находящиеся в регистрах MX0 и MY0 в начале командного цикла, перемножаются, а затем произведение добавляется к содержимому регистра результата умножителя MR. После окончания операции умножения операнды обновляются новыми значениями, которые были выбраны в конце того же командного цикла и становятся доступными для вычислений с ними в следующем цикле. Естественно, что одновременно с вычислением можно загрузить любой регистр данных, а не только регистры умножителя/накопителя, как в приведенном выше примере.

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

• осуществляется выбор двух операндов (например, коэффициента и данных);

• производится перемножение операндов и суммирование результата умножения с полученными до этого результатами.

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

Например, следующий операнд X должен загружаться в регистр MX0 из памяти данных, а новый операнд Y должен загружаться в регистр MY0 из памяти программ (для команд данного уровня несущественно, из внутренней или из внешней памяти). Кроме того, результат вычисления должен записываться в регистр результата (MR или AR), ни в коем случае не в регистр обратной связи (MF или AF).

Теперь рассмотрим команды одновременного чтения из памяти данных и памяти программ. Эти команды представляют собой разновидность описанного выше вида многофункциональных команд. Их особенностью является отсутствие вычислений. Эти команды задают только одновременную выборку двух операндов. Пример такой команды приведен ниже:

AX0=DM(I2,M0), AY0=PM(I4,M6);

В данном примере в качестве регистров-приемников используются входные регистры АЛУ. Как и в предыдущем типе многофункциональных команд, здесь операнды X должны извлекаться из памяти данных, а операнды Y - из памяти программ (и в том и в другом случае из внешней или из внутренней памяти процессоров с внутренней памятью на кристалле).

Существуют многофункциональные команды выполнения вычислений с одновременным считыванием из памяти. Если, в отличие от описанных выше многофункциональных команд, вместо двойного считывания из памяти, команда задает выполнение только одной операции считывания из одного типа памяти, то одновременно с выборкой данных из памяти можно произвести различного рода вычисления. К числу таких разрешенных вычислений относятся все операции АЛУ, за исключением деления, все операции умножителя-накопителя MAC и все операции устройства сдвига, за исключением непосредственного сдвига SHIFT IMMEDIATE. Все вычисления должны быть безусловными. Пример многофункциональной команды такого типа приведен ниже:

AR=AX0+AY0, AX0=DM(I0,M3);

В этом примере в АЛУ выполняется операция сложения, в то время как из памяти данных выбирается один операнд. Этот тип многофункциональных команд имеет те же ограничения, что и предыдущий. Значение, хранящееся в регистре AX0 и используемое как исходное в ходе вычислений, представляет собой содержимое этого регистра в начале цикла. В конце цикла в результате операции считывания данных из памяти в регистр AX0 загружается новое значение. По этой же причине регистром назначения (в этом примере AR) не может быть регистр, указанный в качестве регистра назначения при считывании данных из памяти.

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

DM(I0,M0)=AR, AR=AX0+AY0;

В приведенном примере исходным значением для записи в память (значение, содержащееся в регистре AR) является значение, хранящееся в этом регистре в начале цикла. В результате произведенного вычисления в этот же регистр загружается новое значение, которое является содержимым регистра AR в конце цикла. При постановке операторов данной команды в обратном порядке, что является неразрешенным действием, ассемблер генерирует предупреждение, подразумевающее, что в память записывается результат вычисления, а не предыдущее значение регистра, которое должно было записываться в память. Использование при этом одного и того же регистра не является обязательным, хотя именно таким образом чаще всего организуется конвейер операндов для вычисления. Для вычислительных операций с помощью таких команд действуют те же ограничения, что и для команд, рассмотренных выше. Разрешенными являются все операции АЛУ, кроме деления, все операции умножителя-накопителя MAC и все операции устройства сдвига, кроме непосредственного сдвига. Вычисления должны быть безусловными.

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

AR=AX0+AY0, AX0=MR2;

В данном примере операция сложения в АЛУ производится одновременно с загрузкой в регистр AX0 нового значения, взятого из регистра MR2. Как и в предыдущих примерах, для вычисления используется значение, содержащееся в регистре AX0 в начале цикла. Данные могут между всеми регистрами ввода или вывода АЛУ, умножителя-накопителя MAC и устройства сдвига, за исключением регистров обратной связи (AF и MF) и регистра SB. В рассмотренном примере новое значение загружается в регистр AX0 из регистра данных в конце цикла. Разрешенными являются все операции АЛУ, кроме деления, все операции умножителя-накопителя и все операции устройства сдвига, кроме непосредственного сдвига. Вычисления должны быть безусловными.

Ниже приводится полный список многофункциональных команд в соответствии с принятыми ранее условными обозначениями. Назначение команд приводится в тексте описания этих команд. Вычисление с пересылкой регистр-регистр:

| <ALU> |, dreg = dreg;

| <MAC> |

|<SHIFT>|

Вычисление с чтением из памяти:

|<ALU> |,dreg = |DM(|I0|,|M0|)|;

|<MAC> | | |I1| |M1| |

|<SHIFT>| | |I2| |M2| |

| |I3| |M3| |

| |I4| |M4| |

| |I5| |M5| |

| |I6| |M6| |

| |I7| |M7| |

| |

|PM(|I4|,|M4|)|;

| |I5| |M5| |

| |I6| |M6| |

| |I7| |M7| |

Вычисление с записью в память:

|DM(|I0|,|M0|)|=dreg, |<ALU> |;

| |I1| |M1| | |<MAC> |

| |I2| |M2| | |<SHIFT>|

| |I3| |M3| |

| |I4| |M4| |

| |I5| |M5| |

| |I6| |M6| |

| |I7| |M7| |

| |

|PM(|I4|,|M4|)|;

| |I5| |M5| |

| |I6| |M6| |

| |I7| |M7| |

Чтение памяти данных и программ:

|AX0|=DM(|I0|,|M0|), |AY0|=PM(|I4|,|M4|);

|AX1| |I1| |M1| |AY1| |I5| |M5|

|MX0| |I2| |M2| |MY0| |I6| |M6|

|MX1| |I3| |M3| |MY1| |I7| |M7|

Команда АЛУ или MAC с чтением памяти данных и программ:

|<ALU>|,|AX0|=DM(|I0|,|M0|), |AY0|=PM(|I4|,|M4|);

|<MAC>| |AX1| |I1| |M1| |AY1| |I5| |M5|

|MX0| |I2| |M2| |MY0| |I6| |M6|

|MX1| |I3| |M3| |MY1| |I7| |M7|

В качестве регистров dreg могут быть использованы регистры: AX0, АХ1, AY0, AY1, AR, MX0, МХ1, MY0, MY1, MR0, MR1, MR2, SI, SE, SR0 и SR1.

Примечания:

<ALU>¹ - любая команда АЛУ (исключая DIVS и DIVQ);

<MAC>¹ - любая команда умножителя/накопителя;

<SHIFT>² - любая команда устройства сдвига (исключая непосредственный сдвиг);

где ¹ - должны использоваться только регистры результатов AR, MR, а не регистры обратных связей AF, MF; ² - не могут быть условными командами.

Дополнительные команды

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

Пустая команда:

NOP;

Модифицировать регистр адреса:

MODIFY(|I0|,|M0|);

|I1| |M1|

|I2| |M2|

|I3| |M3|

|I4| |M4|

|I5| |M5|

|I6| |M6|

|I7| |M7|

Управление стеками:

[|PUSH| STS] [,POP CNTR] [,POP PC] [,POP LOOP];

|POP |

Управление режимом:

|ENA| |SEC_REG | [, ...];

|DIS| |BIT_REV |

|AV_LATCH|

|AR_SAT |

|M_MODE |

|TIMER |

|G_MODE |

|INTS |

Ключевые слова означают следующие режимы:

SEC_REG - фоновый регистровый файл;

BIT_REV - бит-реверс адреса генератора DAG1;

AV_LATCH - защелка статуса переполнения АЛУ (AV);

AR_SAT - насыщение регистра AR;

M_MODE - режим размещения результата MAC;

TIMER - разрешить работу таймера;

G_MODE - разрешить режим "Go mode";

INTS - разрешить прерывания.

NOP - это команда отсутствия операций. Она часто применяется для выполнения холостого цикла процессора в качестве задержки на один такт.

Команда MODIFY позволяет модифицировать указатель адреса в заданном регистре I на величину, которая содержится в заданном регистре M, не обращаясь при этом к памяти. Как и во всех других случаях, регистры I и M должны быть регистрами одного и того же генератора адреса данных; любой регистр I0–I3 может использоваться в комбинации с любым регистром M0–M3, а любой регистр I4–I7 - с любым регистром M4–M7.

Команды PUSH и POP позволяют непосредственно управлять содержимым стеков состояния, счетчика, счетчика программ (PC) и циклов. Некоторые из этих стеков автоматически заполняются и опустошаются во время обслуживания прерываний.

Команды управления режимом разрешают и блокируют режимы некоторых операций процессора. Эта команды управляют режимами реверсной адресации в генераторе адреса данных 1, фиксацией переполнения АЛУ, насыщением регистра результата АЛУ, выбором набора основных или теневых регистров, режимом GO для непрекращающейся работы процессора во время предоставления шины, режимом сдвига в умножителе для выполнения целочисленных или дробных вычислений и активизацией таймера. За операторами ENA или DIS может следовать через запятую сколько угодно идентификаторов. Команды ENA и DIS могут повторяться в командной строке. Кроме того, все семь режимов могут разрешаться, блокироваться или изменяться при помощи всего одной команды.

Назад Дальше