
МП
.pdf5.6Генераторы адреса данных ГАД и косвенная поставтомодифицирующая адресация
Большинство операций, реализующих функции цифровой обработки сигналов, организованы по циклическому принципу, а некоторые из них даже имеют внутреннюю циклическую разбивку.
Доступ к исходным данным из циклических программ по системе прямой адресации затруднен, поскольку каждый новый проход программы по телу цикла обычно требует использования новых исходных данных,
причем многие из них (например, ключевые последовательности)
используются многократно - после завершения очередного этапа вычислений, использующего все элементы последовательности, на следующем этапе начинается повторное использование элементов последовательности в том же порядке.
Для облегчения доступа к исходным данным и результатам промежуточных вычислений в описанных условиях в процессоре с помощью ГАД может быть организован косвенный поставтомодифицирующий принцип адресации кольцевых и линейных буферов.
При такой системе адресуется та принадлежащая буферу ячейка памяти, номер (адрес) которой указан в специальном регистре, называемом указателем. После обращения к ячейке содержимое указателя автоматически изменяется на значение (положительное или отрицательное) числа,
записанного в специальном регистре - модификаторе, при этом буфер рассматривается процессором как кольцевой, т.е. первая ячейка буфера рассматривается как следующая непосредственно за последней, и, таким образом, содержимое указателя всегда остается в пределах адресного пространства буфера (если значение содержимого модификатора не превышает по абсолютной величине значения длины буфера).
41
Структура ГАД иллюстрируется рис. 11. В состав каждого ГАД входят четыре комплекта пар 14 - разрядных регистров I - указателей косвенной адресации и L - длины буфера, а также четыре 14 - разрядных регистра - модификатора M.
Косвенный поставтомодифицирующий режим адресации к кольцевым буферам организуется в следующей последовательности.
В начале программы адресуемый буфер должен быть объявлен как кольцевой, и, при необходимости, инициализирован, например, следующими псевдоинструкциями ассемблера.
.section/dm vars;
.var /circ |
ish_d [5] = 3, 7, 0, 36, 0x3A; |
Перед началом цикла обращений пара регистров IK и LK должна быть привязана к соответствующему буферу: регистр - указатель IK должен быть установлен на ячейку начала адресации (при этом адрес начала буфера может быть указан как имя_буфера), а в регистр длины LK должно быть записано значение длины кольцевого буфера (в абсолютном выражении или как length(имя_буфера)). В регистр - модификатор МN должно быть записано положительное или отрицательное значение величины шага изменения адреса при обращении, например:
I1 = ish_d + 1; // I1 указывает на первую по номеру (вторую
//по счету) ячейку буфера ish_d
L1 = length(ish_d);
M3 = -2; // изменение адреса доступа будет осуществляться
//в порядке убывания адресов с шагом 2 ячейки
Впределах цикла (равно как и за его пределами) любое обращение к буферу командой, использующей синтаксис dm(i1, m3), будет вызывать обращение к ячейке буфера по адресу, указанному регистром I1, после чего к содержимому регистра I1 будет прибавлено содержимое регистра М3 с
42

учетом его знака. При этом если содержимое М3 меньше содержимого L1,
то выхода за границы буфера не произойдет, поскольку ячейка кольцевого буфера ish_d будет интерпретироваться процессором как следующая непосредственно за ячейкой с адресом ish_d + 4.
Рис. 11
43
Так, в рассматриваемом примере выполнение группы команд
ax0 = dm (i1, m3); |
// чтение в AX0 из второй по счету |
|
|
// (первой по номеру) ячейки и |
|
|
// установка указателя на 2 ячейки назад |
|
|
// к последней ячейке буфера |
|
ax1 = dm (i1, m3); |
// |
чтение в AX1 из последней ячейки |
|
// и установка указателя на 2 ячейки назад |
|
|
// к третьей по счету ячейке буфера |
|
ar = dm (i1, m3); |
// чтение в AR из третьей по счету (второй |
|
|
// по номеру) ячейки и установка указателя |
|
|
// на 2 ячейки назад к первой ячейке буфера |
|
ay0 = dm (i1, m3); |
// |
чтение в AY0 из первой по счету (нулевой |
|
// по номеру) ячейки и установка указателя |
|
|
// |
на 2 ячейки назад к предпоследней ячейке |
|
// буфера |
|
ar = ax0 + ay0; |
// сложение содержимого AX0 и AY0 |
|
dm (i1, m3) = ar; |
// |
запись результата в предпоследнюю |
|
// ячейку буфера и установка указателя на 2 |
|
|
// ячейки назад |
|
mr0 = dm (i1, m3); |
|
|
приведет к следующему заполнению регистров:
-в регистр AX0 будет записано число 7, в регистр AX1 будет записано число 0х3А, в регистр AR - число 0, в регистр AY0 - число 3;
-далее в регистр AR будет записана сумма содержимого регистров
AX0 и AY0, равная 10, и эта сумма будет записана по месту числа 36 в
третью (четвертую по счету) ячейку буфера, а в регистр MR0 будет занесено число 7.
44
Если установить значение регистра модификатора MN равным нулю,
то система адресации, использующая синтаксис dm(IK,MN) будет тождественна обычной косвенной адресации.
При организации косвенной поставтомодифицирующей адресации ячеек линейных (не кольцевых !) буферов значение содержимого регистра длины LK должно быть установлено равным нулю, в противном случае вычисление очередного адреса обращения будет плохо предсказуемым. При использовании такой адресации, кроме того, важно отслеживать момент выхода указателя за пределы буфера, поскольку процессор интерпретирует как следующую после последней ячейки линейного буфера не первую его ячейку, а следующую за последней в общем адресном пространстве ячейку памяти процессора.
При косвенной поставтомодифицирующей адресации ячеек с буфером должна быть ассоциирована пара регистров IK и LK обязательно с одинаковым номером; для этого в целях повышения наглядности на рис. 10.
регистры I и L объединены в соответствующие пары. В команде в паре с любым регистром I (определяющим, фактически, пару регистров I и L) может быть использован любой регистр - модификатор М, принадлежащий данному ГАД; поэтому сочетания типа (i0, m0), (i4, m7) и подобные в командах допустимы, а сочетания типа (i1, m4), (i7, m2) и им подобные - нет.
С использованием регистров ГАД2 может быть организована косвенная поставтомодифицирующая адресация ячеек линейных и кольцевых буферов как в ОЗУ данных, так и в ОЗУ программ, а с использованием регистров ГАД1 - только в ОЗУ данных. С этой точки зрения использование конструкций команд типа, например,
my1 = pm(i7, m4);
допустимо, а типа
45
my1 = pm(i2, m0);
- нет.
Помимо упомянутых конструкций команд, использующих синтаксис
(IK, MN), процессор поддерживает команду modify, например,
modify (i1, m3);
Эта команда изменяет значение содержимого регистра I1 на значение содержимого регистра M3 по тем же правилам, что и команды косвенной поставтомодифицирующей адресации - как для линейных, так и для кольцевых буферов.
6. Группа команд пересылки данных
В системе команд процессора ADSP-2181 допустимы следующие конструкции команд пересылки (в правой части команды указывается источник, а в левой - приемник информации при пересылке):
reg = reg;
reg = число_или_символическое_имя_константы; reg = dm(адрес_или_символическое_имя_ячейки); dm(адрес_или_символическое_имя_ячейки) = reg;
dreg = io(адрес_параллельного_порта_ввода_информации); io(адрес_параллельного_порта_вывода_информации) = dreg; dreg = dm(IK, MN);
dreg = pm(IK, MN); dm(IK, MN) = dreg; pm(IK, MN) = dreg;
(по правилам, изложенным в предшествующих разделах !).
46

7. Группа команд управления ходом выполнения программы
7.1Команды переходов и вызова подпрограмм Группа команд управления ходом выполнения программы
иллюстрируется рис. 12. Условные и безусловные переходы организуются с помощью команды JUMP (с указанием условия в поле IF или без оного) либо по адресу, прямо указанному в команде (в абсолютном выражении или в виде символической метки), либо по содержимому регистров указателей I4 ... I7
генератора ГАД2, которое интерпретируется как адрес перехода.
if условие |
JUMP |
|
( I 4 ) |
|
|
|
( I 5 ) |
|
CALL |
|
( I 6 ) |
|
|
|
( I 7 ) |
|
|
|
|
|
|
|
Адрес или символическое |
|
|
|
имя метки |
Рис. 12
Аналогичным образом с использованием команды CALL организуется условный или безусловный вызовы подпрограммы. Если в тексте программы используются метки, то синтаксис их символических имен должен соответствовать синтаксису символических имен констант или переменных;
после метки должен ставиться символ двоеточия. Метка в пределах модуля программы должна иметь уникальное имя и должна размещаться непосредственно перед командой, к исполнению которой программа должна приступить в результате перехода, отделяясь от этой команды как минимум одним пробелом.
47

7.2Возврат из подпрограмм Условный или безусловный возврат из обычной подпрограммы
осуществляется по команде RTS, а из прерывающей подпрограммы - по команде RTI.
if условие RTS ; if условие RTI ;
Мнемокоды условий выполнения команд JUМP, CALL, RTS, RTI
приведены на рис. 3.
7.3Организация циклов
Аппаратными средствами процессора ADSP-2181 (не показанными на приводимых схемах) поддерживается система организации циклов,
минимизирующая время их выполнения. В приведенных на рис. 13.
конструкциях организации циклов многократно выполняется только само тело цикла, а проверка выполнения условий выхода из цикла (их мнемоника приведена на рис. 3) осуществляется аппаратно и не увеличивает времени выполнения программы.
DO метка UNTIL условие выхода из цикла ;
ТЕЛО ЦИКЛА
последняя команда тела цикла
Рис. 13 Для организации циклических программ с заданным количеством
проходов тела цикла (счетные циклы) используется аппаратный счетчик циклов с символическим именем CNTR в соответствии с рис. 14,
дополненный аппаратным стеком, обеспечивающим глубину вложения до четырех циклических конструкций. Действия в счетчике - декремент и
48
проверка на предмет равенства нулю - производятся аппаратно и не увеличивают времени выполнения программы.
CNTR = количество проходов тела цикла ;
DO метка UNTIL СЕ ;
|
ТЕЛО ЦИКЛА |
метка: |
последняя команда тела цикла |
|
|
|
|
|
Рис. 14 |
Во всех конструкциях организации циклов метка конца цикла должна непосредственно указывать на последнюю команду тела цикла в соответствии с рис. 13 и рис. 14.
8. Многофункциональные операции
Пятишинная архитектура процессора ADSP-2181 обеспечивает возможность выполнения за один машинный цикл не только одной команды,
но и в отдельных случаях совмещать выполнение нескольких команд в одном машинном цикле.
Допустимые в системе команд процессора ADSP-2181 конструкции многофункциональных операций, совмещающих в одном машинном цикле выполнение нескольких команд, приведены на рис. 15. Совмещаемые команды отделяются друг от друга запятыми.
49

Рис. 15
9. Прочие команды
Группа команды, не упоминавшихся ранее и не отнесенных к перечисленным ранее классам, представлена на рис. 16. (приведенная классификация отличается от используемой, например в [ 2 ] ).
Команды SET (установка высокого логического уровня). RESET (установка низкого логического уровня) и TOGGLE (инверсия логического уровня) предназначены для управления состоянием (напряжением)
логического сигнала на внешних выводах процессора, указанных в команде. NOP представляет собой пустую операцию.
Команда ENA (активизировать) и DIS (дезактивировать):
BIT_REV - бит - реверсную адресацию буферов из ГАД1;
50