Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KOMAROV.DOC
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.32 Mб
Скачать

1.11. Передача данных

Передачей данных в/из процессора управляют генераторы адресов DAG1, DAG2 (см. п. 1.2). Передачей данных с одной магистрали на другую (PMD – DMD) управляет узел обмена данными BUS EXCH (см. п. 1.2).

1.11.1. Генераторы адресов

DAG1 и DAG2 работают независимо, поэтому возможен одновременный доступ как к ПД, так и к ПП. Адресные генераторы обеспечивают косвенную адресацию данных, оба выполняют адресную модификацию (пост-инкрементную или пост-декрементную), оба поддерживают кольцевые буферы. Но DAG1 генерирует адреса только для ПД, зато может производить реверс бит адреса (см. п. 1.10). DAG2 генерирует адреса и для ПД, и для ПП, но не может производить реверс бит адреса .

Каждый генератор содержит по четыре 14-битных регистра следующих типов: модификации (М), индексный (I) и длины (L). Каждый из этих регистров может быть прочитан и записан через DMD шину.

Индексные регистры (I0-I3 в DAG1, I4-I7 в DAG2) содержат адреса для доступа к памяти. При использовании косвенной адресации эти адреса выдаются на адресные шины процессора (DMA и/или РМА). После осуществления косвенной пересылки данных индексные регистры подвергаются пост-модификации с помощью регистров модификации.

Это означает, что к содержимому, выбранного в команде индексному регистру, после ее выполнения прибавляется содержимое, выбранного регистра модификации. Для модификации регистров I0-I3 может быть использован любой из регистров М0-М3, а для модификации регистров I4-I7 – любой из регистров М4-М7. Нельзя только смешивать индексные и модификационные регистры DAG1 и DAG2. Для примера запишем команду пересылки данных из ПД в регистр АХ0: АХ0 = DM(I0, M3). Адресом операнда является содержимое индексного регистра I0 до пересылки. После пересылки к содержимому I0 прибавляется содержимое М3.

В регистрах модификации хранятся числа со знаком, поэтому может быть осуществлена как пост-инкрементная адресация, так и пост-дек­ре­мен­тная адресация.

В зависимости от содержимого регистров длины буфера (L0-L3 в DAG1 и L4-L7 в DAG2) адресные генераторы поддерживают как линейную адресацию, так и кольцевую адресацию. Если какой-либо регистр длины содержит нуль, то соответствующий ему индексный регистр обеспечивает линейную адресацию. В противном случае (регистр длины содержит ненулевое значение) поддерживается кольцевая адресация.

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

После сброса процессора содержимое всех регистров DAG1 и DAG2 не определено, поэтому перед использованием косвенной адресации они должны быть программно инициализированы, например, следующим образом:

I3 = 0x3800; {инициализация индексного регистра}

M2 = 0; {модификация отсутствует}

L3 = 0; {объявлен линейный буфер}

{содержимое ячейки памяти 0х3800 пересылается в регистр АХ0}

AX0 = DM(I3, M2);

Средства разработки программного обеспечения процессора ADSP-2181 [2] поддерживают работу с отдельными переменными и массивами переменных как линейными, так и кольцевыми. Так массив объявляется следующей директивой:

.VAR/DM coefficients[128];

В памяти данных (DM) объявлен массив из 128 16-битных слов с именем coefficients. Специальные операторы ^ и % возвращают начальный адрес и длину массива соответственно. Ниже представлен пример их использования:

I0 = ^ coefficients; {инициализация указателя на начало массива}

L0 = 0; {объявлен линейный буфер}

MX0 = DM(I0, M0); {загрузка регистра МХ0 из буфера}

В примере в регистр МХ0 загружается первый элемент буфера coefficients, который располагается в ПД. Если бы было необходимо сделать только это, то достаточно было записать MX0 = DM(coefficients);. Но, если необходимо пересылать в цикле значения всех элементов буфера, то необходимо инициализировать регистр М0 и вставить третий оператор примера в тело соответствующего цикла.

Объявление простой переменной является частным случаем объявления массива:

.VAR/DM coefficient;

Для работы с кольцевым буфером должны быть сделаны некоторые шаги. Во-первых, буфер должен быть объявлен с зарезервированным словом CIRC:

.VAR/DM/CIRC coefficient[128];

Во-вторых, должны быть проинциализированы соответствующие регистры - индексный, длины и модификации:

I0 = ^ coefficients; {инициализация указателя на начало массива}

L0 = %coefficients; {объявлен кольцевой буфер}

М0 = 1; {инкремент на один адрес после пересылки}

В-третьих, в тело цикла должен быть вставлен оператор:

MX0 = DM(I0, M0); {загрузка регистра МХ0 из буфера}

В результате после каждого очередного выполнения этого оператора содержимое регистра I0 будет указывать на следующий элемент буфера coefficients. После считывания последнего элемента содержимое регистра I0 будет указывать на первый элемент буфера coefficients.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]