Регистр | Примечание |
---|---|
Регистры данных <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 | Равно нулю |
NE | He равно нулю |
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 могут повторяться в командной строке. Кроме того, все семь режимов могут разрешаться, блокироваться или изменяться при помощи всего одной команды.