Структурнофункциональная организация процессоровПрограммно доступные регистры. Приведенные в статьях данного раздела сведения о структурных и функциональных особенностях цифровых сигнальных процессоров рассматриваемого семейства являются полезными для программистов. Однако для разработки программного обеспечения проектируемых микропроцессорных устройств их недостаточно и необходимо располагать дополнительными сведе­ниями о тех ресурсах процессора, которые относятся непосредственно к про­граммированию процессоров и составляют их программную модель. Под про­граммной моделью процессора будем понимать совокупность всех его ресурсов, которыми программист может распоряжаться при разработке программ. К таким ресурсам, прежде всего, относятся набор программно доступных регистров и (или) ячеек памяти, адресные пространства и возможные способы адресации, полный набор команд.

С тонки зрения программиста процессор может быть представлен как набор блоков, правила функционирования которых задаются и поддерживаются про­граммно доступными регистрами. С помощью команд такие регистры позволяют принять, сохранить и выдать данные (регистры АХ0, АХ1, AY0, AY1, AR, AF, MX0, МХ1, MY0, MY1, MR, MF, SI, SR и др.) и адреса (например, индексные регистры I в генераторах адресов данных), выдать информацию о состоянии процессора (например, регистр арифметического статуса ASTAT и статусные регистры HSR6, HSR7 интерфейса HIP), задать тот или иной режим работы процессора (системный регистр, регистры управления портами SPORT0, SPORT1 и др.).

рис. 8.4.1

Назначение и основные функции всех программно доступных регистров про­цессоров семейства ADSP–21XX приведены в табл. 8.4.1. Регистры условно отне­сены к тем устройствам процессора, которые они «обслуживают». Для наглядности регистры изображены на рис. 8.4.1. Рядом с обозна­чением регистра указаны его адрес (если он расположен во внутренней памяти данных) и разрядность (если она отличается от 16).

табл. 8.4.1

табл. 8.4.1-продолжение

табл. 8.4.1-окончание

Средства памяти и адресные пространства. В процессорах семейства 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–разрядных слов.

рис. 8.4.2

Таким образом, для процессоров семейства ADSP–21ХХ можно выделить четы­ре адресных пространства:

●     адресное пространство памяти данных, карта которого приведена на рис. 8.4.2. Для большинства микросхем память на кристалле имеет размер до 1K 16–разрядных слов и начинается по адресу 0x3800. При этом внутренняя память с адресами 0х3С00...0х3FFF отведена под регистры. Внешняя память данных объемом 14K 16–разрядных слов разбита на пять областей DWAIT0–DWAIT4, для каждой из которых в регистре управле­ния циклами ожидания памяти данных DWAIТ (табл. 8.4.2) может быть закодировано число (от 0 до 7) циклов ожидания. Это позволяет организовать работу процессора с «быстрыми» и «медленными» внешними устройствами, выделяя для них различные области памяти с тем или иным числом циклов ожидания;

табл. 8.4.2

●     адресное пространство памяти программ, отображение которого зависит от состояния вывода управления картой памяти ММАР микросхемы. При ММАР = 0 в процессе на­чальной загрузки внутренней памяти программ внутренняя память (например, 2K слов) распо­лагается по младшим адресам, а внешняя (14K слов) — по старшим; при ММАР = 1 — на­оборот;

●     адресное пространство регистров процессора;

●     адресное пространство загрузочной памяти.

Способы адресации и их реализация. В описании каждой команды должны быть указаны адреса места расположения исходных операндов (источников), за­действованных при выполнении операции, и адрес места расположения операнда результата операции (приемника). В командах пересылки данных исходным опе­рандом может служить константа. Для доступа к источникам/приемнику (к памя­ти) используются два основных способа адресации: непосредственная адресация и косвенная адресация.

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

Косвенная адресация используется, когда источником/приемником является память данных или память программ. Для описания адреса команды служит мне­моника индексного регистра I генераторов адресов данных.

Если источником/приемником являются:

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

●     память программ РМ, то используется косвенный способ адресации;

●     регистры основных устройств процессора, то используется непосредствен­ный способ адресации.

Примеры.

1. Загрузка регистров.

MX0 = 1234;                         {в MX0 загружается код 0001 0010 0011 0100}

IМАSK = 0хРР;                   {в IMASK загружается код 1111 1111}

2. Очистка регистра 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;

2. Непосредстванная адресация. Загрузку одного элемента массива или переменной в регистр MX0 из памяти данных можно выполнить с помощью команды, в которой имя мас­сива используется как метка:

MX0 = DM(my_array);

3. Косвенная адресация. Загрузка первого элемента массива 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.3 приведено назначение символов, используемых при опи­сании команд. В графе «Группа» указаны номера групп команд, в которых исполь­зуется данный символ.

В табл. 8.4.4 приведены статусные условия cond и условия завершения циклов term. Рассмотрим команды отдельных групп.

табл. 8.4.4

1. Команды ALU. Перечень команд, выполняемых АЛУ приведен в табл. 8.4.5.

Условная часть команды [IF cond] является необязательной. Список возможных условий cono, а также регистров xop и yop, в которых могут размещаться Х– и Y–операнды, приведен в примечаниях. В графах «Флаги» знаки + или — означают, что команда влияет или не влияет на состояние флага, а число 0 свидетельствует об очистке флага после выполненной операции.

табл. 8.4.5

Примеры.

Команда AR = AX0+AY0+C инициирует АЛУ на выполнение операции сложения содержи­мого регистров АХ0, AY0 со значением входного флага переноса CI. Результат помещается в регистр результата AR.

Условная команда IF АС AR = AX0+AY0+C (в отличие от приведенной выше) выполняется, если предыдущая команда установила флаг переноса АС = 1. В противном случае будет вы­полнена пустая операция NOP, а затем следующая команда.

2. Команды МАС. Отличительной особенностью ряда команд этой группы (табл. 8.4.6) является то, что в их описании присутствует модификатор, который сообщает процессору о знаках операндов Х0, Y0 (UU — оба операнда беззнако­вые; SS — оба операнда знаковые; US — первый операнд знаковый, второй — беззнаковый; SU — первый операнд беззнаковый, второй — знаковый) или о не­обходимости округления результата (RND).

табл. 8.4.6

Пример.

IF NOT MV MR = MR+MX0*MY0 (UU);

С помощью условного выражения IF NOT MV проверяется состояние флага переполне­ния MV. При установленном флаге MV = 1 условие не выполняется, поэтому исполняется пус­тая команда NOP. При MV = 0 выполняется операция сложения текущего содержимого ре­гистра результата MR с произведением беззнаковых (UU) операндов MX0 и VY0. Полученная сумма помещается в регистр MR.

табл. 8.4.7

3. Команды 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

4. Команды пересылки данных. Большинство операций пересылки (табл. 8.4.8) по сути дела являются операциями чтения/записи регистров и памяти. Все реги­стры процессора разбиты на две группы. Запись reg, dreg в правой части описа­ния команды означает содержимое регистра, в левой части — непосредственно регистр или приемник операнда.

табл. 8.4.9

5. Команды управления. Список команд приведен в табл. 8.4.9.

Выполнение циклов DO UNTIL и стековых операций влияет на состояние фла­гов регистра статуса SSTAT (табл. 8.4.10).

табл. 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 команды выполняют в течение процессорного цикла несколько операций.

табл. 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 загружаются новые операнды, которые будут доступны для вы­числений в следующем цикле.


Рекомендуйте эту статью другим!