Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Руководство пользователя по сигнальным процессорам Sharc

.pdf
Скачиваний:
128
Добавлен:
01.05.2014
Размер:
9.49 Mб
Скачать

Передача данных 4

Рис. 4.2. Дополнительные регистры генераторов адреса данных

Несколько бит управления в регистре MODE1 определяют, какие регистры (первичные или дополнительные) активны (0=первичные регистры, 1=дополнительные):

Бит MODE1

Имя

Определение

3

SRD1H

Выбор дополнительных регистров DAG1 (4 7)

4

SRD1L

Выбор дополнительных регистров DAG1 (0 3)

5

SRD2H

Выбор дополнительных регистров DAG2 (12 15)

6

SRD2L

Выбор дополнительных регистров DAG2 (8 11)

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

111

4 Передача данных

4.3. Работа DAG

DAG выполняет следующие операции:

вывод адреса с пред и постмодификацией,

адресация по модулю (для циклических буферов),

битреверсная адресация.

Короткое слово адреса (для 16 разрядных данных) перед выводом на шину адреса DM сдвигается вправо на один бит. Это дает возможность реализовывать прямую адресацию внутренней памяти (подробнее см. «Короткие 16 разрядные слова» в главе Память этого руководства).

4.3.1. Вывод и модификация адреса

При выводе адреса процессор может добавить модификатор (либо содержимое регистра М, либо непосредственное число) к содержимому регистра I и вывести результирующий адрес; это операция называется предмодификация без обновления. Возможен и другой вариант: выводится значение, которое содержится в регистре I, а затем добавляется содержимое регистра М или непосредственное число, таким образом, формируется новое значение регистра I. Это операция постмодификации. На рис. 4.3 приводится сравнение этих операций. Операция предмодификации не изменяет содержимое регистра индекса. Число разрядов непосредственного модификатора зависит от команды; оно может быть равно числу разрядов регистра индекса. Регистр длины и логическое устройство адресации по модулю не используют предмодифицированные адреса – такая адресация всегда линейная, не циклическая.

Рис. 4.3. Операции предмодификации и постмодификации

112

Передача данных 4

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

4.3.1.1. Команды модификации генератора адреса данных

В ассемблере ADSP 2106х операции пред и постмодификации отличаются положением индекса и модификатора в команде. Если регистр I стоит в команде перед модификатором, то это соответствует постмодификации. Если модификатор стоит впереди, то это предмодификация без обновления. Например, в следующей команде выполняется обращение к памяти программы по адресу, который хранится в I15, и возвращается обратно в регистр I15 значение, равное I15+М12:

R6 = PM(I15,M12); Косвенная адресация с постмодификацией

Если порядок следования регистров в команде обратный, тогда:

R6 = PM(M12,I15); Косвенная адресация с предмодификацией

В команде выполняется обращение к памяти программы по адресу, равному I15+M12, причем содержимое регистра индекса I15 не изменяется.

Любой регистр I может модифицироваться содержимым любого регистра М в одном и том же генераторе (DAG1 или DAG2). Таким образом,

DM(M0,I12) = TPERIOD;

является допустимой командой обращения к памяти данных по адресу М0+I12, однако,

DM(M0,I14) = TRERIOD;

недопустимая команда, потому что регистры I и М принадлежат различным генераторам.

4.3.1.2. Непосредственные модификаторы

Величина непосредственного числа, которое может изменять содержимое регистра I, зависит от типа команды и от того, где находится регистр I – в DAG1 или в DAG2. Модификаторы DAG1 могут быть разрядностью до 32 бит, модификаторы DAG2 – разрядностью до 24 бит. Некоторые команды с параллельными операциями ограничивают разрядность модифицирующего значения 6 битами. Рассмотрим два примера:

113

4 Передача данных

32 разрядный модификатор:

 

R1=DM(0x40000000,I1);

адрес памяти данных =I1+0х40000000

6 разрядный модификатор:

 

F6=F1+F2, PM(I8,0x0B)=ASTAT;

адрес памяти программы = I8,

 

I8=I8+0х

4.3.2. Адресация с использованием циклического буфера

Генераторы адреса данных выполняют адресацию внутри циклического буфера данных. Циклический буфер – набор ячеек памяти, в которых хранятся данные. Перемещение указателя индекса в буфере осуществляется с помощью операции постмодификации с обновлением, на каждом шаге добавляется заданное число (положительное или отрицательное) к значению указателя индекса. Если значение модифицированного указателя буфера выходит за пределы буфера, значение длины буфера вычитается или прибавляется к значению указателя, чтобы он вернулся к началу буфера (см. рис. 4.4). Не существует ограничений на значение базового адреса циклического буфера.

При адресации циклического буфера регистры М и I должны использоваться в операциях постмодификации (но не предмодификации), например:

F1=DM(I0,M0); операция постмодификации адреса для циклического буфера, F1=DM(M0,I0); операция предмодификации.

Рис. 4.4. Циклические буферы данных

114

Передача данных 4

4.3.2.1. Работа циклического буфера

Организация циклического буфера осуществляется путем инициализации регистра длины L положительным, отличным от нуля значением и загрузки соответствующего (имеющего тот же номер) регистра В базовым (начальным) адресом буфера. Соответствующий регистр индекса I автоматически загружается этим же начальным адресом.

При осуществлении первого обращения с постмодификацией с использованием регистра I, DAG выводит значение регистра I на шину адреса и затем модифицирует его, добавляя содержимое определенного регистра М или непосредственное значение. Если измененное значение попадает в диапазон адресов буфера, то оно записывается обратно в регистр I. Если значение выходит за диапазон адресов буфера, то сначала из этого значения вычитается значение регистра L (или, если модификатор отрицательный, прибавляется).

Если М положительное,

Iновое= Iстарое + М Если Iстарое+ М < (Базовый адрес буфера + длина) (конец буфера)

Iновое= Iстарое + М L Если Iстарое+ М і (Базовый адрес буфера + длина) (конец буфера)

Если М отрицательное,

Iновое= Iстарое + М Если Iстарое+ М і Базовый адрес буфера (начало буфера)

Iновое= Iстарое + М + L Если Iстарое+ М < Базовый адрес буфера (начало буфера)

4.3.2.2. Регистры циклического буфера

Все четыре типа регистров DAG участвуют в работе циклического буфера:

Регистр индекса I содержит значение, которое выводится на шину адреса.

Регистр модификации М содержит значение постмодификации (положительное или отрицательное), которое добавляется к содержимому регистра I в конце каждой операции обращения в память. Этим регистром может быть любой регистр М в одном и том же DAG, что и регистр I, но необязательно с тем же номером, что регистр I. Вместо регистра М значение модификации можно задать непосредственным числом. Независимо от способа определения величина модификации должна быть меньше, чем длина циклического буфера, определяемая регистром L.

Регистр длины L устанавливает размер циклического буфера и, таким образом, диапазон адресов, значения которых может принимать регистр индекса. Значение в L должно быть положительным и не превышать 231 1 (для LO L7) или 223 1 (для L8 L15). Если значение L равно нулю, работа этого циклического буфера блокируется.

115

4 Передача данных

Содержимое регистра L (или В+L) после каждого обращения сравнивается с модифицированным значением I. При выполнении загрузки регистра В то же самое число одновременно загружается в регистр индекса I. При загрузке регистра I содержимое регистра В не изменяется. В и I могут считываться независимо.

4.3.2.3. Прерывание при переполнении циклического буфера

В каждом генераторе адреса данных есть один набор регистров, который может использоваться для генерации прерывания при переполнении циклического буфера (т. е. циклического перехода адреса). В DAG1 это регистры В7, I7, L7, в DAG2 – B15, I15, L15. Например, прерывание переполнения циклического буфера может использоваться в программе для работы с буферами (двумя) с попеременным переключением (т. е. для изменения указателей буфера устройства ввода вывода).

Прерывание генерируется всякий раз, когда операция адресации циклического буфера, использующая эти регистры, приводит к тому, что адрес в регистре I, который увеличивается (или уменьшается), достигает конца (или начала) циклического буфера. В зависимости от того, какой набор регистров используется, существуют следующие прерывания:

 

Используемые

 

 

Прерывание

регистры DAG

Адрес вектора

Имя*

переполнение циклического буфера 7 DAG1

B7, I7, L7

0x54

CB7I

переполнение циклического буфера 15 DAG2

B15, I15, L15

0x58

CB15I

* Эти символы определены в заголовочном файле def21060.h. См. «Файл определений символов (def21060.h)» в конце приложения Е Регистры управления/состояния.

Прерывание генерируется при постмодификации адреса при следующих условиях:

(для М<0)

I+M < B

(для М0)

I+M ≥ B+L

Эти прерывания можно маскировать, если обнулить соответствующий бит в IMASK.

Могут возникнуть ситуации, когда вам нужно использовать I7 или I15 без организации циклического буфера и без маскирования прерываний переполнения циклического буфера. Для того чтобы отключить генерацию этих прерываний, установите такие значения регистров В7/B15 и L7/L15, которые гарантируют, что условия генерации прерывания, которые определены выше, никогда не выполнятся. Например, при обращении к диапазону памяти 0х1000

116

Передача данных 4

0х2000 в вашей программе можно установить В=0х0000 и L=0хFFFF. Заметим, что установка значения регистра длины равным нулю не дает желаемых результатов.

Если вы используете любые прерывания переполнения циклического буфера, то вы должны избегать использования соответствующих регистров (I15,I7) в остальной части вашей программы или будьте внимательны при инициализации регистров В и L, следуя написанному выше с целью предотвращения неправильной обработки прерываний.

Регистр состояния STKY содержит два бита, которые также указывают на возникновение прерывания при переполнении циклического буфера: бит 17 соответствует переполнению циклического буфера 7 DAG1, бит 18 соответствует переполнению циклического буфера 15 DAG2. Эти биты «залипшие» – они будут оставаться установленными до тех пор, пока их явно не обнулить.

4.3.3. Битреверсная адресация

Битреверсная адресация памяти может выполняться двумя способами: разрешением режима перестановки бит в обратном порядке (битреверсии) в DAG1 или DAG2 с использованием специальных регистров I (I0 или I8) или с помощью явной команды битреверсии (BITREV).

4.3.3.1. Режим битреверсии

В режиме битреверсной адресации DAG1 переставляет биты в обратном порядке в 32 разрядном значении адреса в I0, DAG2 – в 24 разрядном значении адреса в I8. Этот режим разрешается и блокируется битами BR0 и BR8 в регистре MODE1. Переставляться могут только биты значений адресов в I0 и I8. Этот режим работает и при операции предмодификации, и при постмодификации.

Бит MODE1

Имя

Определение

0

BR8

Режим битреверсии для I8 (DAG2)

1

BR0

Режим битреверсии для I0 (DAG1)

Перестановка бит происходит на выходе генератора адреса данных и не влияет на содержимое I8 и I0. В случае постмодификации биты обновленного значения не переставляются.

Пример:

 

I0=0x80400000;

 

R1=DM(I0,3);

Адрес памяти данных = 0х201, I0 = 0х80400003

117

4 Передача данных

4.3.3.2 Команда битреверсии

При выполнении команды BITREV изменяются и переставляются биты адреса в любом регистре индекса (I0 I15) без фактического обращения в память. Эта команда не зависит от режима битреверсии. По команде BITREV 32 разрядное значение добавляется к содержимому регистра индекса DAG1 (или 24 разрядное значение к содержимому регистра индекса DAG2), переставляются биты результата в обратном порядке, и полученный результат записывается в тот же самый регистр индекса.

Пример:

BITREV(I1,4); I1= Битреверсия (I1+4)

4.4. Передача данных с использованием регистров генератора адреса данных

Регистры DAG – это часть набора универсальных регистров; в них можно записывать данные из памяти, из другого универсального регистра или непосредственно из поля команды. Содержимое регистра DAG может быть записано в память или в универсальный регистр.

Рис. 4.5. Передача данных с использованием регистров генератора адреса данных

118

Передача данных 4

Данные, передаваемые между 32 разрядными регистрами DAG1 и 40 разрядной шиной данных памяти данных, выравниваются к битам 39 8 шины. Когда содержимое 24 разрядных регистров DAG2 считывается по 40 разрядной шине данных памяти данных, содержимое регистра М дополняется по знаку до 32 бит, а значения регистров I, L и В дополняются нулями до 32 бит. Результаты выравниваются к битам 39 8 шины данных памяти данных. Когда регистры DAG2 записываются с шины данных памяти данных, перемещаются биты 31 8, а остаток игнорируется. Эти передачи иллюстрируются на рис. 4.5.

4.4.1. Ограничения на передачу данных с использованием регистров DAG

При выполнении некоторых последовательностей команд, включающих передачу данных в DAG или из него, процессор автоматически вставляет дополнительный цикл (NOP) (1). Ассемблер семейства ADSP 21000 не допускает некоторые последовательности команд, которые приводят к неправильному результату (2).

1)ADSP 2106х вставляет дополнительный цикл (NOP) между двумя командами, когда за командой, загружающей регистр DAG, следует другая, которая использует регистр в том же DAG для адресации данных, команд модификации или косвенных переходов. Это происходит из за того, что для выполнения обеих операций требуется одна и та же шина, следовательно, выполнение второй операции должно быть задержано.

Пример:

L2=8;

DM(I0,M1)=R1;

Из за того что L2 находится в том же генераторе, что и I0 (и M1), дополнительный цикл вставляется после записи в L2.

2)Команды следующих типов могут выполняться процессором, но приводят к неправильному результату, поэтому эти команды запрещаются ассемблером семейства ADSP 2106х:

Команда, которая сохраняет содержимое регистра DAG в памяти, используя косвенную адресацию того же генератора, с обновлением регистра индекса или без обновления.

Пример:

DM(M2,I1) = I0; или DM(I1,M2)=I0;

119

4 Передача данных

Команда, которая загружает регистр DAG из памяти, используя косвенную адресацию того же генератора с обновлением регистра индекса. Команда или загрузит регистр генератора, или обновит регистр индекса, но не выполнит обе операции.

Пример:

L2=DM(I1,M0);

120