В процессорах семейства 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;! задать смещение текущего адреса
! после каждого шага