Генераторы адреса данных

В процессорах семейства ADSP-21000 существует 2 независимых генератора адресов данных для того, чтобы одновременно иметь доступ к памяти данных и памяти программы:

- DAG1 – генерирует 32-битные адреса, которые используются для доступа к памяти данных;

- DAG2 – генерирует 24-битные адреса, которые используются для доступа к памяти программ.

Каждый из адресных генераторов DAG содержит регистровый файл, включающий в себя восемь наборов регистров. Генератор DAG1 содержит с 0‑го по 7-й наборы, а DAG2 - с 8-го по 15-й. Каждый набор состоит из следующих регистров:

- базовые регистры (В – регистры), определяющие базовый адрес буфера данных;

- регистры длины буфера данных в словах (L – регистры);

- регистры текущего адреса (I – регистры);

- регистры модификации текущего адреса (М – регистры).

Модификация регистров текущего адреса возможна в двух вариантах: постмодификация и предмодификация. В первом случае значение в I-регистре изменяется после обращения к памяти. Во втором – на шину адреса выставляется модифицированное значение, но само значение в I-регистре не изменяется! Любой I-регистр может быть модифицирован константой или любым М-регистром, но только из того же DAG;

Например:

Пример команды Значение, выставляемое на шину адреса Значение I-регистра после выполнения команды
R6 = DM(I4,M2) I4 I4+M2
R2 = DM(I4, 0х0200) I4 I4+0x0200
R6 = DM(M2, I4) I4+M2 I4
R6 = DM(0х0200, I4) I4+0x0200 I4

В некоторых задачах (например, фильтрации) требуется повторное продвижение указателя в область памяти. Для этого в ADSP-21000, используется круговой буфер, по которому индексный указатель перемещается с применением постмодификации. Если модифицированный указатель выходит за пределы буфера, то длина буфера вычитается (при значении M-регистра меньше 0 – прибавляется) из полученного значения чтобы вернуть указатель к началу буфера.

Примечание. При инициализации значений I- и В-регистров одинаковыми значениями, сначала нужно инициализировать значение В-регистра, т.к. при записи значения в регистр Bx в регистр Ix с тем же номером заносится то же значение.

Например:

B1 = in_buffer;! в I-регистр автоматически

! заносится адрес in_buffer

L1 = @in_buffer;! задать размер кругового буфера

M1 = 1;! задать смещение текущего адреса

! после каждого шага


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: