Программно доступные регистры. Приведенные в статьях данного раздела сведения о структурных и функциональных особенностях цифровых сигнальных процессоров рассматриваемого семейства являются полезными для программистов. Однако для разработки программного обеспечения проектируемых микропроцессорных устройств их недостаточно и необходимо располагать дополнительными сведениями о тех ресурсах процессора, которые относятся непосредственно к программированию процессоров и составляют их программную модель.
Под программной моделью процессора будем понимать совокупность всех его ресурсов, которыми программист может распоряжаться при разработке программ.
К таким ресурсам, прежде всего, относятся набор программно доступных регистров и (или) ячеек памяти, адресные пространства и возможные способы адресации, полный набор команд. С тонки зрения программиста процессор может быть представлен как набор блоков, правила функционирования которых задаются и поддерживаются программно доступными регистрами. С помощью команд такие регистры позволяют принять, сохранить и выдать данные (регистры АХ0, АХ1, AY0, AY1, AR, AF, MX0, МХ1, MY0, MY1, MR, MF, SI, SR и др.) и адреса (например, индексные регистры I в генераторах адресов данных), выдать информацию о состоянии процессора (например, регистр арифметического статуса ASTAT и статусные регистры HSR6, HSR7 интерфейса HIP), задать тот или иной режим работы процессора (системный регистр, регистры управления портами SPORT0, SPORT1 и др.).
Назначение и основные функции всех программно доступных регистров процессоров семейства ADSP–21XX приведены в табл. 8.4.1. Регистры условно отнесены к тем устройствам процессора, которые они «обслуживают». Для наглядности регистры изображены на рис. 8.4.1. Рядом с обозначением регистра указаны его адрес (если он расположен во внутренней памяти данных) и разрядность (если она отличается от 16).
Средства памяти и адресные пространства. В процессорах семейства ADSP–21XX используются следующие аппаратные средства памяти:
? RAM внутренней памяти данных (для большинства версий микросхем 0,5K или 1K 16–разрядных слов) и возможно RAM внешней памяти данных. Суммарный объем памяти данных не должен превышать 16K слов. Часть внутренней памяти данных задействована под регистры периферийных устройств кристалла. К ним относятся:
• системный регистр, DWAIT — интерфейс памяти;
• TSCALE, TCOUNT, TPERIOD — таймеры;
• автобуфер, RFSDIV, SCLKDIV, Control — порты SPORT0, SPORT1;
• регистры многоканального режима работы SPORT0;
• HDR0…HDR5, HSR6, HSR7, HMASK — HIP;
• DAC, ADC, Control, Автобуфер — аналоговый интерфейс;
? RAM или/и ROM внутренней памяти программ (для большинства версий микросхем 1K или 2K 24–разрядных слов) и возможно RAM или/и ROM внешней памяти программ. Суммарный объем памяти программ не должен превышать 16K слов;
? регистры основных устройств (см. рис. 8.4.1):
• АХ0, АХ1, AY0, AY1, AR, AF — ALU;
• MX0, MX1, MY0, MY1, MR0, MR1, MR2, MF — MAC;
• SR0, SR1, SI, SE, SB – SHIFTER;
• I0–I7, М0–М7, L0–L7 — DAG;
• РХ — устройство обмена между шинами данных;
• ASTAT, MSTAT, SSTAT (только для чтения), ICNTL, IMASK, IFC (только для записи), CNTR, OWRCNTR (только для записи) — PS;
• RX0, RX1, ТХ0, ТХ1 — SPORT;
? ROM внешней загрузочной памяти объемом до 16K 24–разрядных слов. Таким образом, для процессоров семейства ADSP–21ХХ можно выделить четыре адресных пространства:
? адресное пространство памяти данных, карта которого приведена на рис. 8.4.2. Для большинства микросхем память на кристалле имеет размер до 1K 16–разрядных слов и начинается по адресу 0x3800. При этом внутренняя память с адресами 0х3С00…0х3FFF отведена под регистры. Внешняя память данных объемом 14K 16–разрядных слов разбита на пять областей DWAIT0–DWAIT4, для каждой из которых в регистре управления циклами ожидания памяти данных DWAIТ (табл. 8.4.2) может быть закодировано число (от 0 до 7) циклов ожидания.
Это позволяет организовать работу процессора с «быстрыми» и «медленными» внешними устройствами, выделяя для них различные области памяти с тем или иным числом циклов ожидания;
? адресное пространство памяти программ, отображение которого зависит от состояния вывода управления картой памяти ММАР микросхемы. При ММАР = 0 в процессе начальной загрузки внутренней памяти программ внутренняя память (например, 2K слов) располагается по младшим адресам, а внешняя (14K слов) — по старшим; при ММАР = 1 — наоборот;
? адресное пространство регистров процессора;
? адресное пространство загрузочной памяти. Способы адресации и их реализация. В описании каждой команды должны быть указаны адреса места расположения исходных операндов (источников), задействованных при выполнении операции, и адрес места расположения операнда результата операции (приемника). В командах пересылки данных исходным операндом может служить константа. Для доступа к источникам/приемнику (к памяти) используются два основных способа адресации: непосредственная адресация и косвенная адресация. При непосредственной адресации в ассемблерной команде адрес может быть представлен кодом, меткой (для памяти данных и памяти программ) или мнемоникой (для перечисленных выше регистров основных устройств процессора).
Косвенная адресация используется, когда источником/приемником является память данных или память программ. Для описания адреса команды служит мнемоника индексного регистра I генераторов адресов данных. Если источником/приемником являются:
? память данных DM, к которой отнесены также перечисленные выше регистры периферийных устройств кристалла, то используются оба способа адресации;
? память программ РМ, то используется косвенный способ адресации;
? регистры основных устройств процессора, то используется непосредственный способ адресации. Примеры. 1. Загрузка регистров. MX0 = 1234; {в MX0 загружается код 0001 0010 0011 0100} IМАSK = 0хРР; {в IMASK загружается код 1111 1111}
- Очистка регистра
- Непосредстванная адресация.
- Косвенная адресация.
- Адресация кольцевых массивов.
- Косвенная линейная адресация.
- Команды ALU.
- Команды МАС
- Команды SHIFTER.
- Команды пересылки данных.
- Команды управления.
- Команды JUMP, CALL.
- Команда IDLE.
- Команда DOUNTIL.
- Команды чтения памяти данных и памяти программ.
- Команды вычислений с чтением из памяти.
- Команды вычислений с записью в память.
- Команды вычислений с пересылкой регистр–регистр
- Команды вычислений ALU/MAC с одновременным чтением памяти данных и памяти команд.
Очистка регистра
DWAIT, расположенного во внутренней памяти данных DM по адресу 0х3FFЕ. Так как отсутствует команда для записи константы по непосредственному адресу, для реализации этой операции необходимо использовать дополнительный регистр. АХ0 = 0; {загрузка 0 в АХ0} DM(0хЗFFЕ) = АХ0; {загрузка содержимого АХ0 в DWAIT} Особенности адресации массивов. Для объявления массивов пользуются ассемблерными директивами. Доступ к ним обеспечивается с помощью непосредственной или косвенной (кольцевой либо линейной) адресации. При непосредственной адресации в качестве адреса может служить метка, при косвенной адресации — указатель, расположенный в индексном регистре I генераторов адресов данных.
Примеры. 1. Для объявления массива mу_аггау из 128 16–битных элементов, расположенных в памяти данных, используется следующая директива: .VAR/DMmy_array; Массив или буфер данных длиной в одно слово является простой переменной и объявляется директивой .VAR/DMmy_param;
Непосредстванная адресация.
Загрузку одного элемента массива или переменной в регистр MX0 из памяти данных можно выполнить с помощью команды, в которой имя массива используется как метка: MX0 = DM(my_array);
Косвенная адресация.
Загрузка первого элемента массива my_array в регистр MX0 из памяти данных выполняется с помощью двух команд: I0 = ^ my_array; {указатель адреса первого элемента} MX0 = DM(I0,М0); {загрузка элемента массива в MX0}, где специальный оператор обозначает адрес. При использовании второй команды в цикле автоматической модификации адресов с помощью регистра М можно поочередно адресоваться к другим элементам массива.
Адресация кольцевых массивов.
Организация данных в кольцевые массивы достигается использованием генераторов адресов данных. Пример. Рассмотрим последовательность команд, обеспечивающих загрузку элемента массива в регистр MX0. Для объявления кольцевого буфера my_array используется директива, позволяющая компоновщику разместить массив по допустимому (базовому) адресу: .VAR/DM/CIRC my_array; Инициализация регистров L0, I0, М0 генератора адресов данных выполняется с помощью следующих команд: L0 = % my_array; {длина кольцевого буфера} I0 = ^ my_array; {указатель базового адреса буфера} М0 = 1; {значение инкрементора =1}
Использование оператора % позволяет автоматически задать длину буфера, которая указана в директиве .VAR и в данном случае равна 128.
Отметим, что после сброса регистры L0, I0, М0 содержат случайные значения. Выполняемая в цикле команда MX0 = DM(I0,М0); {загрузка MX0 из буфера} позволяет поочередно выбирать элементы массива.
Косвенная линейная адресация.
Это частный случай рассмотренной выше кольцевой адресации при L = 0. Общие сведения о системе команд. Система команд процессоров семейства ADSP–21ХХ позволяет выполнить большое число различных арифметических, логических и сдвиговых операций, операций пересылки данных, операций по управлению исполнением программы, а также различные комбинации указанных операций.
Аппаратные средства и 24–разрядное кодирование команд обеспечивают внутренний параллелизм выполняемых операций. Поэтому все команды системы, не требующие при доступе к памяти циклов ожидания, выполняются за один процессорный цикл.
Ассемблер процессоров семейства ADSP–21ХХ использует алгебраическую нотацию для записи многих команд, что облегчает чтение программы. Однако это не отражается на производительности, так как обеспечивается трансляция каждого оператора ассемблерной программы в 24–разрядную машинную команду. Все ассемблерные команды заканчиваются точкой с запятой. Отдельные части многофункциональных команд разделяются запятой. Комментарии помещаются в фигурные скобки {…}.
Для удобства изучения команды разбиты на шесть групп по функциональному признаку. В табл. 8.4.3 приведено назначение символов, используемых при описании команд. В графе «Группа» указаны номера групп команд, в которых используется данный символ. В табл. 8.4.4 приведены статусные условия cond и условия завершения циклов term. Рассмотрим команды отдельных групп.
Команды ALU.
Перечень команд, выполняемых АЛУ приведен в табл. 8.4.5. Условная часть команды [IF cond] является необязательной. Список возможных условий cono, а также регистров xop и yop, в которых могут размещаться Х– и Y–операнды, приведен в примечаниях. В графах «Флаги» знаки + или — означают, что команда влияет или не влияет на состояние флага, а число 0 свидетельствуетоб очистке флага после выполненной операции.
Примеры. Команда AR = AX0+AY0+C инициирует АЛУ на выполнение операции сложения содержимого регистров АХ0, AY0 со значением входного флага переноса CI. Результат помещается в регистр результата AR. Условная команда IF АС AR = AX0+AY0+C (в отличие от приведенной выше) выполняется, если предыдущая команда установила флаг переноса АС = 1. В противном случае будет выполнена пустая операция NOP, а затем следующая команда.
Команды МАС
Отличительной особенностью ряда команд этой группы (табл. 8.4.6) является то, что в их описании присутствует модификатор, который сообщает процессору о знаках операндов Х0, Y0 (UU — оба операнда беззнаковые; SS — оба операнда знаковые; US — первый операнд знаковый, второй — беззнаковый; SU — первый операнд беззнаковый, второй — знаковый) или о необходимости округления результата (RND). Пример. IF NOT MV MR = MR+MX0*MY0 (UU); С помощью условного выражения IF NOT MV проверяется состояние флага переполнения MV. При установленном флаге MV = 1 условие не выполняется, поэтому исполняется пустая команда NOP. При MV = 0 выполняется операция сложения текущего содержимого регистра результата MR с произведением беззнаковых (UU) операндов MX0 и VY0. Полученная сумма помещается в регистр MR.
Команды SHIFTER.
Все команды этой группы за исключением одной (табл. 8.4.7) снабжены модификатором. При использовании модификатора SR OR выполняется логическая операция ИЛИ результата с текущим содержимым регистра SR.
В противном случае результат сразу записывается в регистр результата SR. Приемником для экспоненциальных операций (EXP, EXPANDJ) служат регистры экспоненты SE или блока SB, для остальных операций — регистр результата SR.
IF NOT СЕ SR = SR OR NORM SI (HI); С помощью выражения IF NOT СЕ проверяется условие «если счетчик числа повторений циклов ненулевой». При пустом счетчике выполняется операция NOP. Если содержимое счетчика отличается от нуля, выполняются:
? сначала операция нормализации над операндом, хранящимся в регистре SI. Модификатор HI свидетельствует о том, что сдвиги осуществляются относительно старшей части регистра SR;
? затем логическая операция ИЛИ над результатом и текущим содержимым регистра SR;
? полученный результат помещается в регистр SR.
Команды пересылки данных.
Большинство операций пересылки (табл. 8.4.8) по сути дела являются операциями чтения/записи регистров и памяти. Все регистры процессора разбиты на две группы. Запись reg, dreg в правой части описания команды означает содержимое регистра, в левой части — непосредственно регистр или приемник операнда.
Команды управления.
Список команд приведен в табл. 8.4.9. Выполнение циклов DO UNTIL и стековых операций влияет на состояние флагов регистра статуса SSTAT (табл. 8.4.10).
Команды JUMP, CALL.
В этих командах адрес перехода или вызываемой подпрограммы указывается в самой команде:
? непосредственно, например, в виде метки: JUMP fir_start. По умолчанию областью видимости метки является модуль, в котором она объявлена. Использование директивы ассемблера .ENTRY позволяет получить доступ к метке данного модуля для внешних по отношению к этому модулю команд, а директивы .EXTERNAL — к метке, объявленной в другом модуле, для команды текущего модуля;
? косвенно — с помощью индексного регистра I генератора адресов команд DAG2: JUMP (I5). При выполнении команды CALL адрес извлекается и в следующем цикле помещается в программный счетчик PC, а текущее значение счетчика после инкрементации — в стек PC. При возврате из подпрограммы стек PC выгружается, восстанавливая значение адреса следующей за CALL команды для продолжения основной программы. В условных командах JUMP, CALL переход и вызов подпрограммы осуществляется при выполнении условия.
Только эти две команды допускают условные выражения IF FLAG_IN и IF NOT FLAG_IN с использованием значений флага FI при непосредственной адресации. Команды RTS, RTI. Эти команды обеспечивают безусловный или условный возврат из подпрограммы или процедуры обработки прерывания.
Команда IDLE.
Эта команда переводит процессор в режим ожидания прерывания с пониженным потреблением энергии от источника питания. После обслуживания прерывания начинает выполняться команда, следующая за IDLE.
Команда DOUNTIL.
Эта команда обеспечивает выполнение циклов без тактов ожидания. 6. Многофункциональные команды. Представленные в табл. 8.4.11 команды выполняют в течение процессорного цикла несколько операций.
Команды чтения памяти данных и памяти программ.
Эти команды позволяют за один цикл загрузить входные регистры ALU и MAC. При этом Х–операнд должен загружаться из памяти данных, а Y–операнд — из памяти программ. Используется косвенная адресация: для адресации Х–операндов задействована любая пара регистров I0–I3 и М0–М3 генератора адресов данных DAG1; для адресации Y–операндов — любая пара регистров I4–I7 и М4–М7 генератора адресов данных DAG2. Пример. MX0 = DM(I0,M0), MY0 = PM(I4,M5); Запись MX0 = DM(I0,M0) отражает загрузку Х–операнда в регистр MX0 умножителя/аккумулятора из памяти данных.
Адрес операнда находится в индексном регистре I0. После загрузки операнда формируется адрес следующего Х–операнда путем прибавления знакового содержимого регистра модификации М0 к содержимому I0.
Запись MY0 = PM(I4,M5) отражает загрузку Y–операнда в регистр MY0 из памяти программ, протекающую аналогично загрузке Х–операнда.
Команды вычислений с чтением из памяти.
При выборке одного (вместо двух) операнда из памяти данных или памяти программ возможны:
? все операции (кроме деления) ALU;
? все операции MAC;
? все операции (кроме немедленного сдвига) SHIFTER. Команды должны быть безусловными. Пример. AR = AX0+AY0, AX0 = DM(I0,M3); В начале процессорного цикла под действием части команды AR = AX0+AY0 в ALU выполняется сложение Х– и Y–операндов, а в конце цикла под действием AX0 = DM(I0,M3) — загрузка регистра АХ0 новым Х–операндом. При этом Y–операнд должен быть предварительно загружен в регистр AY0 другой командой. Сумма помещается в регистр результата AR.
Команды вычислений с записью в память.
Эти команды по ограничениям аналогичны предыдущим, однако при их исполнении сначала происходит запись, а затем вычисления, что отражено в описании команд. Пример. DM(I0,M3)=AR,AR=AX0+AY0; В начале процессорного цикла происходит запись содержимого регистра результатов AR в память данных, в конце — сложение операндов. В команде вместо AR можно использовать другой регистр.
Команды вычислений с пересылкой регистр–регистр
Выполнение операций в ALU, MAC или SHIFTER сопровождается пересылкой данных из одного регистра в другой. Перечисленные выше (для команд вычислений с чтением из памяти) ограничения остаются справедливыми и в этом случае.
Пример. AR = AX0+AY0, AX0 = MR2; Выполняется сложение двух операндов в ALU и загрузка нового операнда во входной регистр АХ0 из регистра результата MR2 умножителя–аккумулятора.
При сложении используется содержимое АХО в начале процессорного цикла. Обновление содержимого АХ0 происходит в конце цикла. Источником и приемником при пересылке могут быть любые регистры ALU, MAC и SHIFTER за исключением регистров обратной связи AF, MF и блока SB.
Команды вычислений ALU/MAC с одновременным чтением памяти данных и памяти команд.
Вычислительной частью этой многофункциональной команды может быть любая безусловная команда ALU или любая (кроме насыщения) команда MAC. Кроме того, следующие для вычислений Х– и Y–операнды должны загружаться соответственно в MX0 из памяти данных и в MY0 из памяти программ (безразлично из внутренней или внешней); результат вычислений должен помещаться только в регистры результата AR или MR.
Пример. Рассмотрим одну из часто встречающихся операций при цифровой обработке сигналов — сложение произведений или умножение с накоплением, выполняемое за один процессорный цикл в умножителе/аккумуляторе.
При ее выполнении происходят следующие действия:
? входные регистры (например, MX0 и MY0) загружаются двумя операндами;
? операнды перемножаются и полученное произведение складывается с предыдущей суммой произведений, хранящейся в регистре MR. Итоговый результат снова помещается в регистр MR. Описание команды: MK = MR+MX0*МY0 (SS), MX0 = DM(I0,М0), МY0 = РМ(I4,М5); Запись MX0 = DM(I0,М0) отражает загрузку Х–операнда в регистр MX0 из памяти данных, а запись МY0 = РМ(I4,М5) — загрузку Y–операнда в регистр МY0 из памяти программ.
Вычислительная часть команды MR = MK+MX0*МY0 (SS) инициирует суммирование предыдущего содержимого регистра MR с произведением двух операндов с учетом знака.
В начале происходит умножение операндов, затем произведение добавляется к содержимому регистра MR. В начале процессорного цикла происходит перемножение операндов, находящихся в MX0, МY0 и добавление произведения к содержимому MR. После этого в конце процессорного цикла в MX0, МY0 загружаются новые операнды, которые будут доступны для вычислений в следующем цикле.