Регистр или - book.isito.kg(0)

advertisement
А.В. КОМАРОВ
ЦИФРОВЫЕ СИГНАЛЬНЫЕ ПРОЦЕССОРЫ
ОБНИНСК 2003
Комаров А.В. Цифровые сигнальные процессоры. – Обнинск, 2003, 141 с.
Настоящее издание является учебным курсом для изучения архитектуры цифровых сигнальных процессоров (и систем на их основе) на примере процессора ADSP-2181. Пособие поддерживает курс Процессоры
цифровой обработки сигналов, который обычно читается студентам специальности 22.01 - Вычислительные машины, комплексы, системы и сети.
Пособие содержит две главы. В первой главе рассматриваются особенности структурной схемы ADSP-2181, его система команд, а также
примеры программирования. Во второй главе рассматриваются методы
создания микропроцессорной системы на основе ADSP-2181.
Настоящий конспект лекций может быть полезен не только для студентов специальности 22.01, но и для всех желающим познакомиться с
основами разработки аппаратных средств и программного обеспечения
цифровых сигнальных процессоров.
 А. Комаров, 2003 г.
СОДЕРЖАНИЕ
1. АРХИТЕКТУРА ADSP-2181………………………………………. 5
1.1. Описание выводов процессора…………………………………. 5
1.2. Структурная схема ADSP-2181………………………………… 7
1.3. Память программ………………………………………………... 11
1.4. Память данных…………………………………………………... 12
1.5. Функциональная схема ALU …………………………………… 13
1.6. Функциональная схема MAC…………………………………… 15
1.7. Функциональная схема SHIFTER………………………………. 17
1.8. Функциональная схема программного конвейера…………….. 22
1.9. Система прерываний…………………………………………….. 28
1.9.1. Общие сведения…………………………………………….. 28
1.9.2. Последовательность обслуживания прерываний………… 29
1.9.3. Конфигурирование прерываний…………………………… 29
1.10. Регистры состояния и стек…………………………………….. 31
1.11. Передача данных……………………………………………….. 34
1.11.1. Генераторы адресов……………………………………….. 35
1.11.2. Узел обмена данными…………………………………….. 36
1.12. Последовательные порты……………………………………… 37
1.12.1. Общие сведения…………………………………………… 37
1.12.2. Программирование SPORT……………………………….. 40
1.12.3. Пример конфигурирования последовательных портов… 43
1.12.4. Сжатие данных…………………………………………….. 44
1.12.5. Автобуферизация………………………………………….. 45
1.12.6. Пример программирования автобуферизации…………... 46
1.12.7. Многоканальность…………………………….…………... 47
1.13. Таймер…………………………………………………………... 48
1.14. Системный интерфейс…………………………………………. 50
1.14.1. Сигналы синхронизации………………………………….. 51
1.14.2. Внешние прерывания……………………………………... 53
1.14.3. Флажковые биты…………………………………………... 54
1.14.4. Режим энергосбережения…………………………………. 54
1.15. Контроллер прямого доступа к байтовой памяти (BDMA)…. 56
1.15.1. Общие сведения…………………………………………… 56
1.15.2. Регистры управления BDMA……………………………... 57
1.15.3. Функционирование BDMA……………………………….. 57
1.15.4. Загрузка программ с помощью BDMA…………………... 58
1.16. Порт IDMA……………………………………………………... 59
1.16.1. Сигналы IDMA…………………………………………….. 59
1.16.2. Функционирование IDMA………………………………... 60
1.16.3. Загрузка программ с помощью IDMA…………………… 60
1.17. Система команд………………………………………………… 61
1.17.1. Общие сведения…………………………………………… 61
1.17.2. Методы адресации……………………………………….... 62
1.17.3. Условные обозначения……………………………………. 63
1.17.4. Команды пересылки данных……………………………… 64
1.17.5. Команды ALU……………………………………………... 70
1.17.6. Команды MAC…………………………………………….. 79
1.17.7. Команды SHIFTER………………………………………... 82
1.17.8. Команды управления потоком программы……………… 88
1.17.9. Многофункциональные команды………………………… 92
1.17.10. Прочие команды…………………………………………. 98
1.18. Инструментальные средства разработки программного
обеспечения……………………………………………………. 101
1.18.1. Инструментальные средства для DOS…………………… 101
1.18.2. Инструментальные средства для WINDOWS…………… 102
1.18.3. Создание проекта в VisualDSP…………………………… 102
1.18.4. Загрузка программы в EZ-KIT Lite………………………. 103
1.19. Примеры программирования в среде VisualDSP…………….. 104
1.19.1. Формирование эхо-сигнала………………………………. 104
1.19.2. Эмуляция интерфейса RS-232……………………………. 112
1.19.3. Эмуляция интерфейса RS-232 (смешанный вариант)…... 124
2. АРХИТЕКТУРА СИСТЕМЫ НА ОСНОВЕ ADSP-2181………….. 131
2.1. Структурная схема вычислительной (управляющей) системы на
основе ADSP-2181………………………………………………….131
2.2. Цепи синхронизации и запуска процессора…………………….133
ПРИЛОЖЕНИЕ 1. ФОРМАТ РЕГИСТРОВ УПРАВЛЕНИЯ………... 134
П1.1. System control register………………………………………….. 134
П1.2. Data memory waitstate register…………………………………. 134
П1.3. SPORT0 autobuffer control register……………………………. 135
П1.4. SPORT0 control register………………………………………... 135
П1.5. SPORT1 autobuffer control register……………………………. 136
П1.6. SPORT1 control register……………………………………….. 137
П1.7. Programmable flags & Composite select control………………. 137
П1.8. Programmable flag data………………………………………… 138
П1.9. BDMA word count……………………………………………… 138
П1.10. BDMA control………………………………………………… 138
П1.11. BDMA external address……………………………………….. 139
П1.12. BDMA internal address……………………………………….. 139
П1.13. IDMA control………………………………………………….. 139
П1.14. ICNTL register………………………………………………… 140
П1.15. IMASK register………………………………………………... 140
П1.16. IFC register……………………………………………………. 140
ЛИТЕРАТУРА…………………………………………………………... 141
1. АРХИТЕКТУРА ADSP-2181
1.1. Описание выводов процессора
Условное графическое обозначение процессора ADSP2181 приведено на рис. 1.1. На этом рисунке условно не показаны 6 выводов питания
(Vdd = +5V), 11 общих выводов (GND), а также 9 сигналов, которые используются только для связи с эмулятором. Стрелки показывают направления передачи сигналов по отношению к процессору, по сути, тип вывода: вход, выход, вход/выход. Перечеркнутая линия является шиной, а рядом стоящая цифра показывает число ее проводников.
C1
BQ
CLKIN
C2
5
5
XTAL
RESET#
PWD#
IRQ2#
IRQE#
IRQL0#
IRQL1#
SPORT0
SPORT1
MMAP
BMODE
BR#
IRD#
IWR#
IS#
IAL
ADSP
2181
CLKOUT
PWDACK
ADDR[13:0]
RD#
WR#
DATA[23:0]
DMS#
PMS#
IOMS#
BMS#
CMS#
BG#
BGH#
FL2:0
PF7:0
IAD[15:0]
IACK#
14
24
3
8
16
Рис. 1.1. Условное графическое изображение ADSP-2181
Сигналы процессора имеют следующее назначение.
ADDR[13:0] – 14-битная шина адреса (ША) адресных пространств
памяти программ (ПП), памяти данных (ПД), ввода/вывода и байтовой
памяти (БП), см. п. 1.2. ША работает только на выход.
DATA[23:0] – 24-битная шина данных (ШД) адресных пространств
ПП, ПД, ввода/вывода и БП, см. п. 1.2. ШД работает на выход, когда процессор выводит данные в одно из адресных пространств и на вход, когда
процессор вводит данные из одного из адресных пространств.
RESET# – входной сигнал начальной установки процессора, см. п.
1.14.1.
IRQ2# (Interrupt Request) – входной сигнал запроса прерывания по
уровню или по фронту, см. п. 1.9.
IRQL0#, IRQL1# (Interrupt Request Level) – входные сигналы запроса прерывания по уровню, см. п. 1.9.
IRQE# (Interrupt Request Edge) – входной сигнал запроса прерывания по фронту, см. п. 1.9.
BR# (Bus Request) – входной сигнал запроса шины.
BG# (Bus Grant) – выходной сигнал подтверждения запроса шины.
BGH# (Bus Grant Hung) – выходной сигнал оповещения о том, что
процессор, находясь в режиме захвата, завершил все свои внутренние
операции и нуждается в шине.
PMS# (Program Memory Select), DMS# (Data Memory Select), IOMS#
(Input/Output Select), BMS# (Byte Memory Select), CMS# (Combine
Memory Select) – выходные селектирующие сигналы ПП, ПД, ввода/вывода, БП и комбинированный соответственно, см. п. 2.1.
RD# (Read) – выходной сигнал чтения всех видов адресных пространств.
WR# (Write) – выходной сигнал записи во все виды адресных пространств.
MMAP (Memory Map) – входной сигнал выбора карты памяти. Если
MMAP = 0, то адреса 0х0000…0x1FFF принадлежат внутренней ПП процессора, а адреса 0x2000…0x3FFF – внешней. В противном случае –
наоборот, см. пп. 1.3, 1.14.1, 1.15.4, 1.16.3.
BMODE (Boot Mode) – входной сигнал источника загрузки программы. Действителен только при MMAP = 0, когда адреса
0х0000…0x1FFF принадлежат внутренней ПП (см. выше) и необходима
загрузка программы. Если это условие выполнено, то при BMODE = 0 источником программы является БП доступная через порт BDMA (см. п.
1.15.4). В противном случае, загрузка программы осуществляется через
порт IDMA (см. п. 1.16.3).
CLKIN (Clock Input), XTAL (Quartz Crystal Input) – входы хронирующей цепи встроенного генератора тактовых импульсов процессора, см.
п. 1.14.1.
CLKOUT (Clock Output) – выходной синхросигнал процессора, частота которого в два раза выше частоты входного синхросигнала на входе
CLKIN, см. п. 1.14.4.
SPORT0, SPORT1 (Serial Port0, 1) – входы/выходы последовательных портов 0 и 1, см. п. 1.12.
IRD# (IDMA Read), IWR# (IDMA Write), IS# (IDMA Select), IAL
(IDMA Address Latch) – управляющие сигналы доступа к портам контроллера прямого доступа к памяти (КПДП) IDMA, см. п. 1.16.
IAD – 16-битная шина адреса/данных КПДП IDMA, см. п. 1.16.
IACK# (IDMA Acknowledge) – подтверждение доступа к портам
КПДП IDMA, см. п. 1.16.
PWD# (Power Down) – перевод процессора в режим энергосбережения (при PWD# = 0) , см. п. 1.14.4.
PWDACK (Power Down Acknowledge) – выходной сигнал подтверждения режима энергосбережения, см. п. 1.14.4.
FL2:0 – выходные сигналы внутреннего 3-битного параллельного
порта процессора (выходные флаги) , см. п. 1.14.3.
PF7:0 – программируемые входы/выходы процессора, см. п. 1.14.3.
1.2. Структурная схема ADSP-2181
Структурную схему процессора можно условно разделить на две части: базовую (общую для всех процессоров ADSP-21хх, рис 1.2.) и периферийную (характерную, в основном, для процессора ADSP-2181, рис.
1.3).
DMD BUS
DMD BUS
DATA
ADDRESS
GENERATOR
#1
DATA
ADDRESS
GENERATOR
#2
INSTRUCTION
REGISTER
I BUS
PROGRAM
SEQUENCER
14
PMA BUS
14
DMA BUS
24
PMD BUS
BUS EXCH
DMD BUS
16
INP REGS
INP REGS
INP REGS
ALU
MAC
SHIFTER
OUT REGS
OUT REGS
OUT REGS
16
R BUS
Рис. 1.2. Структурная схема базовой части процессора ADSP-2181
Рис. 1.2 показывает, что к базовой части процессора отнесены:
 внутренние шины PMA BUS, DMA BUS, PMD BUS DMD BUS, I
BUS, R BUS;
 узел обмена данными BUS EXCH(ANGE);
 вычислительные устройства ALU (арифметико-логическое
устройство), MAC (Multiplier/ACcumulator - умножитель/аккумулятор) и SHIFTER (устройство сдвига);
 генераторы адресов данных DAG1 и DAG2, регистр команд INSTRUCTION REGISTER и программный конвейер PROGRAM
SEQUENCER.
Внутренние шины обеспечивают пересылку команд из ПП, а также
данных из памяти данных в вычислительные устройства и обратно. К ним
относятся: шина адреса ПП PMA BUS (Program Memory Address Bus),
шина адреса ПД DMA BUS (Data Memory Address Bus), шина данных ПП
PMD BUS (Program Memory Data Bus), шина данных ПД DMD BUS (Data
Memory Data Bus), шина команд I BUS (Instruction Bus) и шина результатов вычислений R BUS (Result Bus).
Можно говорить о наличии у процессора четырех магистралей: ПП
PMA, PMD BUS, ПД DMA, DMD BUS, команд I BUS и результатов вычислений R BUS. Наличие множества внутренних магистралей позволяет
распараллеливать процесс пересылок команд и данных, в частности, можно совместить во времени вычисление и считывание данных из памяти
программ и памяти данных (см. п. 1.17.9). Это позволяет существенно повысить производительность процессора. Магистрали ПП и ПД соединены
между собой с помощью узла обмена данными BUS EXCH (см. п. 1.5).
Ширина адресных шин (PMA, DMA) – 14 бит, что обеспечивает доступ к 16К ячейкам памяти. Ширина шины данных ПП (PMD, I) – 24 бита
по числу бит команды процессора. Все оставшиеся шины (DMD, R) имеют ширину 16 бит, что позволяет обмениваться 16-битными данными за
один цикл доступа к ПД.
Все вычислительные устройства имеют входные регистры (INP
REGS), над содержимым которых они выполняют арифметические операции или операции сдвига. В ALU и MAC к таким регистрам относятся Хи Y- регистры (см. пп. 1.5, 1.6), а в SHIFTER – S-регистр. Х- и S-регистры
подключаются к DMD, а Y-регистры – к PMD, что позволяет одновременно считывать данные из памяти данных в Х-регистры, а из памяти
программ – в Y-регистры вычислительных устройств.
Результаты арифметических операций и операций сдвига сохраняются в выходных регистрах (OUT REGS) вычислительных устройств, которые связаны с DMD и шиной результатов R. Шина DMD используется
для обмена данными с ПД. Шина результатов позволяет использовать результат операции одного вычислительного устройства в качестве операнда в другом вычислительном устройстве без потери времени на сохранение результата операции в ПД.
DAG1 и DAG2 используются для реализации косвенной и косвенной автоинкрементной/автодекрементной адресации данных (см. п. 1.11),
поскольку среди прочих содержат по четыре регистра указателей.
Программный конвейер формирует адреса инструкций для ПП. Он
управляет регистром инструкций, который содержит исполняемую в данный момент команду. Команды загружаются в регистр инструкций в те-
чение одного цикла, а исполняются в течение следующего, одновременно
с загрузкой следующей инструкции.
PROGRAM
SRAM
16K x 24
I BUS
DATA
SRAM
16K x 16
BDMA
PDCL
PROG. I/O
PMA BUS
MUX
DMA BUS
1
8
EXTERNAL
ADDRESS
BUS
14
PMD BUS
2
24
MUX
DMD BUS
EXTERNAL
DATA
BUS
2
IDMA
PORT
TRN REG
RCV REG
SERIAL
PORT 0
5
TRN REG
RCV REG
SERIAL
PORT 1
TIMER
FLAGS
INTERRUPTS
21
3
4
5
Рис. 1.3. Структурная схема периферийной части процессора
ADSP-2181
Рис. 1.3 показывает, что к периферийной части процессора отнесены:
 мультиплексор шины адреса MUX1;
 мультиплексор шины данных MUX2;
 память программ – PROGRAM SRAM;
 память данных – DATA SRAM;
 байтовый КПДП – BDMA (Byte DMA Controller);
 внутренний КПДП – IDMA PORT (Internal DMA PORT);
 последовательные синхронные порты SERIAL PORT0, 1;
 таймер – TIMER;
 узел управления энергосбережением процессора – PDCL (Power
Down Control Logic);
 программируемые входы/выходы – PROG(rammable). I/O;
 выходы флагов – FLAGS;
 входы запросов прерываний – INTERRUPTS.
Периферийная и базовая части процессора соединяется внутренними
шинами I, PMA, DMA, PMD, DMD. На рис. 1.3 их выходы изображены
слева. Справа и снизу изображены внешние входы/выходы, которыми
процессор соединяется с внешним миром. Для выдачи адреса на внешнюю шину адреса EXTERNAL ADDRESS BUS используется мультиплексор шины адреса MUX1. Если идет обращение к внешнему адресному
пространству ПП, то на внешнюю шину адреса попадает код адреса с
PMA. Если идет обращение к внешнему адресному пространству ПД, то
на внешнюю шину адреса попадает код адреса с DMA. Выводы внешней
шины адреса имеют обозначения ADDR[13:0] (см. п. 1.1).
Для взаимодействия с внешней шиной данных (ввод команд или
ввод/вывод данных) EXTERNAL DATA BUS используется мультиплексор шины данных MUX2. Если идет обращение к внешнему адресному
пространству ПП, то код команды с внешней шины данных попадает на
PMD. Если идет обращение к внешнему адресному пространству ПД, то
внешняя шина данных соединяется с DMD. Выводы внешней шины данных имеют обозначения DATA[23:0] (см. п. 1.1).
ПП (см. п. 1.3) используется для хранения программы и данных. Это
ОЗУ статического типа (SRAM – Static RAM), поэтому во время сброса
процессора обычно осуществляется загрузка программы (см. пп. 1.15.4,
1.16.3).
ПД (см. п. 1.4) используется для хранения данных. В ее адресном
пространстве располагаются также некоторые регистры специального
назначения (РСН, см. пп. П1.1-П1.16).
Байтовый КПДП (см. п. 1.15) используется для взаимодействия с БП
процессора (ввод программ, ввод/вывод данных). БП подключается к
внешней магистрали процессора (внешние шины адреса и данных) с использованием селектирующего сигнала BMS# (см. п. 1.1). В частности,
байтовая память может использоваться для хранения программы, которая
во время сброса процессора загружается во внутреннюю ПП. Записать
данные в БП или считать их оттуда прямо из программы (без использования байтового КПДП) невозможно, поскольку только байтовый КПДП
формирует сигнал BMS#.
Внутренний КПДП (см. п. 1.16) используется для связи с внешним
миром, например, для ввода программы во внутреннюю ПП при сбросе
процессора, а также для ввода и вывода данных. Имеет собственную магистраль (см. п. 1.1), в которую входят: шина адреса/данных IAD[15:0] и
шина управления IRD#, IWR#, IS#, IAL, IACK#. Поскольку шина адреса
данных 16-битная, возможен обмен двухбайтными словами.
Последовательные синхронные порты (см. п. 1.12) используются для
связи с внешним миром, например, для связи с другим процессором или
любым другим последовательным синхронным портом. Связь осуществляется с использованием пяти выводов. По одному из них данные принимаются в регистр REC REG, по другому данные выдаются из регистра
TRN REG, оставшиеся выводы используются для формирования управляющих сигналов. На рис. 1.3 условно не показан узел уплотнения данных COMPANDING CIRCUITRY, который связан с последовательными
портами.
Таймер (см. п. 1.13) используется для формирования промежутков
времени заданной длительности. Задание длительности, запуск и останов
таймера осуществляется программно. Таймер формирует внутренние запросы на прерывание.
Узел управления энергосбережением процессора (см. п. 1.14.4) осуществляет поддержку входного сигнала PWD# и команд процессора
IDLE, IDLE(n) (см. п. 1.17.8.з). Один из выходных сигналов узла
PWDACK (см. п. 1.1) отражает состояние процессора (обычное или сохранения энергии).
Программируемые входы/выходы (см. п. 1.14.3) используется для
связи с внешним миром. Каждая из этих линий может быть запрограммирована на ввод или вывод. Имеют обозначения PF7:0 (см. п. 1.1).
Выходы флагов (см. п. 1.14.3) используется для связи с внешним миром, например для вывода управляющих сигналов или сигналов состояния. Имеют обозначения FL2:0 (см. п. 1.1).
Входы запросов прерываний (см. п. 1.9) служат для ввода внешних
сигналов запроса прерываний с различными свойствами IRQ2#, IRQL0#,
IRQL1#, IRQE# (см. п. 1.1).
1.3. Память программ
ПП представляет собой ОЗУ объемом 16К х 24. Кроме этого возможно использование 8К х 24 внешней памяти оверлеев. При использовании этой памяти всегда вставляются такты ожидания, число которых
определяется содержимым битовой группы PWAIT регистра System Control Register (РСН, расположенный в ПД по адресу 0х3FFF, см. п. П1.1).
Организация адресного пространства ПП (рис. 1.4) управляется
внешним сигналом MMAP (см. п. 1.1) и содержимым программно доступного РСН PMOVLAY. Как показывает рис.1.4, при MMAP = 0 8К
младших адресов принадлежат внутренней оперативной памяти. Это вынуждает при старте процессора (см. п. 1.14.1) производить загрузку программы (см. пп. 1.15.4, 1.16.3), поскольку процессор стартует с нулевого
адреса. Старшие 8К адресов с помощью РСН PMOVLAY назначены на
внутреннюю (PMOVLAY = 0) или внешнюю (PMOVLAY = 1 или 2) память процессора. Табл. 1.1 показывает выбор номера оверлея с помощью
содержимого РСН PMOVLAY.
Таблица 1.1
Выбор номера оверлея с помощью содержимого РСН PMOVLAY
PMOVLAY Память
ADDR13 ADDR[12:0]
0
Внутренняя
—
—
1
Внешний оверлей 1
0
13 младших битов
адреса формируют коды
0х0000…0x3FFF
2
Внешний оверлей 2
1
Тоже самое
Табл. 1.1 показывает, что в PMOVLAY хранится номер банка (оверлея) программ, а адресный бит ADDR13 является селектирующим (наряду
с PMS# (см. п. 1.1)). Следует проявлять осторожность при использовании
оверлейной памяти. Возможно, в ней лучше всего держать подпрограммы, которые вызываются из программы, функционирующей во внутренней ПП.
а)
б)
ПП
Адрес
8К внутренняя
0x3FFF
(PMOVLAY = 0,
MMAP = 0)
ИЛИ
…
8К внешняя
(PMOVLAY = 1 или 2,
MMAP = 0)
0x2000
0x1FFF
8К внутренняя
…
0x0000
ПП
8К внутренняя
(PMOVLAY = 0,
MMAP = 1)
Адрес
0x3FFF
…
8К внешняя
0x2000
0x1FFF
…
0x0000
Рис. 1.4. Организация адресного пространства ПП при MMAP = 0 (а)
и при MMAP = 1 (б)
Если MMAP = 1, то 8К младших адресов принадлежат внешней памяти (см. рис. 1.4 б). Обычно, это ПЗУ, поэтому загрузка программы во
время старта не нужна. Старшие 8К адресов принадлежат внутренней
оперативной памяти, а содержимое PMOVLAY не может отличаться от
нуля.
1.4. Память данных
ПД представляет собой ОЗУ объемом 16352 х 16. Кроме этого возможно использование 8К х 16 внешней памяти оверлеев. При использовании этой памяти всегда вставляются такты ожидания, число которых
определяется содержимым битовой группы DWAIT регистра Data
Memory Waitstate Register (РСН, расположенный в ПД по адресу 0х3FFE,
см. п. П1.2).
Организация адресного пространства ПД (рис. 1.5) управляется содержимым программно доступного РСН DMOVLAY. Как показывает
рис.1.5, с помощью DMOVLAY можно сменить размещение только младших 8К адресов ПД. Если DMOVLAY = 0, то они назначены на внутреннюю память, а если DMOVLAY = 1 или 2, то – на внешнюю ПД процессора. Табл. 1.2 показывает выбор номера оверлея с помощью содержимого РСН DMOVLAY.
Таблица 1.2
Выбор номера оверлея с помощью содержимого РСН DMOVLAY
DMOVLAY Память
ADDR13 ADDR[12:0]
0
Внутренняя
—
—
1
Внешний оверлей 1
0
13 младших битов
адреса формируют коды
0х0000…0x3FFF
2
Внешний оверлей 2
1
Тоже самое
Табл. 1.2 показывает, что в DMOVLAY хранится номер банка (оверлея) данных, а адресный бит ADDR13 является селектирующим (наряду с
DMS# (см. п. 1.1)).
ПД
32 РСН
Внутренние 8160 слов
8К внутренняя
(DMOVLAY = 0)
ИЛИ
8К внешняя
(DMOVLAY = 1 или 2)
Адрес
0x3FFF
0x3FЕ0
0x3FDF
0x2000
0x1FFF
…
0x0000
Рис. 1.5. Организация адресного пространства ПД
Старшие 8К адресов всегда принадлежат внутренней оперативной
памяти, причем, старшие 32 ячейки используются в качестве РСН (см. пп.
П1.1-П1.16).
1.5. Функциональная схема ALU
Основу ALU (рис. 1.6) составляет собственно ALU, которое выполняет арифметико-логические операции (см. п. 1.17.5) над 16-битными кодами, присутствующими на его Х- и Y- входах. Результат операции появляется на 16-битном выходе R(esult) и может быть запомнен в регистре
результата AR (через мультиплексор MUX 4) или в регистре обратной
связи AF (Alu Feedback).
Кроме этого ALU формирует различные признаки (флаги, см. п.
1.10) результата, в частности: флаг нуля AZ (Alu Zero), флаг отрицательного результата AN (Alu Negative), флаг переноса AC (Alu Carry), флаг
переполнения AV (Alu oVerflow), флаг знака Х-операнда AS (Alu Sign),
значение бита частного AQ (Alu Quotient). Все флаги сохраняются в регистре арифметического состояния ASTAT (см. п. 1.10). Для выполнения
команд, использующих перенос/заем, ALU использует значение флага переноса CI, который хранится в ASTAT.
Мультиплексор MUX 2 выбирает значение Х-операнда (хор). Таковым может быть содержимое одного из АХ регистров (АХ0 или АХ1) или
код, находящийся на шине результатов R BUS.
PMD BUS
24
DMD BUS
16
16 (старшие биты)
MUX 1
AX
РЕГИСТРЫ
2 х 16
AY
РЕГИСТРЫ
2 х 16
MUX 2
MUX 3
AZ
AN
AC
AV
AS
AQ
X
Y
AF
РЕГИСТР
ALU
СI
R
16
MUX 4
AR
РЕГИСТР
R BUS
Рис. 1.6. Функциональная схема ALU
16
Поскольку с шиной результата связаны регистры результата всех
арифметических устройств, то хор (кроме АХ0, АХ1) могут быть AR,
MR0, MR1, MR2 (см. п. 1.6) и SR0, SR1 (см. п. 1.7).
АХ регистры связаны с шиной данных ПД (DMD BUS), поэтому в
них может быть записан код из ПД и считан – в ПД. Система команд процессора (см. п. 1.17) позволяет чтение содержимого этих регистров в ПП,
но это не прямой путь, а через BUS EXCH (см. рис. 1.2). Все АХ регистры
двух портовые. Это означает, что в одном регистре находятся данные для
ALU, а другой регистр одновременно взаимодействует с DMD BUS, т.е.
выполнение команды может быть совмещено с чтением следующего операнда.
Мультиплексор MUX 3 выбирает значение Y-операнда (yор). Таковым может быть содержимое одного из АY регистров (АY0 или АY1) или
содержимое регистра AF.
С помощью мультиплексора MUX 1 АY регистры связаны и с шиной
данных ПД (DMD BUS), и с шиной данных ПП (PMD BUS). Поэтому в
них может быть записан код из ПД и считан – в ПД, а также записан – из
ПП. Система команд процессора (см. п. 1.17) позволяет чтение содержимого этих регистров в ПП, но это не прямой путь, а через BUS EXCH (см.
рис. 1.2). Все АY регистры двух портовые.
С помощью мультиплексора MUX 4 АR регистр связан с шиной данных ПД (DMD BUS), поэтому в него может быть записан код из ПД и
считан – в ПД. Система команд процессора (см. п. 1.17) позволяет чтение
содержимого этого регистра в ПП, но это не прямой путь, а через BUS
EXCH (см. рис. 1.2).
Любой регистр ALU может быть сосчитан и записан в одном и том
же машинном цикле. Считывание регистра происходит в начале машинного цикла, в то время как запись – в конце. Это позволяет, например,
считать из AR предыдущий результат и записать в него текущий в одном
и том же машинном цикле.
ALU содержит двойной банк регистров. На рис. 1.6 это отражено тенью. В одно и то же время доступен только один банк регистров. Дополнительный банк регистров может быть использован для быстрого переключения контекста задачи, например, в обработчиках прерываний. При
этом не требуется сохранение контекста путем пересылки данных в память, например, в стек, как это делается во многих видах процессоров.
Выбор номера банка регистров обеспечивает бит 0 в регистре состояния
процессора MSTAT (см. п. 1.10). Если этот бит сброшен, то выбран первый банк регистров, в противном случае – второй.
1.6. Функциональная схема МАС
Основу MAC (рис. 1.7) составляют умножитель MULTIPLIER и
сумматор/вычитатель ADD/SUBTRACT. Умножитель выполняет операции умножения (см. п. 1.17.6) над 16-битными кодами, присутствующими
на его Х- и Y- входах. Результат операции (произведение) появляется на
32-битном выходе P(roduct) и подается на один вход сумматора/вычитателя, на второй вход которого подается содержимое регистра
результата MR (Mac Result).
PMD BUS
24
DMD BUS
16
16 (старшие биты)
MUX 1
MX
РЕГИСТРЫ
2 х 16
MY
РЕГИСТРЫ
2 х 16
MUX 2
MUX 3
MF
РЕГИСТР
X
Y
MULTIPLIER
P
40
R2
32
ADD/SUBTRACT
R1
MV
R0
MUX 4
MUX 5
MUX 6
8
16
16
MR2
РЕГИСТР
MR1
РЕГИСТР
MR0
РЕГИСТР
M
U
X
7
R BUS
16
Рис. 1.7. Функциональная схема MAC
Регистр результата представляет собой совокупность трех регистров
MR2…MR0, первый из которых (MR2) 8-битный, второй и третий – 16битные.
В зависимости от команды (см. п. 1.17.6) сумматор/вычитатель может просто передать произведение в регистры MR1, MR0 (с выходов R1,
R0 через мультиплексоры MUX 5, MUX 6), а также может сложить/ вычесть произведение с/из содержимым/содержимого регистра результата
MR.
Произведение может быть запомнено не только в регистрах результата МR2…MR0 (через мультиплексоры MUX 4…MUX 6), но и в регистре обратной связи МF (Мас Feedback). При этом используется выход R1
сумматора/вычитателя, поскольку – это выход старшего слова произведения. Выход R0 содержит младшее слово произведения (наименее значимое), а выход R2 служит для вывода переносов/заемов, которые могут
возникнуть при операциях сложения/вычитания.
При появлении переполнения МАС формирует признак MV (Mac
oVerflow), который запоминается в регистре ASTAT.
Регистры результата MR2…MR0 связаны с шиной результата R
BUS, поэтому их содержимое может быть использовано в качестве xop
других арифметических устройств (см. пп. 1.5, 1.7). Кроме этого, они могут загружаться не только из сумматора/вычитателя, но и с шины данных
ПД (DMD BUS). Через мультиплексор MUX 7 содержимое регистров результата MR2…MR0 также может быть считано на шину данных ПД
(DMD BUS).
В качестве хор умножителя может выступать содержимое одного из
МХ регистров (МХ1 или МХ0) или любого из регистров результата AR,
MR2…MR0, SR1, SR0. Выбор хор обеспечивается мультиплексором MUX
2. В качестве yор умножителя может выступать содержимое одного из
МY регистров (МY1 или МY0) или регистра обратной связи MF. Выбор
yор обеспечивается мультиплексором MUX 3.
Регистры МХ1, МХ0 могут загружаться и считываться через шину
данных ПД (DMD BUS). Регистры МY1, МY0 могут загружаться и считываться через шину данных ПД (DMD BUS) и загружаться с шины данных ПП (PMD BUS). Выбор шины обеспечивает мультиплексор MUX 1.
По свойствам все регистры МАС аналогичны регистрам ALU (см. п.
1.5).
1.7. Функциональная схема SHIFTER
Устройство сдвига (УС, рис. 1.8) поддерживает выполнение команд
арифметического сдвига, логического сдвига и нормализации (см. п.
1.17.7). Кроме этого, УС позволяет извлекать экспоненту числа, а также
извлекать общую экспоненту целого блока чисел. Эти функции наиболее
полезны при операциях с числами в формате с плавающей точкой.
УС может быть разделено на следующие блоки: сдвигатель (SHIFTER ARRAY), блок OR/PASS, детектор экспоненты EXP DET, блок сравнения экспонент COMPARE.
Сдвигатель может поместить 16-битный входной код (I) в любое
место 32-битного выхода (О). Всего существует 49 размещений входного
кода в 32-битном пространстве выходного кода. Размещение (число сдвигов и направление сдвигов) определяются кодом на входе С и сигналом
HI/LO сдвигателя.
DMD BUS
16
SI
РЕГИСТР
MUX 1
SB
РЕГИСТР
SS
COMPARE
MUX 4
8
SE
РЕГИСТР
X
EXP DET
HI/LO
MUX 3
MUX 2
CMD
NEG
I X
R SHIFTER
ARRAY
C O
32
32
OR/PASS
8
16
MUX 5
SR1
РЕГИСТР
16
MUX 6
SR0
РЕГИСТР
M
U
X
7
R BUS
16
Рис. 1.8. Функциональная схема SHIFTER
В состав УС входят также регистры: входной (SI – Shifter Input), экспоненты (SE – Shifter Exponent) и блочной экспоненты (Shifter Block). Во
входном регистре хранится входной 16-битный код сдвигателя и детектора экспоненты. С помощью DMD-шины можно считать и изменить (записать) содержимое этого регистра. Входным кодом для сдвигателя и детектора экспоненты может быть содержимое AR (см. п. 1.5), SR или MR (см.
п. 1.6), поскольку все эти регистры связаны с R-шиной. Выбор производится мультиплексором MUX 2, который управляется кодом команды
сдвига (см. п. 1.17.7).
Результат сдвига через блок OR/PASS помещается в 32-битный регистр SR (Shifter Result), который разделен на два 16-битных регистра
SR0 и SR1. Кроме блока OR/PASS источниками кода для загрузки этих
регистров могут быть DMD- и R-шины (через MUX 2, сдвигатель и блок
OR/PASS). Выбор источника осуществляют мультиплексоры MUX 5,
MUX 6. Выход SR регистра связан с одним из входов блока OR/PASS для
реализации операций сдвига двойной точности, а также с DMD-шиной
(через мультиплексор MUX 7)..
Во время выполнения операций нормализации и денормализации
(см. п. 1.17.7) 8-битный регистр SE хранит экспоненту. Экспонента является целым числом со знаком и может быть загружена (и прочитана) через
младшие 8 бит DMD-шины.
Во время выполнения операций над блоком чисел в формате с плавающей точкой (см. п. 1.17.7) 5-битный регистр SB хранит блочную экспоненту, т. е. число на которое должны быть сдвинуты все числа блока
(обычно – это максимальная экспонента блок чисел). Блочная экспонента
является целым числом со знаком и может быть загружена (и прочитана)
через младшие 5 бит DMD-шины.
Когда содержимое регистров SE и SB считывается через DMD-шину,
происходит расширение знака до 16 бит. По свойствам все регистры УС
аналогичны регистрам ALU (см. п. 1.5).
Направление сдвига и число сдвигов определяется управляющим кодом на входе С сдвигателя. Положительное управляющее число определяет сдвиг влево, а отрицательное – вправо. Имеется три источника такого кода: содержимое регистра SE, инвертированное (через инвертор NEG)
содержимое регистра SE и непосредственное значение из команды CMD.
Выбор источника осуществляется мультиплексором MUX 4.
Значение сигнала HI/LO определяет размещение сдвинутого входного кода в 32-битном пространстве выходного кода. В частности, значение
HI определяет размещение кода в регистре SR1, а LO – в регистре SR0.
Табл. 1.3 показывает значения выходного кода сдвигателя при различных
значениях управляющего кода и сигнала HI/LO.
Таблица 1.3
Значения выходного кода сдвигателя при различных значениях
управляющего кода и сигнала HI/LO
Управляющий код
Выходной код сдвигателя
Активен HI Активен LO
16…127
32…127
00000000 00000000 00000000 00000000
15
31
R0000000 00000000 00000000 00000000
14
30
PR000000 00000000 00000000 00000000
…
2
18
CDEFGHIJ KLMNPR00 00000000 00000000
1
17
BCDEFGHI JKLMNPR0 00000000 00000000
0
16
ABCDEFGH IJKLMNPR 00000000 00000000
-1
15
XABCDEFGH IJKLMNP R0000000 00000000
-2
14
XXABCDEFGH IJKLMN PR000000 00000000
…
-30
-14
XXXXXXXX XXXXXXXX XXXXXXXX
XXXXXXAB
-31
-15
XXXXXXXX XXXXXXXX XXXXXXXX
XXXXXXXA
-32…-128
-16…-128
XXXXXXXX XXXXXXXX XXXXXXXX
XXXXXXXX
Примечания к табл. 1.3:
 ABCDEFGHIJKLMNPR – входной код (совокупность нулей и
единиц) сдвигателя;
 Х – бит распространения.
Табл. 1.3 показывает, что сдвигатель заполняет все биты выходного
кода, которые находятся справа от входного кода нулями, а слева – битом
распространения Х (см. вход Х сдвигателя на рис. 1.8). В зависимости от
выполняемой команды (см. п. 1.17.7) есть три источника бита распространения: старший значащий (знаковый) разряд входного кода, бит АС
регистра арифметического статуса ASTAT (см. п. 1.10) и нуль.
Блок OR/PASS в зависимости от команды (см. п. 1.17.7) либо пропускает выходной код сдвигателя для запоминания в регистре SR (когда
опущена опционная часть команд сдвига [SR OR]), либо выполняет операцию логического сложения над выходным кодом сдвигателя и содержимым регистра SR (когда опционная часть команд сдвига [SR OR] присутствует).
Опционная часть команд сдвига [SR OR] используется для выполнения сдвигов чисел с двойной точностью (32-битных). Допустим, что регистр SE содержит код 3, а регистр SI - ABCDEFGHIJKLMNPR, который
необходимо сдвинуть с двойной точностью. Для этого необходимо сначала сдвинуть входной код относительно старшей части регистра SR, т. е.
выполнить команду SR = LSHIFT SI (HI). В результате регистр SR будет
содержать следующий код 00000000 00000ABC 00000000 00000000. Далее необходимо выполнить команду SR = SR OR LSHIFT SI (LO), после
чего регистр SR будет содержать код 00000000 00000ABC DEFGHIJK
LMNPR000. Если опустить во второй команде часть SR OR, то биты АВС
заменятся нулями и мы не получим сдвига с двойной точностью.
Детектор экспоненты извлекает экспоненту входного кода сдвигателя и помещает ее в регистр SE через мультиплексор MUX 3. В зависимости от команды (см. п. 1.17.7) детектор по разному интерпретирует входной код. В режиме HI входной код интерпретируется как число с одинарной точностью или как старшее слово числа с двойной точностью. Экспонента при этом формируется по следующему правилу: подсчитывается
число старших бит с одинаковым значением; получившееся число декрементируется; результат инвертируется. Табл. 1.4 иллюстрирует формирование экспоненты в HI режиме.
Таблица 1.4
Формирование экспоненты в HI режиме
Входной код сдвигателя
Значение экспоненты
SNDDDDDD DDDDDDDD
0
SSNDDDDD DDDDDDDD
-1
…
SSSSSSSS SSSSSSSN
-14
SSSSSSSS SSSSSSSS
-15
Примечание к табл. 1.4: S – знаковый бит, N – не знаковый бит, D –
биты не рассматриваемые детектором экспоненты.
В расширенном HI режиме (HIX) входной код интерпретируется как
результат операции вычитания (сложения) ALU, которая могла вызвать
переполнение. В этом случае при формировании экспоненты учитывается
флаг переполнения AV (см. п. 1.17.7). Табл. 1.5 иллюстрирует формирование экспоненты в расширенном HI режиме.
AV
1
0
0
0
0
0
Таблица 1.5
Формирование экспоненты в расширенном HI режиме
Входной код сдвигателя
Значение экспоненты
DDDDDDDD DDDDDDDD
+1
SNDDDDDD DDDDDDDD
0
SSNDDDDD DDDDDDDD
-1
…
SSSSSSSS SSSSSSSN
-14
SSSSSSSS SSSSSSSS
-15
Табл. 1.5 показывает, что при наличии переполнения (AV = 1) экспонента равна +1. При отсутствии переполнения (AV = 0) экспонента
формируется как в обычном HI режиме.
В режиме LO входной код интерпретируется как младшее слово числа с двойной точностью. В этом режиме принимается во внимание знак
числа, который хранит флаг знака SS (см. п. 1.17.7 и рис. 1.8). Экспонен-
та формируется только, если регистр SE содержит значение –15, т.е.
старшее слово числа с двойной точностью содержит все нули или единицы. Табл. 1.6 иллюстрирует формирование экспоненты в LO режиме.
Таблица 1.6
SS
S
S
S
S
S
Формирование экспоненты в LO режиме
Входной код сдвигателя
Значение экспоненты
NDDDDDDD DDDDDDDD
-15
SNDDDDDD DDDDDDDD
-16
…
SSSSSSSS SSSSSSSN
-30
SSSSSSSS SSSSSSSS
-31
Блок сравнения экспонент используется для нахождения максимальной экспоненты массива входных чисел сдвигателя. Для этого блок сравнения сравнивает значение экспоненты, которое присутствует на выходе
детектора экспоненты, с содержимым регистра SB. Если выходное значение детектора экспоненты выше, чем содержимое регистра SB, то это
значение через мультиплексор MUX 1 записывается в регистр SB. Обычно перед операцией определения максимальной экспоненты (см. п. 1.17.7)
в регистр SB записывается число –16 (минимально возможное значение).
Очевидно, что после циклической обработки всего массива чисел код
максимальной экспоненты может быть считан из регистра SB.
1.8. Функциональная схема программного конвейера
Программный конвейер (рис. 1.9) формирует поток адресов команд,
а также обеспечивает гибкое управление выполнением программы. Он
допускает последовательное выполнение команд, организацию циклов без
потери времени на определение окончания цикла, сложную обработку
прерываний, передачу управления и вызовы подпрограмм (условные и
безусловные) за один машинный цикл. Программный конвейер поддерживает следующие команды (см. п. 1.17.8) управления выполнением программы: цикла DO UNTIL, передачи управления JUMP, вызова подпрограмм CALL, возврат из подпрограмм RTS, возврат из прерываний RTI и
перехода в энергосберегающий режим работы IDLE.
Функциональная схема программного конвейера может быть разбита
на следующие узлы: узел формирователя следующего адреса, узел программного счетчика и стека программного счетчика, узла счетчика циклов
и стека счетчика циклов, узла компаратора циклов и стека компаратора
циклов, узла регистров статуса и стека регистров статуса, узла контроллера прерываний.
Узел формирователя следующего адреса содержит мультиплексор
следующего адреса (NEXT ADDRESS MUX) и устройство управления
мультиплексором следующего адреса (NEXT ADDRESS SOURCE SELECT). Во время выполнения процессором текущей команды этот узел
формирует адрес следующей команды. Этот адрес может поступать от четырех источников: инкрементора (INCREMENT) программного счетчика
(PROGRAM COUNTER – PC), РС стека (PC STACK), регистра команд
(шина А на рис. 1.9) и контроллера прерываний (INTERRUPT CONTROLLER).
DMD BUS
16
От регистра команд
С A
F
ALI
COUNT
STACK
A
MUX 1
F
LOOP
STACK
CNTR
(счетчик)
СЕ ВЫХ
CONDITION
LOGIC
E STATUS
STACK
C
LOOP
COMPARATOR
MUX 2
MUX 3
Флаги
oт ALU
STATUS
REGISTERS
N
INTERRUPTE
CONTROLLER
PC
STACK
PROGRAM
COUNTER
C F
INCREMENT
ПРЕРЫВ.
P
NEXT
ADDRESS
SOURCE
SELECTOR
NEXT ADDRESS MUX
N
P
A
От контакта FI
PMA BUS 14
Рис. 1.9. Функциональная схема программного конвейера
Узел формирователя следующего адреса основывает свой выбор на
анализе следующих сигналов: кода команды (шина F (Function field – битовое поле функции команды) на рис. 1.9), состояния узла условных переходов (CONDITION LOGIC), состояния компаратора циклов (LOOP
COMPARATOR), состояния контроллера прерываний и контакта процессора FI.
Адрес следующей команды устанавливается на PMA шине. Инкрементор РС, как источник следующего адреса, выбирается, когда выполняется последовательная часть программы, т.е. отсутствуют условные переходы или возвраты из подпрограмм. Выходной код инкрементора поступает на PMA шину, а также через мультиплексор MUX 3 (по шине N, см.
рис. 1.9) загружается в РС, чтобы начать следующий машинный цикл.
Стек РС, как источник следующего адреса, выбирается, когда выполняется возврат из подпрограммы или обработчика прерывания. Адрес
на вершине стека РС используется, как источник следующего адреса,
также, когда происходит возврат в вершину цикла DO UNTIL.
Регистр команд, как источник следующего адреса, используется при
прямой адресации, когда 14-битный адрес встроен в код операции команды.
Контроллер прерываний, как источник следующего адреса, используется при обслуживании прерывания. После определения достоверности
текущего запроса на прерывание (см. п. 1.9) процессор выполняет переход на вектор прерывания, соответствующего активному запросу на прерывание.
Узел формирователя следующего адреса не единственный источник
адреса следующей команды. Другим источником может служить любой
из индексных регистров I4-I7 DAG2 (см. рис. 1.2). Такое случается, если в
программе встречается косвенный переход, вызванный, например, следующей командой JUMP (I4); (точка с запятой обозначает конец оператора).
Адрес, который при этом присутствует на РМА шине, также загружается
в РС через MUX 3, но в этом случае используется Р шина (см. рис. 1.9).
РС и его стек. РС является 14-битным регистром, в котором находится адрес текущей выполняемой команды. Выход РС подключен ко
входу инкрементора, который увеличивает содержимое РС на единицу,
т.е. содержит адрес следующей команды (см. выше). Содержимое инкрементора с помощью устройства управления мультиплексором следующего адреса может быть выбрано в качестве источника следующего адреса,
что происходит при выполнении не разветвляющейся части программы.
С РС связан стек, который может содержать шестнадцать 14-битных
слов (адресов). Запись в РС стек происходит в трех случаях: при выполнении команды CALL, при выполнении перехода на обработчик прерывания и при выполнении цикла DO UNTIL. В первых двух случаях в стек
записывается адрес возврата из подпрограммы или из обработчика прерываний соответственно, в последнем случае – адрес первой команды тела цикла.
Особенностью обработки цикла прерывания является то, что в РС
стек записывается не содержимое инкрементора, а содержимое РС, что
позволяет выполнить команду, которая была прервана. Записи адресов и
их считывание происходят автоматически, но считать стек РС можно и
программно с помощью команды POP. Есть и еще одна команда (см. п.
1.17.10), с помощью которой можно не только сосчитать стек, но и записать в стек. Эта команда использует псевдо регистр TOPPCSTACK.
Выход мультиплексора следующего адреса через шину N и мультиплексор MUX 3 (см. рис. 1.9) связан с РС, что позволяет загружать новый
адрес в конце текущего машинного цикла. Обычно так и происходит, но
когда переход по программе осуществляется косвенно (по содержимому
одного из индексных регистров DAG2), то адрес в РС загружается прямо
с РМА через шину Р и мультиплексор MUX 3.
Счетчик циклов и его стек. Счетчик циклов (CNTR, см. рис. 1.9)
поддерживает механизм формирования программных циклов. Сам счетчик является 14-битным, с автоматическим пост-декрементированием
своего содержимого в конце тела цикла, что позволяет выполнять тело
цикла предопределенное число раз. Счетная величина является числом
без знака (положительной).
Для N-кратного выполнения тела цикла обычно используется следующий фрагмент программы:
CNTR = N;
DO cycles UNTIL CE;
{тело цикла}
cycles: Op1; Op2;
Первый оператор этого фрагмента загружает счетчик циклов константой N, которая должна быть определена в программе до ее первого
использования. Второй оператор определяет тело цикла (от оператора до
метки cycles) и условие выхода из цикла (Counter Expire (СЕ) - счетчик
исчерпан).
Счетчик циклов декрементируется после выполнения последнего
оператора цикла (Ор1). Следует отметить, что оператор Ор1 принадлежит
телу цикла, а Ор2 – уже нет. Счетчик циклов может проверен и автоматически декрементирован также командой условного перехода, которая
тестирует флаг СЕ. Счетчик не декрементируется, если СЕ проверяется
условными арифметическими командами или условными командами возврата из подпрограмм.
Содержимое счетчика в любое время может быть считано через
DMD шину, само содержимое при этом не изменяется. При считывании
счетчика два старших бита DMD шины заполняются нулями.
Для реализации вложенных циклов с счетчиком связан стек (COUNT
STACK, см. рис. 1.9), который может хранить четыре (максимальное число вложенных циклов) 14-битных слова. Когда счетчик загружается новым значением с DMD шины (например, выполняется оператор CNTR =
N;), текущее содержимое счетчика циклов автоматически загружается в
стек счетчика. Стек счетчика автоматически считывается, когда в конце
очередного цикла флаг СЕ принимает единичное значение, т.е. исчерпывается число необходимых циклов. Если необходим экстренный выход из
циклов до исчерпания их числа, то стек может быть считан вручную.
В двух случаях автоматическое сохранение текущего значения счетчика циклов в стеке не производится. Их можно отнести к исключениям
из общего правила. Первое исключение возникает, когда указатель стека
счетчика содержит недействительное число. Это может случиться после
сброса процессора или, когда была предпринята проверка СЕ с положительным исходом, а стек счетчика был пуст. Пустое состояние стека счетчика отражается битом 2 регистра SSTAT (см. п. 1.10).
Второе исключение возникает при использовании имени регистра
OWRCNTR (OverWRite CouNTeR – перезапись счетчика). Запись в этот
регистр перезаписывает содержимое счетчика циклов без сохранения его
текущего значения в стек счетчика. OWRCNTR не может быть считан и
не должен записываться в последней команде цикла DO UNTIL.
Компаратор циклов и его стек. С помощью компаратора циклов
(LOOP COMPARATOR, см. рис. 1.9) программный конвейер обеспечивает переход в начало тела цикла без потери времени на определение окончания тела цикла.
В каждом машинном цикле компаратор циклов сравнивает следующий адрес, сформированный программным конвейером, с адресом последней команды тела цикла (адрес метки, указанной в операторе DO
UNTIL, например, cycles в предыдущем примере). Адрес первой команды
тела цикла хранится в вершине РС стека. Когда выполнится последняя
команда тела цикла, процессор выполнит условный переход в начало тела
цикла без дополнительных затрат времени на определение конца тела
цикла.
Стек циклов (LOOP STACK, см. рис. 1.9) запоминает адреса последних команд и условий выхода из вложенных циклов, которых может быть
до четырех. Единственный дополнительный машинный цикл, связанный с
вложением циклов DO UNTIL необходим для выполнения самой команды
DO UNTIL, поскольку загрузка стеков, связанных с реализацией циклов
(COUNT STACK, LOOP STACK) выполняется аппаратно.
Состояние счетчика циклов, которое отражается флагом СЕ, не
единственное, которое используется для реализации циклов. Полный перечень условий выхода из цикла DO UNTIL приводится в табл. 1.7.
Условие
EQ
NE
LT
GE
LE
GT
Таблица 1.7
Условия выхода из цикла DO UNTIL
Описание
Выполняется, когда
Равно нулю
AZ = 1
Не равно нулю
AZ = 0
Меньше чем ноль
AN.XOR.AV = 1
Больше чем или равно нулю
AN.XOR.AV = 0
Меньше чем или равно нулю
(AN.XOR.AV).OR.AZ = 1
Больше чем ноль
(AN.XOR.AV).OR.AZ = 0
AC
NOT AC
AV
NOT AV
MV
NOT MV
NEG
POS
CE
FOREVER
Перенос ALU
Нет переноса ALU
Переполнение ALU
Нет переполнения ALU
Переполнение МАС
Нет переполнения МАС
Отрицательный знак Х входа
Положительный знак Х входа
Счетчик исчерпан
Всегда
AC = 1
AC = 0
AV = 1
AV = 0
MV = 1
MV = 0
AS = 1
AS = 0
Когда выполняется команда DO UNTIL, 14-битный адрес последней
команды тела цикла и 4-битное условие окончания цикла (оба определяются командой DO UNTIL) загружаются в 18-битный 4-словный стек
циклов. Одновременно выход РС инкрементора загружается в РС стек.
Поскольку команда DO UNTIL расположена перед первой командой тела
цикла, то в РС стек загружается адрес первой команды тела цикла.
Компаратор циклов сравнивает адрес, который хранится на вершине
его стека, с адресом следующей команда. Когда эти адреса сравниваются,
он сообщает об этом селектору следующего адреса. При этом, в зависимости от типа последней команды тела цикла возможны три варианта поведения селектора следующего адреса. Первый вариант отражает наиболее типичный случай. Второй и третий варианты также разрешены, но
требуют более сложной программы для своей реализации.
Вариант 1.
Если последняя команда тела цикла не JUMP, CALL, RETURN или
IDLE, то селектор следующего адреса проверяет условие окончания циклов, которое хранится в вершине стека циклов. Если условие не выполнено, то в качестве источника следующего адреса выбирается РС стек, что
вызовет переход на начало тела цикла. Если условие выполнено, то в качестве источника следующего адреса выбирается РС инкрементор, что
вызывает выход из тела цикла на первую команду за пределами тела цикла. Стеки циклов, РС и счетчика (если используется) при этом аппаратно
считываются.
Необходимо отметить, что условные арифметические команды выполняются в зависимости от условий, явно заданных в команде, в то время как выполнение цикла управляется условием, которое неявно задано
кодом, хранящимся в вершине стека циклов.
Вариант 2.
Если последняя команда тела цикла JUMP, CALL, или RETURN, то
она имеет преимущество перед неявным управлением цикла. Это означает, что при выполнении, перечисленных выше команд, не выполняются
обычные для конца тела цикла операции: возврат в начало тела цикла с
декрементированием счетчика циклов (если циклы не завершились), выход из цикла с считыванием стеков циклов, РС, счетчика (если циклы завершились).
Отметим, что по команде RETURN происходит возврат в начало тела цикла, поскольку на вершине стека РС находится адрес первой команды тела цикла.
Вариант 3.
Если последней командой тела цикла является IDLE, то когда она
выполняется процессор переходит в режим пониженного энергопротребления и ожидания прерывания. Когда прерывание происходит, то выполняется выход из циклов (даже, если условие выхода еще не выполнилось)
и переход на следующую за циклом команду.
Очевидно, что необходимо проявлять особую осторожность при использовании команд JUMP, CALL, RETURN или IDLE в последней строке тела цикла (а, возможно, и вовсе отказаться от этого). Это связано с
блокированием механизма управления циклами (см. выше Вариант 1 и
Вариант 2), что в том числе приводит к необходимости вручную (программно) считывать стеки циклов, РС и счетчика. Такая же необходимость существует при экстренном выходе из циклов.
1.9. Система прерываний
1.9.1. Общие сведения
Контроллер прерываний (INTERRUPT CONTROLLER, см. рис. 1.9)
обслуживает запросы на прерывания процессора. Одним из этапов обслуживания является передача управления на соответствующий вектор прерывания. Все вектора прерывания перечислены (в порядке понижения
приоритета) в табл. 1.8.
Таблица 1.8
Источники прерываний и адреса векторов прерываний
Источник прерывания
Адрес вектора
прерывания
RESET#
0х0000 (наивысший
приоритет)
Powerdown (немаскируемое)
0х002С
IRQ2#
0х0004
IRQL1# (чувствительное к уровню) 0х0008
IRQL0# (чувствительное к уровню) 0х000С
SPORT0 Передача
0х0010
SPORT0 Прием
0х0014
IRQE# (чувствительное к фронту)
0х0018
Byte DMA
0х001С
SPORT1 Передача / IRQ1#
0х0020
SPORT1 Прием / IRQ0#
0х0024
Таймер
0х0028 (наинизший
приоритет)
Тип
прерывания
Внешний
Внешний
Внешний
Внешний
Внешний
Внутренний
Внутренний
Внешний
Внутренний
Внутр/внеш
Внутр/внеш
Внутренний
Эффективные стек и программный конвейер позволяют обслуживать
незамаскированные запросы на прерывания без дополнительной задержки
(за исключением задержки синхронизации) даже, когда прерываются
циклы DO UNTIL. Вложение прерываний позволяет запросу с более высоким приоритетом прерывать обработчик прерывания с более низким
приоритетом также без дополнительной задержки.
Для сохранения контекста прерываемой задачи можно использовать
выбор вторичных регистров ALU, MAC и SHIFTER (см. пп. 1.5…1.7). Такое переключение выполняется за один машинный цикл.
1.9.2. Последовательность обслуживания прерывания.
Запрос на прерывание запоминается контроллером прерываний на
время выполнения текущей команды. Далее проверяется соответствующий разряд регистра масок IMASK (см. п. 1.9.3).
Если прерывание не замаскировано, то программный конвейер загружает содержимое программного счетчика (который содержит адрес
следующей команды) в стек РС. Это позволяет продолжить работу прерванной программы после выполнения обработчика прерывания.
Программный конвейер также загружает содержимое регистров
ASTAT (см. п. 1.10), MSTAT (см. п. 1.10) и IMASK в стек состояния
(STATUS STACK, см. рис. 1.9). Упомянутые регистры загружаются в
стек состояния в том порядке, в котором они перечислены. Если бит разрешения вложенных прерываний в ICNTL (см. п. 1.9.3) установлен, то регистр IMASK загружается новым значением.
Далее процессор выполняет команду NOP и одновременно читает из
памяти программ первую команду обработчика прерывания. После возврата из обработчика (с помощью команды RTI) стеки РС и статуса считываются и продолжается выполнение прерванной программы.
1.9.3. Конфигурирование прерываний.
Для конфигурирования прерываний используются следующие регистры:
 ICNTL – разрешает/запрещает вложенные прерывания, конфигурирует внешние запросы IRQ2#… IRQ0# как фронт- или уровеньчувствительные (см. п. П1.14);
 IMASK – индивидуально разрешает/запрещает (маскирует) все
запросы на прерывания как внешние, так и внутренние (см. п.
П1.15);
 IFC – программно формирует запрос на прерывание (форсирует
прерывание) или сбрасывает текущий фронт-чувствительный запрос (см. п. П1.16).
Запросы на прерывание IRQ2#… IRQ0# могут быть как фронтчувствительные, так и уровень-чувствительные, т.е. доступны для конфи-
гурирования через регистр ICNTL. Запрос IRQE# всегда фронт-чувствительный, IRQL1#, IRQL0# – уровень-чувствительные.
Фронт-чувствительные запросы всегда запоминаются во внутренних
триггерах процессора, когда формируется срез (переход из высокого
уровня в низкий) запроса. Запрос сохраняется до тех пор, пока не будет
обслужен. Он автоматически сбрасывается, когда происходит выход из
обработчика. Может быть программно сброшен раньше (внутри обработчика) с помощью регистра IFC. Фронт-чувствительные запросы требуют
меньшей аппаратуры для своего формирования чем уровеньчувствительные запросы.
Уровень-чувствительные запросы должны оставаться активными до
начала их обслуживания, после чего должны быть сброшены, чтобы исключить рекурсивный вызов обработчика. Достоинством таких запросов
является простота расширения числа источников запросов на прерывания.
Эти источники можно объединять с помощью логического элемента ИЛИ
для формирования одного запроса на прерывание. Уровень-чувствительные запросы не сохраняются внутри процессора.
Если вложенные прерывания запрещены, то после перехода на обработчик любого запроса все оставшиеся запросы маскируются. В противном случае разрешено прерывание обработчика с меньшим приоритетом
запросом на прерывание с большим приоритетом.
Работа с регистром ICNTL. Регистр ICNTL (см. п. П1.14) является
5-битным регистром, который конфигурирует внешние запросы на прерывания (IRQx#). После сброса процессора значение всех битов этого регистра не определено.
Биты ICNTL2…ICNTL0 содержат признак чувствительности запросов IRQ2#…IRQ0#. Причем, единица определяет чувствительность к
фронту, а нуль – к уровню. Бит ICNTL4 содержит признак разрешения(1)/запрета(0) вложенных прерываний. Изменения содержимого регистра ICNTL вступают в силу через один машинный цикл после завершения команды, которая эти изменения вызвала.
Работа с регистром IMASK. Каждый бит регистра IMASK (см. п.
П1.15) разрешает (если содержит 1) или запрещает (если содержит 0) соответствующий запрос на прерывание. После сброса процессора этот регистр обнулен. Изменения содержимого регистра IMASK вступают в силу
через один машинный цикл после завершения команды, которая эти изменения вызвала. Это не относится к автобуферизации последовательного
порта и ПДП передачам.
Замаскированные фронт-чувствительные запросы запоминаются, но
не обслуживаются. Они могут быть распознаны программой и обслужены
позднее. Содержимое регистра IMASK автоматически сохраняется в стеке
состояния при входе в обработчик прерывания и считывается при выходе
из обработчика. После сохранения содержимое регистра IMASK зависит
от состояния бита разрешения вложенных прерываний ICNTL4. Если
вложенный режим запрещен, то после сохранения регистр IMASK заполняется нулями, в противном случае нули появляются в битах, соответ-
ствующих запросам с приоритетом равным или меньшим чем обрабатываемый. Биты с большим приоритетом остаются без изменения. Это позволяет запросам с большим приоритетом, чем обслуживаемый, прерывать
выполнение программы.
Глобальное разрешение/запрещение прерываний. Глобально разрешить прерывания можно командой ENA INTS;, а запретить – DIS
INTS;. (INTS – седьмой бит регистра MSTAT, см. табл. 1.12). После сброса процессора все прерывания глобально разрешены. Глобальное запрещение прерываний вызывает маскирование всех запросов, включая powerdown, независимо от содержимого регистра IMASK.
Глобальное разрешение прерываний позволяет процессору обслуживать все незамаскированные запросы на прерывания. Глобальный запрет
прерываний не влияет на запрос от автобуферизации последовательного
порта.
Работа с регистром IFC. Сформировать фронт-чувствительный запрос на прерывание можно программно с помощью регистра IFC (см. п.
П1.16). Для этого необходимо установить бит формирования соответствующего запроса. Если установленный запрос не замаскирован, то он
будет обслуживаться, как если бы был внешним.
С помощью регистра IFC может быть также сброшен запрос незавершенного прерывания (при завершении прерывания бит запроса сбрасывается автоматически). Для этого необходимо установить соответствующий бит очистки запроса прерывания. Изменения содержимого только
для записи регистра IFC вступают в силу через один машинный цикл после завершения команды, которая эти изменения вызвала.
Временные задержки. Для запросов на прерывания от таймера,
IRQx#, и SPORT задержка между моментом времени появления запроса и
выполнением первой команды обработчика составляет три машинных
цикла.
1.10. Регистры состояния и стек состояния
Состояние процессора и биты режима его работы сохраняются в
следующих внутренних регистрах (регистрах состояний STATUS REGISTERS, см. рис. 1.9), которые могут быть считаны и записаны через DMD
шину:
 ASTAT – регистр арифметического статуса;
 SSTAT – регистр статуса стека (только для чтения);
 MSTAT – регистр статуса режима;
 ICNTL – регистр управления прерываниями;
 IMASK – регистр масок прерываний;
 IFC – регистр установки/сброса прерываний (только для записи).
Три последних регистра подробно рассмотрены в п. 1.9.3, ниже рассматривается формат трех первых регистров из приведенного списка.
Регистр арифметического статуса (ASTAT). Формат регистра приведен в табл. 1.9.
Таблица 1.9
Формат регистра ASTAT
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
SS
MV
AQ
AS
AC
AV
AN
AZ
Примечание: в табл. 1.9 использованы следующие обозначения – AZ
– нулевой результат ALU, AN – отрицательный результат ALU, AV – переполнение ALU, AC – перенос ALU, AS – знак Х входа ALU, AQ – частное ALU, MV – переполнение МАС, SS – знак входа SHIFTER.
Для битов (флагов) AZ, AN, AV, AC и MV признаком выполнения
соответствующего условия является наличие 1, в противном случае флаг
хранит нулевое значение. В табл. 1.9 приведено содержимое регистра после сброса процессора.
На состояние битов регистра ASTAT влияют не все команды, а только те, которые приведены в табл. 1.10.
Таблица 1.10
Команды, влияющие на биты регистра ASTAT
Бит состояния
Устанавливается
AZ, AN, AV, AC
Любой командой ALU кроме DIVS, DIVQ
AS
Командой ALU – ABS
AQ
Командами ALU – DIVS, DIVQ
MV
Любой командой МАС кроме команды насыщения
MR – SAT MR
SS
Командой SHIFTER – EXP
Биты состояния защелкиваются в ASTAT в конце текущего машинного цикла и не могут использоваться до следующего машинного цикла.
Загрузка входных и выходных регистров ALU, MAC и SHIFTER
прямо с DMD шины не влияет на биты арифметического состояния. Выполнение команды ALU – PASS устанавливает биты AZ, AN для заданных X- или Y-операндов и сбрасывает флаг АС.
Регистр статуса стека (SSTAT). Формат регистра приведен в табл.
1.11.
Таблица 1.11
Формат регистра SSTAT
7
6
5
4
3
2
1
0
0
1
0
1
0
1
0
1
LSO
LSE
SSO
SSE
CSO
CSE
PCO
PCE
Примечание: в табл. 1.11 использованы следующие обозначения –
PCE – РС стек пуст, РСО – РС стек переполнен, CSE – стек счетчика пуст,
CSO – стек счетчика переполнен, SSE – стек состояния пуст, SSO – стек
состояния переполнен, LSE – стек циклов пуст, LSO – стек циклов переполнен.
Для всех битов признаком выполнения соответствующего условия
является наличие 1, в противном случае бит хранит нулевое значение. В
табл. 1.11 приведено содержимое регистра после сброса процессора.
Пустое состояние соответствующего стека означает, что число считываний со стека больше или равно числу записей в стек, случившихся
после сброса процессора. Состояние переполнения соответствующего
стека означает, что число записей в стек больше числа считывания со стека на величину глубины стека. Когда это случается, последнее записываемое значение не помещается в стек. Находящиеся в стеке значения считаются более значимыми.
После установки бита переполнения первая последующая операция
считывания со стека не выполняется. Возможна ситуация, когда установлены и бит переполнения, и бит пустого стека. Для примера предположим, что в стек счетчика (глубиной четыре слова) произведено пять последовательных записей. Это установит бит переполнения. Если затем
произвести пять последовательных считываний, то бит пустоты стека
установится, но бит переполнения не сбросится, поскольку это можно
сделать только сбросом процессора.
Регистр статуса режима (MSTAT). Содержимое регистра определяет режим работы процессора. Формат регистра приведен в табл. 1.12.
Таблица 1.12
Формат регистра MSTAT
7
6
5
4
3
2
1
0
1
0
0
0
0
0
0
0
INTS
GME
TE
MRP
SME
OLME RME
DRBS
Примечание: в табл. 1.12 использованы следующие обозначения –
DRBS (Data Register Bank Select) – выбор банка регистров данных, RME
(Reverse Mode Enable) – разрешение режима реверса битов в DAG1,
OLME (ALU Overflow Latch Mode Enable) – разрешение режима защелки
бита переполнения ALU, SME (AR Saturation Mode Enable) – разрешение
режима насыщения регистра AR, MRP (MAC Result Placement) – размещение результата МАС, TE (Timer Enable) – разрешение (запуск) таймера,
GME (Go Mode Enable) – разрешение режима GO, INTS – бит глобального
разрешения/запрета прерываний процессора (см. п. 1.9.3).
Как и любой другой регистр, допускающий запись, MSTAT может
быть модифицирован пересылочной командой MOVE (оператором присвоения). Но в отличие от других регистров, биты регистра MSTAT могут
быть изменены командами управления режимом работы процессора (ENA
и DIS, см. п. 1.17.10.Б).
Например, чтобы разрешить режим реверса битов в DAG1, достаточно дать команду ENA BIT_REV;. Эта команда будет производить реверс битов адреса, который формирует DAG1, что используется при выполнении быстрого преобразования Фурье (БПФ). Отменить режим реверса можно командой DIS BIT_REV;.
Бит DRBS регистра MSTAT позволяет выбрать первичный набор
(при DRBS = 0) регистров данных вычислительных устройств (см. пп.
1.5…1.7) или – вторичный набор (при DRBS = 1) регистров данных вычислительных устройств. Переключение на вторичный набор осуществляет команда ENA SEC_REG;, возврат первичного набора осуществляет команда DIS SEC_REG;.
Бит OLME регистра MSTAT позволяет (если установлен) заморозить бит переполнения ALU AV, если таковое случилось. Бит AV будет
при этом установлен даже, если последующие арифметические операции
не будут генерировать переполнения. Сбросить бит AV можно только записью нуля в бит 2 регистра ASTAT (см. табл. 1.9). Установка бита OLME
производится командой ENA AV_LATCH;, сброс – командой DIS
AV_LATCH;.
Бит SME регистра MSTAT позволяет (если установлен) производить
насыщение регистра результата ALU AR, т.е. при наличии переполнения
записывать в AR максимально положительное число (0х7FFF) или максимально отрицательное число (0х8000). Установка бита SME производится
командой ENA AR_SAT;, сброс – командой DIS AR_SAT;.
Бит MRP регистра MSTAT определяет режим работы МАС: целый
или дробный (см. п. 1.10). В целом режиме код на выходе Р умножителя
(см. рис. 1.7) складывается (вычитается) с содержимым MR без сдвига. В
дробном режиме код на выходе Р умножителя (см. рис. 1.7) складывается
(вычитается) с содержимым MR со сдвигом на один разряд влево (при
этом в самый правый разряд сдвинутого кода записывается ноль). Установка бита MRP (целый режим) производится командой ENA M_MODE;,
сброс (дробный режим) – командой DIS M_MODE;.
Установка бита TE (командой ENA TIMER;) запускает таймер (на
декрементирование), очистка (сброс) бита ТЕ (командой DIS TIMER;)
останавливает таймер.
Установка бита GME (командой ENA G_MODE;) переводит процессор в режим GO, что позволяет ему в режиме захвата выполнять программу, находящуюся во внутренней ПП. В такой ситуации его может
остановить только потребность во внешней шине (занятой в режиме захвата альтернативным задатчиком магистрали). Если режим GO запретить
(например, командой DIS G_MODE;), то в режиме захвата процессор не
будет выполнять программу, а произведет останов до выхода из режима
захвата.
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, а для модификации регистров I4I7 – любой из регистров М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);
Средства разработки программного обеспечения процессора ADSP2181 [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.
1.11.2. Узел обмена данными
Узел BUS EXCH позволяет производить обмен данными в обоих
направлениях между PMD и DMD шинами. Поскольку ширина PMD шины составляет 24 линии, а ширина DMD шины составляет 16 линий, то
прямо передаются только старшие 16 бит PMD шины. Младшие 8 бит за-
писываются (или считываются) в (из) внутренний регистр РХ узла BUS
EXCH.
При одновременном считывании данных из ПП и ПД, которое используется в некоторых командах, 16 старших бит данных из ПП считываются в Y-регистры вычислительных устройств минуя узел BUS EXCH.
Внутренний РХ регистр используется при пересылках в обоих
направлениях между ПП и любым регистром. Пример прямой пересылки:
АХ0 = РМ(I4, M4);
Здесь старшие 16 бит содержимого ячейки ПП, на которую указывает I4, загружаются в регистр АХ0, а младшие 8 бит загружаются в регистр
РХ. В примере используется индексный регистр I4, поскольку только индексные регистры DAG2 (см. п. 1.11.1) могут адресовать ПП.
Пример обратной пересылки:
РМ(I4, M4) = АХ0;
Здесь содержимое регистра АХ0 сохраняется в старших 16 битах содержимого ячейки ПП, на которую указывает I4, а младшие 8 бит загружаются из регистра РХ.
Регистр РХ также может загружаться (считываться) с (на) DMD шины, когда в пересылочной команде точно указан как регистр-назначение.
Пример загрузки:
РХ = АХ0;
Здесь содержимое младших 8 бит регистра АХ0 загружается в регистр РХ. Такая загрузка должна производится перед записью в ПП 24битных данных.
Пример считывания:
АХ0 = РХ;
Здесь содержимое регистра РХ записывается в 8 младших бит регистра АХ0.
1.12. Последовательные порты
1.12.1. Общие сведения
Синхронные последовательные порты SPORT0, SPORT1 (см. рис.
1.3) поддерживают множество протоколов передачи данных и могут использоваться для связи процессоров в многопроцессорной вычислительной системе. Структурная схема SPORTn (n = 0, 1) представлена на рис.
1.10.
На рис. 1.10 сделаны следующие обозначения: SCLK (Serial CLocK)
– сигнал синхронизации; RFS (Receive Frame Synchronization) – синхросигнал принимаемого фрейма; TFS (Transmit Frame Synchronization) –
синхросигнал передаваемого фрейма; DR (Serial Data Receive) – принимаемые данные; DT (Serial Data Transmit) – передаваемые данные.
Последовательный порт передает данные через DT, а принимает –
через DR. Прием и передача может происходить одновременно, что поддерживает режим полного дуплекса. Передаваемые (принимаемые) биты
синхронизируются сигналом SCLK, который может выходным, если его
генерирует сам порт, или входным, если его генерирует внешний генератор. Сигналы фреймовой синхронизации RFS, TFS отмечают начало передаваемого слова или потока последовательных слов.
Из рис. 1.10 видно, что для передачи слова в последовательный канал связи достаточно записать его (через DMD шину) в регистр ТХ. Из
него оно загружается в сдвиговый регистр передачи и затем побитно
(старшими разрядами вперед) выдается на линию DT. Выдача каждого
бита синхронизируется сигналами SCLK.
DMD
16
16
16
TXn
Регистр передаваемых данных
Узел
сжатия данных
16
RXn
Регистр принимаемых данных
16
Сдвиговый
регистр передачи
Узел
управления
Сдвиговый
регистр приема
G
DT
TFS SCLK
RFS
DR
Рис. 1.10. Структурная схема SPORTn
Принимаемые данные поступают с линии DR в сдвиговый регистр
приема. После приема целого слова оно автоматически загружаются в регистр RX откуда через DMD шину может быть считано процессором.
Прием каждого бита также синхронизируется сигналами SCLK. И принимаемые, и выдаваемые данные могут быть подвергнуты сжатию с помощью узла сжатия данных.
Последовательные порты процессора имеют следующие особенности:
 Двунаправленность: каждый SPORT имеет независимые блоки приема
и передачи;
 Двойная буферизация: блоки приема и передачи SPORT имеют регистры для связи с внутренними ресурсами процессора (регистры принимаемых и передаваемых данных соответственно) и сдвиговые регистры, поддерживающие связь с внешними устройствами микропроцессорной системы. Двойная буферизация позволяет уменьшить время
обслуживания порта со стороны процессора;
 Синхронизация: каждый SPORT может использовать внешний сигнал
синхронизации или генерировать свой собственный в широком диапазоне частот вплоть до 0 Гц (см. п. 1.12.2);
 Длина слова: каждый SPORT поддерживает обмен словами длиной от
трех до шестнадцати бит (см. п. 1.12.2);
 Фреймовая синхронизация: каждый SPORT поддерживает обмен данными как с фреймовой синхронизацией (см. п. 1.12.2) каждого слова,
так и без нее. Фреймовые сигналы могут генерироваться как самим
портом, так и внешними устройствами. Активный уровень фреймовых
сигналов (низкий/высокий) может устанавливаться программно;
 Аппаратное уплотнение данных: каждый SPORT может производить
уплотнение данных по А- и -законам (см. узел уплотнения данных на
рис. 1.10) в соответствии с рекомендациями G.711 CCITT (см. п.
1.12.4);
 Автобуферизация: используя DAG1, DAG2, каждый SPORT может автоматически принимать/передавать целый кольцевой буфер данных с
одним циклом перевода указателя на начало буфера (см. п. 1.12.5).
Передача данных из буфера в порт и обратно происходит автоматически без вмешательства программы;
 Прерывания: блоки приема и передачи каждого SPORT генерируют
запросы на прерывания после выполнения приема/передачи как слова,
так и целого буфера (см. п. 1.9);
 Многоканальность: SPORT0 может получать/передавать данные избирательно от 24 или 32 каналов последовательного потока битов в режиме временного мультиплексирования. Это особенно полезно для
поддержки Т1 интерфейса или локальной сети процессоров;
 Многофункциональность: вместо последовательного порта SPORT1
может быть сконфигурирован на прием двух запросов на прерывания
IRQ0# и IRQ1#, а также прием сигнала FlagIn и выдачу сигнала FlagOut. Единственный не конфигурируемый сигнал – это синхросигнал.
После приема или передачи слова данных последовательные порты
формируют запросы на прерывания, перечень которых и приоритеты приведены в табл. 1.8.
Для передачи данного через последовательный порт достаточно записать его в регистр ТХ. После этого активизируется фреймовый сигнал
TFS и содержимое регистра ТХ перезаписывается в сдвиговый регистр
передачи (см. рис. 1.10). Сдвиговый регистр передачи последовательно
выталкивает выдаваемое слово бит за битом в канал связи, начиная с самого старшего бита. Выдача очередного бита происходит по фронту сигнала SCLK.
После выдачи самого старшего бита SPORT генерирует запрос на
прерывание по передаче. Регистр ТХ является доступным, хотя передача
слова еще не завершилась.
Блок приема данных принимает из канала связи последовательные
биты в сдвиговом регистре приема (см. рис. 1.10). После приема целого
слова оно перезаписывается в регистр RX и формируется запрос на прерывание по приему.
1.12.2. Программирование SPORT
Для программиста SPORT представляется двумя группами регистров: конфигурационными и данных. Конфигурационные регистры располагаются в ПД и служат для задания режима работы SPORT. Перед
первым использованием порта они должны быть обязательно проинициализированы. Регистры данных (RX и TX) используются для приема/передачи данных через порт.
Адреса и функциональное назначение конфигурационных регистров
приведены в табл. 1.13.
Таблица 1.13
Функциональное назначение конфигурационных регистров
Адрес
Назначение
0x3FFA Разрешение многоканального приема слова SPORT0 (31-16)
0x3FF9
Разрешение многоканального приема слова SPORT0 (15-0)
0x3FF8
Разрешение многоканальной передачи слова SPORT0 (31-16)
0x3FF7
Разрешение многоканальной передачи слова SPORT0 (15-0)
0x3FF6
Регистр управления SPORT0: управление многоканальным
режимом, выбор источника битовой синхронизации, управление фреймовой синхронизацией, выбор длины слова данных
0x3FF5
Делитель частоты битовой синхронизации SPORT0
0x3FF4
Делитель частоты приемного фрейма SPORT0
0x3FF3
Регистр управления автобуферизацией SPORT0
0x3FF2
Регистр управления SPORT1: значение выходного флага, выбор источника битовой синхронизации, управление фреймовой
синхронизацией, режим сжатия данных, выбор длины слова
данных
0x3FF1
Делитель частоты битовой синхронизации SPORT1
0x3FF0
Делитель частоты приемного фрейма SPORT1
0x3FЕF
Регистр управления автобуферизацией SPORT1
Работа с регистрами данных проста. Например, для выдачи содержимого регистра АХ0 через SPORT1 достаточно написать ТХ1 = АХ0;. А
для считывания принятых данных из SPORT0 – AY0 = RX0;. Обычно эта
пересылка осуществляется в обработчике прерывания по приему последовательного порта.
Перед первым использованием последовательных портов кроме регистров, упомянутых в табл. 1.13, необходимо проинициализировать биты
12-10 регистра управления системой System Control Register (см. п.
П1.1), расположенного по адресу 0x3FFF. Бит 12 разрешает работу
SPORT0, а бит 11 – SPORT1, если они установлены. После сброса процессора эти биты обнулены, поэтому для работы с соответствующими последовательными портами они должны быть программно установлены.
Бит 10 регистра управления системой определяет конфигурацию
SPORT1. Если бит 10 установлен, то SPORT1 работает в режиме последовательного порта, в противном случае – в альтернативном режиме в соответствии с табл. 1.14.
Таблица 1.14.
Альтернативная конфигурация SPORT1
Имя контакта
Альтернативное имя
Альтернативная функция
RFS1
IRQ0#
Внешнее прерывание 0
TFS1
IRQ1#
Внешнее прерывание 1
DR1
FI
Входной флаг
DT1
FO
Выходной флаг
SCLK1
SCLK1
Та же самая
Источник битовой синхронизации (внутренний или внешний)
SPORT0 и SPORT1 может быть выбран с помощью бита 14 (ISCLK) регистров управления соответственно SPORT0 и SPORT1 (см. пп. П1.4,
П1.6).
Если бит ISCLK установлен, то процессор генерирует собственный
сигнал SCLK, в противном случае – использует внешний сигнал SCLK.
Очевидно, что выход SCLK двунаправленный. После сброса процессора
ISCLK = 0, поэтому после сброса процессора оба порта работают в режиме внешнего сигнала SCLK.
Частота внешнего сигнала битовой синхронизации может иметь значение до Fclkout, где Fclkout – частота синхронизации процессора (частота сигнала на выходе CLKOUT (см. рис. 1.1) процессора). Частота внутреннего сигнала битовой синхронизации не может иметь значение более
Fclkout/2 и устанавливается с помощью регистров SCLKDIV (0x3FF5 для
SPORT0 и 0x3FF1 для SPORT1, см. табл. 1.13):
Fsclk = Fclkout / (2 * (SCLKDIV + 1))
(1.1)
где: Fsclk - частота битовой синхронизации (частота сигнала на выходе
SCLK процессора), SCLKDIV - содержимое соответствующих регистров.
Формула (1.1) позволяет определить делитель частоты SCLKDIV для
достижения необходимой скорости обмена данными (частоты битовой
синхронизации). Например, максимальная частота обмена имеет место
при SCLKDIV = 0 и равна Fclkout/2. Формула (1.1) справедлива и для
случая, когда SPORT1 используется в альтернативном режиме, поскольку
функция выхода SCLK1 при этом не изменяется (см. табл. 1.14).
Длину посылки можно устанавливать независимо для каждого последовательного порта с помощь битовых полей SLEN (Serial Length –
длина последовательных данных) регистров управления SPORT0 и
SPORT1 (см. пп. П1.4, П1.6). Битовые поля SLEN занимают биты 3-0 соответствующих регистров управления.
Поля занимают четыре бита, поэтому можно задать длину посылки в
пределах 16-3 битов. Если длина посылки меньше 16 бит, то посылка располагается в младших битах регистров данных последовательных портов.
Фреймовая синхронизация используется для обозначения начала
каждого передаваемого слова. Последовательные порты множеством способов и независимо (при приеме и передаче) могут управлять сигналами
фреймовой синхронизации. Все фреймовые сигналы изменяют состояния
по срезу импульсов битовой синхронизации (SCLK).
Тип фреймовой синхронизации определяется битами 13 (RFSR) и 11
(TFSR) регистров управления портами (см. пп. П1.4, П1.6). Если RFSR =
0, то RFS требуется только для первого слова фрейма данных (фреймовая
при приеме синхронизация отсутствует), в противном случае RFS требуется для каждого слова фрейма данных. Если TFSR = 0, то TFS требуется
только для первого слова фрейма данных (фреймовая синхронизация пр
передаче отсутствует), в противном случае TFS требуется для каждого
слова фрейма данных.
После сброса процессора RFSR = 0 и TFSR = 0, поэтому связь в обоих направлениях осуществляется без фреймовой синхронизации. Для ее
инициализации необходимо программно установить биты RFSR и/или
TFSR.
Источник фреймовой синхронизации определяется битами 9 (ITFS)
и 8 (IRFS) регистров управления портами (см. пп. П1.4, П1.6). Если ITFS
= 0, то используется внешний сигнал TFS, в противном случае сигнал TFS
является внутренним. Если IRFS = 0, то используется внешний сигнал
RFS, в противном случае сигнал RFS является внутренним.
Если используются внешние фреймовые сигналы, то RFS и TFS являются входами и внешнее устройство управляет передачей и приемом
данных. Для порта это означает, что перед выдачей в канал данных он
должен дождаться сигнала TFS, а перед приемом – сигнала RFS.
Если фреймовые сигналы формируются портом, то RFS и TFS являются выходами и временные параметры обмена определяются процессором. В этом случае сигнал TFS формируется при загрузке любого регистра передаваемых данных ТХ0 или ТХ1. Сигнал RFS формируется периодически в соответствии с содержимым регистра делителя частоты приемного фрейма RFSDIV (0x3FF4 для SPORT0 и 0x3FF0 для SPORT1, см.
табл. 1.13).
Содержимое RFSDIV трактуется портом как число импульсов SCLK
(уменьшенное на единицу), между двумя импульсами RFS. Например, для
того чтобы импульс RFS выдавался на каждый 256-ой импульс SCLK
необходимо в RFSDIV записать число 255. Значение RFSDIV + 1 не
должно быть меньше SLEN. После получения импульса RFS внешнее
устройство должно выдать слово данных.
Следует отметить, что фреймовые сигналы формируются даже тогда,
когда сигнал SCLK является внешним. Это дает возможность для различных применений делить частоту входной синхропоследовательности.
Кроме этого, для обеспечения одновременной передачи и приема данных
можно использовать один фреймовый сигнал. Для этого необходимо подать выходной сигнал RFS на вход TFS, запрограммированный на прием
внешнего сигнала синхронизации.
Последовательные порты могут работать в нормальном или альтернативном фреймовых режимах. В нормальном режиме фреймовый
сигнал проверяется на срезе SCLK. Если фреймовый сигнал распознан, то
принимаемые данные защелкиваются на срезе SCLK, начиная со следующего импульса, а выдаваемые данные появляются после фронта SCLK,
также начиная со следующего импульса. Далее фреймовые сигналы не
проверяются до полного приема или полной передачи слова данных. Если
передача/прием слов непрерывны, т.е. за последним битом предыдущего
слова следует первый бит следующего слова, то фреймовый сигнал формируется во время передачи последнего бита предыдущего слова.
В альтернативном режиме фреймовый сигнал активизируется при
передаче первого бита текущего слова. Принимаемые биты защелкиваются на срезе SCLK, а выдаваемые - появляются после фронта SCLK. Внутренний сигнал фрейма остается активным до конца передачи текущего
слова. Внешний сигнал фрейма проверяется только во время первого бита.
Выбор фреймового режима определяется значениями битов ширины
фреймовых сигналов – RFSW (RFS Width - ширина RFS) и TFSW (TFS
Width – ширина TFS). RFSW располагается в бите 12, а TFSW – в бите 10
регистров управления портами (см. пп. П1.4, П1.6). Причем нулевое значение этих битов определяет нормальный режим, а единичное – альтернативный. После сброса процессора все эти биты обнулены, что создает
нормальный фреймовый режим для приема и передачи.
Программно можно также выбрать уровни активности фреймовых
сигналов. Для этого необходимо определить биты инверсии фреймовых
сигналов – INVTFS (INVerse TFS) и INVRFS (INVerse RFS). INVTFS
располагается в бите 7, а INVRFS – в бите 6 регистров управления портами (см. пп. П1.4, П1.6). Причем нулевое значение этих битов определяет
высокий уровень активных фреймовых сигналов, а единичное – низкий.
После сброса процессора все эти биты обнулены, что устанавливает высокий уровень активных фреймовых сигналов.
1.12.3. Пример конфигурирования последовательных портов
Ниже приводится пример конфигурирования портов SPORT0 и
SPORT1. SPORT0 генерирует сигналы битовой синхронизации (SCLK),
сигналы фреймовой синхронизации, а также сжимает данные по –
закону. Это типичный пример установок для связи с комбинированным
кодеком.
SPORT1 использует внешнюю битовую синхронизацию, внешнюю
фреймовую синхронизацию, отсутствие сжатия 16-битных данных и автобуферизацию. Это типичный пример установок для связи с другими
процессорами многопроцессорной системы.
В примере инициализируются только самые необходимые конфигурационные регистры. Инициализация производится перед разрешением
последовательных портов. Кроме этого, перед разрешением прерываний
необходимо сбросить все внешние запросы на прерывания от последовательных портов.
{ПРОГРАММА ИНИЦИАЛИЗАЦИИ SPORT0, SPORT1}
{Сначала инициализируем SPORT1}
AX0 = 0x0017;
DM(0x3FEF) = AX0; {разрешение автобуферизации}
{авто буфер ТХ использует I0 и M0}
{авто буфер RХ использует I1 и M1}
AX0 = 0x280F;
DM(0x3FF2) = AX0; {внешние SCLK, RFS и TFS}
{ RFS и TFS требуются, нормальный фреймовый}
{режим, отсутствие сжатия, 16 бит}
{Далее инициализируем SPORT0}
{Предполагаем, что Fclkin = 12.288 МГц}
AX0 = 255;
DM(0x3FF4) = AX0; {RFSDIV + 1 = 256, частота фреймовой}
{cинхронизации = 8 КГц}
AX0 = 2;
DM(0x3FF5) = AX0; {SCLKDIV + 1 = 3, частота битовой}
{cинхронизации = 2.048 МГц}
AX0 = 0x6B27;
DM(0x3FF2) = AX0; {внутренние SCLK, RFS и TFS}
{ RFS и TFS требуются, нормальный фреймовый}
{режим, сжатие по -закону, 8 бит}
{И, наконец, разрешаем работу портов и прерывания}
IFC = 0x1E;
{очищаем все SPORT запросы на прерывания}
ICNTL = 0;
{запрещаем вложенные прерывания}
AX0 = 0x1C1F;
{разрешаем оба SPORT, BWAIT и PWAIT}
DM(0x3FFF) = AX0; {оставляем по умолчанию}
IMASK = 0x1E;
{разрешаем все прерывания SPORT}
1.12.4. Сжатие данных
Сжатие данных или в более широком смысле компандинг (от COMpressing и exPANDing – сжатие и расширение данных) – это процесс логарифмического кодирования и декодирования данных с целью уменьшения
числа передаваемых битов. Процессор содержит один узел сжатия данных (см. рис. 1.10) на два порта, который за один машинный цикл может
произвести одно сжатие или одно расширение данных. При наличии коллизий приоритет имеет SPORT0.
Процессор поддерживает два наиболее широко распространенных
алгоритма сжатия: А и . Компандинг производится в соответствии с протоколом G.711, рекомендованного CCITT. Тип компандинга может выбран независимо для каждого порта с помощью битов 5 и 4 (битовое поле
DTYPE) в регистрах управления портами (см. пп. П1.4, П1.6). Так код 11
в этих битах устанавливает алгоритм сжатия А, а код 10 – алгоритм сжатия .
Оставшиеся комбинации кода в этих битах определяют формат полученных данных длиною меньше 16 бит при отключенном компандинге.
Так комбинация 01 определяет правое выравнивание и заполнение старших битов знаковым битом переданного слова, а комбинация 00 – правое
выравнивание и заполнение старших битов нулем.
Если компандинг включен, то в регистрах RX0, RX1 находится значение с правым выравниваем и распространенным знаковым битом –
расширенное из восьми принятых битов. Подобно этому запись в регистры ТХ0, ТХ1 вызывает сжатие 16-битного числа в восьми битное с правым выравниванием и распространением знака. Сжатие происходит перед
перезаписью числа из регистра передаваемых данных в сдвиговый регистр передачи (см. рис. 1.10). Если абсолютное значение передаваемого
числа выходит за пределы 13 бит для алгоритма А или 14 бит для алгоритма , то такое число автоматически сжимается до максимального положительного или отрицательного значения.
1.12.5. Автобуферизация
В обычных условиях SPORT формирует запрос на прерывание, когда
он получил или начал выдавать слово данных. Автобуферизация обеспечивает механизм приема/передачи целого блока последовательных данных прежде чем сформируется запрос на прерывание. Это уменьшает частоту прерываний, что ведет к увеличению производительности системы.
Автобуферизация использует способность DAG1, DAG2 поддерживать адресацию кольцевых буферов. При передаче слово данных из кольцевого буфера (по указателю, содержащегося в одном из индексных регистров Ix) пересылается в регистр ТХ0 или ТХ1, из которых передается в
канал связи. После выполнения пересылки индексный регистр Ix модифицируется с помощью соответствующего регистра модификации Мх,
как и при обычных пересылках. Каждая передача слова данных в канал
связи не формирует запроса на прерывание. Такой запрос формируется
только после записи в ТХ0 или ТХ1 последнего слова данных кольцевого
буфера, когда в индексном регистре формируется адрес первого слова
кольцевого буфера.
При приеме данных из канала связи принятое слово записывается в
кольцевой буфер по указателю, содержащегося в одном из индексных регистров Ix. После выполнения пересылки индексный регистр Ix модифицируется с помощью соответствующего регистра модификации Мх, как и
при обычных пересылках. Запрос на прерывание формируется после при-
ема в кольцевой буфер последнего слова данных, когда в индексном регистре формируется адрес первого слова кольцевого буфера.
Режим автобуферизации может быть независимо разрешен для приема и передачи с помощью регистров управления автобуферизацией (см.
пп. П1.3, П1.5).
Номера xIREG в регистрах управления автобуферизацией могут
быть в диапазоне 0-3 для DAG1 и в диапазоне 4-7 для DAG2. Номера
xMREG (там же) могут быть любыми в диапазоне 0-3. Предполагается,
что они принадлежат тому DAGx, в котором определен соответствующий
xIREG.
После сброса процессора (а также после очередной загрузки программы) биты TBUF, RBUF обнуляются, что соответствует запрещению
автобуферизации.
1.12.6. Пример программирования автобуферизации
Программа конфигурирует SPORT1 на выполнение операций с автобуферизацией. Предполагается, что Fclkin = 12.288 МГц. SPORT1 будет
автоматически передавать данные из кольцевого буфера с именем tx_buffer. Он также будет принимать данные из канала связи и автоматически
записывать их в кольцевой буфер с именем rx_buffer.
Запрос на прерывание по передаче будет сформирован после передачи всех данных буфера tx_buffer в регистр ТХ1, но перед перезаписью последнего данного в сдвиговый регистр передачи. Запрос на прерывание по
приему будет сформирован после заполнения буфера rx_buffer.
.MODULE/RAM code_to_init_Auto_Buff_SPORT1;
{Объявление переменных и точки входа в программу}
.VAR /DM/CIRC tx_buffer[10];
.VAR /DM/CIRC rx_buffer[10];
.ENTRY
sport1_inits;
{Инициализация I, M и L регистров}
sport1_inits: I0 = ^tx_buffer; {I0 содержит начальный адрес tx_buffer}
M0 = 1;
{используем каждый адрес буферов}
L0 = %tx_buffer; {L0 содержит длину буфера tx_buffer}
I1 = ^rx_buffer; {I1 содержит начальный адрес rx_buffer}
L1 = %rx_buffer; {L1 содержит длину буфера rx_buffer}
{Инициализация SPORT1 на автобуферизацию}
AX0 = 0x0013; {ТХ использ. I0, M0; RX использ. I1, M0}
DM(0x3FEF) = AX0; {автобуферизация разрешена}
{Инициализация SPORT1 на Frfs = 8 КГц, Fsclk = 2.048 МГц}
AX0 = 255;
{RFSDIV = 255 для Frfs = 8 КГц}
DM(0x3FF0) = AX0;
AX0 = 2;
{SCLKDIV = 2 для Fsclk = 2.048 МГц}
DM(0x3FF5) = AX0;
{Разрешение в SPORT1 нормального фрейминга и внутреннего SCLK}
AX0 = 0x6B27; {нормальный фрейминг, 8-бит -закон}
DM(0x3FF2) = AX0; {внутренняя байтовая синхронизация }
{Инициализация прерываний}
IFC = 6;
{очистка всех внешних SPORT запросов}
ICNTL = 0;
{запрет вложенных прерываний}
IMASK = 6;
{разрешение прерываний от SPORT1}
{Передача первого слова данных в ТХ1}
AX0 = DM(0xI0, M0);
TX1 = AX0;
RTS;
.ENDMOD;
1.12.7. Многоканальность
SPORT0 поддерживает многоканальность. Это означает, что к
SPORT0 ведущего процессора можно подключить до 32-х SPORT0 ведомых процессоров. Очевидно, что передача данных в этом случае может
осуществляться только в режиме временного мультиплексирования, т.е. в
текущий промежуток времени канал связи может занимать только один из
ведомых процессоров. Возможность подключения выходов DT0 всех ведомых процессоров к входу DR0 ведущего процессора (исключение конфликта) обеспечивается тем, что выходы DT имеют третье состояние, которое снимается только на время выдачи данных.
В одноканальном режиме сигналы RFS0 и TFS0 обеспечивают начало передачи/приема единственного слова или потока слов от одного источника (см. п. 1.12.2). При этом передача и прием происходят независимо друг от друга. В многоканальном режиме сигнал RFS0 (выводы RFS0
ведущего процессора и всех ведомых процессоров объединены) определяет начало передачи блока из 24 или 32 слов от каждого из ведомых
процессоров, при этом операции приема/передачи протекают параллельно. Функции сигнала TFS0 описываются ниже.
Многоканальные операции разрешаются установкой бита 15 (МСЕ)
в регистре управления SPORT0 (0x3FF6, см. п. П1.4). Это также переопределит назначение некоторых битов этого регистра. В частности бит
9 становится битом, который определяет длину блока данных в многоканальном режиме (MCL). Если MCL = 0, то блок данных содержит 24 слова (канала), в противном случае (MCL = 1) блок данных содержит 32 сло-
ва. Длина слов, как и прежде, определяется полем SLEN регистра управления SPORT0 и может изменяться от 3 до 16 бит.
Биты 13…10 регистра управления SPORT0 в многоканальном режиме определяют значение многоканальной задержки фрейма (MFD =
0…15). Значение MFD определяет задержку (в импульсах сигнала
SCLK0) появления первого бита первого передаваемого слова блока данных из 24 или 32 слов после выдачи сигнала RFS0 ведущим процессором.
Для конфигурирования SPORT0 в многоканальном режиме используются также регистры разрешения приема блока данных Receive Word
Enables (RWE, 0x3FF9 - младший регистр и 0x3FFA - старший регистр) и
разрешения передачи блока данных Transmit Word Enables (TWE, 0x3FF7
- младший регистр и 0x3FF8 - старший регистр). Единица в любом бите
этих регистров разрешает прием/передачу соответствующего канала, ноль
– запрещает.
Принимаемые слова от запрещенных каналов игнорируются приемником – они не записываются в регистр RX0, не формируются запросы на
прерывания по приему и автобуферизации. При передаче запрещенного
канала (выход DT находится в третьем состоянии) также не формируются
запросы на прерывания по передаче и автобуферизации.
Для приема данных от двух ведомых процессоров во все биты регистра RWE ведущего процессора необходимо записать единицы, в регистры TWE первого ведомого процессора необходимо записать единицы
во все четные биты, а во втором ведомом процессоре – во все нечетные
биты.
Функционирование SPORT0 в многоканальном режиме во многих
отношениях совпадает с функционированием в одноканальном режиме
(см. пп. 1.12.1…1.12.6). В частности, это относится к длине передаваемых/принимаемых слов (SLEN), внутреннему и внешнему фреймингу
(IRFS), инверсии фреймовых сигналов (INVRFS), компандингу (DTYPE)
и автобуферизации. Следует только помнить, что сигнал RFS формируется один раз для всего блока данных.
Сигнал TFS0 имеет функции подтверждения действительности передаваемых данных (TDV) и активизируется только на промежуток времени
передачи данных разрешенного канала. Уровень активности определяется
битом 7 регистра управления SPORT0 (в многоканальном режиме он
называется INVTDV), если INVTDV = 0, то уровень TDV высокий, в противном случае – низкий. Сигналы TDV обычно используются внешними
узлами процессоров (или совсем не используются).
1.13. Таймер
Программируемый интервальный таймер (рис. 1.11) позволяет генерировать запросы на прерывания с периодом кратным длительности машинного цикла. Период запросов может программно задаваться в широком диапазоне значений.
Таймер содержит два 16-битных регистра TCOUNT, TPERIOD и
один 8-битный регистр TSCALE. Команда управления расширенным режимом (см. п. 1.17.10.б) может разрешить или запретить работу таймера
установкой или сбросом бита 5 регистра MSTAT. Регистр TCOUNT является счетчиком. Если таймер разрешен, то счетчик декрементируется с
частотой вплоть до CLKOUT. Когда содержимое счетчика достигает нуля,
то формируется запрос на прерывание, а счетчик перегружается из регистра TPERIOD и счет начинается снова.
Регистр TPERIOD (как и TCOUNT) может быть программно загружен любым 16-битным числом (через DMD шину, см. рис. 1.11), которое
рассматривается как число без знака. Регистр TSCALE хранит коэффициент деления (уменьшенный на единицу) частоты импульсов декрементирования счетчика. Можно утверждать, что период следования запросов на
прерывания Tint определяется формулой:
Tint = (TPERIOD + 1) * (TSCALE + 1) / Fclkout.
(1.2)
Форматы регистров TCOUNT, TPERIOD, TSCALE и их адреса приведены в табл. 1.15.
Таблица 1.15
Формат регистров TCOUNT, TPERIOD, TSCALE и их адреса
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Адрес
TPERIOD
0x3FFD
TCOUNT
0x3FFC
0 0 0 0 0 0 0 0
TSCALE
0x3FFB
DMD
16
8
TSCALE
16
16
TPERIOD
16
8
Узел загрузки счетчика
Разрешение
таймера и узла
прескалера
16
-1
TCOUNT
CLKOUT
Timer Enable
Рис. 1.11. Структурная схема таймера
Нуль
Запрос на прерывание
от таймера
1.14. Системный интерфейс
К системному интерфейсу относится аппаратная часть и программное обеспечение, которые используются для управления процессором.
Сигналы управления процессором включают: RESET#, сигналы синхронизации, флаги входов и выходов, запросы на прерывания, запрос на режим энергосбережения.
1.14.1. Сигналы синхронизации
Для синхронизации процессора на его вход CLKIN необходимо подать сигнал от внешнего генератора с ТТЛ уровнями или подключить
кварцевый резонатор между CLKIN и XTAL, как это показано на рис. 1.1.
Если используется внешний сигнал синхронизации, вход XTAL должен
оставаться неподключенным. Нельзя также прерывать внешний сигнал
синхронизации или изменять его частоту во время работы процессора.
Внутри процессора сигнал синхронизации удваивается по частоте,
что определяет скорость выполнения машинных команд процессора (длительность машинного цикла). Например, при Fclkin = 16.67 МГц частота
работы процессора равна 33 МГц (сигнал такой частоты выводится на
контакт CLKOUT, см. рис. 1.1), а длительность машинного цикла составляет 33 нс.
Особенности синхронизации процессора предъявляют требования к
длительности асинхронных сигналов, например, запросов на прерывания.
Запрос на прерывание по уровню должен быть активен не менее длительности машинного цикла, увеличенного на сумму времен предустановки и
удержания. Времена предустановки и удержания, а также длительности
запроса по фронту приводятся в [3].
Сброс процессора. Активизация сигнала RESET# вызывает останов
выполнения программы и аппаратный сброс процессора. При подаче питания на процессор этот сигнал должен всегда формироваться, чтобы
корректно провести инициализацию внутренних ресурсов.
Сброс процессора (перезагрузку) можно также произвести программно: установкой BCR бита в регистре управления BDMA (сброс контекста BDMA, см. п. П1.10) или установкой PUCR бита в регистре управления автобуферизацией и экономичным режимом (SPORT1, сброс контекста экономичного режима работы процессора, см. П1.5).
В табл. 1.16 приводится содержимое внутренних регистров процессора после сброса и программной перезагрузки. Подразумевается, что содержимое регистров, не упомянутых в табл. 1.16, не изменяется в процессе сброса процессора. К таким регистрам, например, относятся регистры
вычислительных устройств (ALU, MAC и SHIFTER), регистры генераторов адреса DAG1, DAG2, а также ПП и ПД (за исключением регистров
управления и состояния, расположенных в ПД).
Таблица 1.16
Состояние регистров процессора после сброса и перезагрузки
Регистр или
Описание
Сброс ПерезагБитовое поле
рузка
Регистр обмена
РХ
Регистр обмена РХ
НО
НО
Регистры состояния
IMASK
Разрешен. Обслуживания прерываний 0
0
ASTAT
Арифметический статус
0
0
MSTAT
Состояние режима
0
НИ
SSTAT
Состояние стеков
0х55
0х55
ICNTL
Управление прерываниями
НО
НИ
IFC
Сброс/форсирование прерываний
0
0
Регистры управления (расположены в ПД)
BWAIT
Состояния ожидания загруз. памяти
3
НИ
BPAGE
Загружаемая страница
0
НИ
SPORT1
Регистр конфигурирования SPORT1
1
НИ
SPE0
Разрешение SPORT0
0
НИ
SPE1
Разрешение SPORT1
0
НИ
DWAIT0-4
Состояния ожидания ПД
7
НИ
PWAIT
Состояния ожидания ПП
7
НИ
TCOUNT
Регистр счетчика таймера
НО
ПР
TPERIOD
Регистр периода таймера
НО
НИ
TSCALE
Регистр коэфф. Деления таймера
НО
НИ
PDFORCE
Форсирование PD
0
НИ
PUCR
Определение контекста после PD
0
НИ
XTALDIS
Запрет контакта XTAL во время PD
0
НИ
XTALDELAY Задержка начала работы после PD
0
НИ
Регистры управления последовательными портами
ISCLK
Внутр. Синхропоследовательность
0
НИ
RFSR, TFSR
Разр. Фреймовой синхронизации
0
НИ
RFSW, TFSW Ширина фреймовых синхроимпульсов 0
НИ
IRFS, ITFS
Внутренняя фреймовая синхронизац.
0
НИ
INVRFS, INVTFS Инверсн. знач. Фрейм. Синхроимп. 0
НИ
DTYPE
Тип компандинга
0
НИ
SLEN
Длина последовательных слов
0
НИ
SCLKDIV
Коэфф. Деления SCLK
НО
НИ
RFSDIV
Коэфф. Деления RFS
НО
НИ
Слово бит разрешения многоканального режима
НО
НИ
МСЕ
Разрешение многоканального режима 0
НИ
MCL
Многоканальная длина
0
НИ
MFD
Задержка многоканального фрейма
0
НИ
INVTDV
Инвертирование передаваем. данных
0
НИ
RBUF, TBUF Разрешение автобуферизации
0
0
TIREG, RIREG
I-индекс автобуферизации
НО
НИ
TMREG, RMREG М-индекс автобуферизации
НО
НИ
FO (только SPORT1) Значение флага Out
CLKODIS
Запрет сигнала CLKOUT
BIASRND
Смещенное округление МАС
НО
0
0
НИ
НИ
НИ
Регистры управления внешней памятью (не расположены в ПД)
DMOVLAY
Выбор оверлея памяти данных
0
НИ
PMOVLAY
Выбор оверлея памяти программ
0
НИ
Расположены в ПД
DWAIT
Состояния ожидания оверлеев ПД
0х7
НИ
PWAIT
Состояния ожидания оверлеев ПП
0х7
НИ
BMWAIT
Состояния ожидания байтовой памяти 0х7
НИ
IOWAIT0-3
Состояния ожидания ввода/вывода
0х7
НИ
CMSEL
Выбор композитного селект. сигнала
0хВ
НИ
Программируемые флаги данных и регистры управления (в ПД)
PFDATA
Программируемые флаги данных
НО
НИ
PFTYPE
Программируемые флаги направления 0
НИ
Регистры управления DMA (расположены в ПД)
IDMAA
Адрес внутренней памяти IDMA
0x00
НИ
IDMAD
Тип памяти назначения
0
НИ
BIAD
Адрес внутренней памяти BDMA
0
0x20*
BEAD
Адрес внешней памяти BDMA
0
0х60*
BTYPE
Тип передаваемого слова BDMA
0
НИ
BDIR
Направление передачи BDMA
0
НИ
BCR
Контекст сброса BDMA
1
НИ
BWCOUNT
Число передаваемых слов BDMA
0x20
0*
BMPAGE
Страница внешней байтовой памяти
0
0*
Примечания:
 НО – значение не определено;
 НИ – значение не изменяется;
 символом * отмечены значения, которые имеют место сразу же
после начальной загрузки программы через BDMA. Такая загрузка производится процессором при выполнении следующих условий: MMAP = 0, BMODE = 0 (см. п. 1.1).
Во время сброса (перезагрузки) все запросы на прерывания (включая
от последовательных портов) маскируются, а автобуферизация запрещается. Последовательные порты остаются активными, поэтому во время
сброса (перезагрузки) они могут осуществить, по крайней мере, одну пересылку данных без формирования ошибки переполнения.
Таймер во время перезагрузки продолжает работать. Если он формирует запрос на прерывание, то этот запрос маскируется. Из всех возможных последующих запросов запоминается только первый.
После перехода сигнала RESET# в высокий уровень процесс сброса
процессора переходит в процесс загрузки программы. Вид загрузки зависит от значения сигналов на входах MMAP и BMODE процессора (см. п.
1.1). Так, если MMAP = 0 и BMODE = 0, то осуществляется BDMA загрузка программы из БП. При этом некоторые регистры процессора будут
иметь значения, приведенные в табл. 1.17.
Таблица 1.17
Состояние регистров BDMA после сброса и перезагрузки
Регистр или
Описание
До
После
Битовое поле
загрузки
Загрузки
BIAD
Адрес внутренней памяти BDMA,
0
0х20
устанавливается в ноль
BEAD
Адрес внешней памяти BDMA,
0
0х60
устанавливается в ноль
BTYPE
Тип передаваемого слова BDMA, 24 0
0
битное слово команды
BDIR
Направление передачи BDMA, из БП 0
0
BMPAGE
Выбор номера страницы BDMA, ну- 0
0
левая
BWCOUNT
Счетчик слов BDMA, 32 слова
0x20
0
BMWAIT
Число состояний ожидания BDMA, 7 0x7
0x7
состояний на передачу
BCR
Сброс контекста BDMA
1
1
Установка BCR (см. П1.5) приводит к следующей последовательности событий: остановка выполнения программы на время работы BDMA,
начало выполнения программы с адреса PM(0x0000) после окончания работы BDMA и разрешение BDMA прерываний. Приведенная последовательность событий осуществляется только после начальной загрузки программы или, если бит BCR установлен до записи в BWCOUNT.
После того или иного варианта сброса процессора выполнение программы начинается с адреса 0х0000.
1.14.2. Внешние прерывания
Все прерывания (состав, приоритеты, векторы прерываний, маскирование, чувствительность к уровню и фронту и т.п., в том числе и внешние) рассмотрены в п. 1.9. В п. 1.12.2 рассмотрено конфигурирование
внешних контактов SPORT1 для приема дополнительных внешних запросов на прерывания.
Необходимо добавить только следующее. Запросы на прерывания,
поступившие во время состояний ожидания при обращении процессора к
внешней памяти или во время обращений к внешней памяти, для которых
требуется более одного машинного цикла, не рассматриваются. Процессор это делает либо до обращения к внешней памяти, либо – после.
1.14.3. Флажковые биты
Процессор имеет три группы флажковых битов:
 FO, FI, если установлен бит 10 в регистре управления системой (см.
П1.1). Бит FI можно использовать для управления программными переходами, используя условия IF FLAF_IN или IF NOT FLAG_IN команд JUMP и CALL. Флаг FO можно использовать для формирования
внешнего сигнала общего назначения, его текущее состояние можно
проверить, прочитав бит 15 регистра управления SPORT1 (см. п. П1.6).
Значение флага FO не определено после сигнала RESET#;
 FL2-FL0 – выходные флаги общего назначения (см. п. 1.1), как и флаг
FO, могут управляться всеми командами манипулирования битами
(SET, RESET и TOGGLE, см. п. 1.17.8.г). Если перечисленные команды используются с условием IF CE, то счетчик таймера не декрементируется как в других конструкциях IF CE. После сигнала RESET#
флаги имеют единичное значение;
 PF7-PF0 – программируемые флаги общего назначения. Каждый из
этих флагов может запрограммирован как на вход, так и выход. После
действия сигнала RESET# все они программируются на ввод. Установить направление передачи можно, используя битовое поле PFTYPE в
регистре управления флагами (см. п. П1.7). Ввод/вывод через осуществляется с помощью регистра данных программируемых флагов
PFDATA (см. п. П1.8).
1.14.4. Режим энергосбережения
Режим энергосбережения позволяет понизить потребляемую мощность до 1mW при условии малой нагрузки на выходы и малой активности сигналов на входах процессора. Режим особенно актуален для
устройств с батарейным питанием.
Характерные особенности режима:
 Запрещена внутренняя синхронизация;
 Содержимое регистров и памяти процессора сохраняется;
 Возможность выхода из режима менее чем за 100 периодов CLKIN;
 Возможность запрещать внутренний генератор при использовании
кварцевого резонатора;
 Поддержка выполнения предопределенной части программы (housekeeping) перед входом в режим и при выходе из режима;
 Выбираемый пользователем контекст при выходе из режима.
Управлять параметрами режима можно с помощью битов управления режимом энергосбережения, которые входят в состав регистра управления автобуферизацией SPORT1 (см. п. П1.5). В ним, в частности, относятся XTALDIS, XTALDELAY, PDFORCE и PUCR.
С помощью первого из них можно запретить работу внутреннего генератора синхронизации процессора на время нахождения в режиме энер-
госбережения. Второй – обеспечивает задержку выполнения программы
на 4096 циклов для восстановления параметров узла автоподстройки частоты при выходе из режима энергосбережения. Третий – обеспечивает
один из способов перехода в режим энергосбережения. И, наконец, четвертый – определяет контекст процессора при выходе из режима.
Перевод в процессора в режим энергосбережения обычно производится следующим образом:
 Инициировать переход в режим энергосбережения можно аппаратно,
активизируя входной сигнал PWD#, или программно, установив в 1
бит PDFORCE регистра управления режимом энергосбережения (см. п.
П1.5);
 Процесс переходит на немаскируемый вектор прерывания powerdown
по адресу 0х002С;
 Начиная с этого адреса, перед переходом в режим энергосбережения
выполняется любое количество команд (предопределенный фрагмент
программы). Обычно этот фрагмент программы определяет параметры
режима энергосбережения, запрещает внутрипроцессорную периферию и очищает необработанные запросы на прерывание;
 Перевод процессора в режим энергосбережения осуществляет команда
IDLE (см. п. 1.17.8.з) даже, если этот переход инициирован аппаратно.
Если в предопределенном фрагменте программы перед командой IDLE
будет стоять команда RTI, то процессор вернется из обработчика прерывания powerdown без перехода в режим энергосбережения, т.е., в
принципе, это прерывание можно использовать, как немаскируемое
прерывание общего назначения.
Выход из режима энергосбережения могут инициировать два внешний сигнала: PWD# (переход из низкого уровня в высокий) или RESET#.
Далее, в зависимости от различных факторов, переход на выполнение
программы может производиться различными путями.
Если выход из режима энергосбережения инициирован дезактивацией сигнала PWD#, то программист может установить, по крайней мере,
два параметра выхода: длительность задержки и контекст. Первый параметр зависит от значения бита XTALDELAY регистра управления режимом энергосбережения (см. п. П1.5). Если этот бит сброшен, то переход
на программу составляет 100 периодов CLKIN. Такое значение бита
XTALDELAY устанавливается обычно, если используется внешний тактовый генератор. Если бит XTALDELAY установлен, то переход на программу составляет 4096 периодов CLKIN. Такое значение XTALDELAY
бита устанавливается обычно, если используется внутренний тактовый
генератор.
Контекст зависит от значения бита PUCR регистра управления режимом энергосбережения (см. п. П1.5). Если этот бит сброшен, то процессор перейдет на следующую команду (обычно RTI) после команды
IDLE. Если бит PUCR установлен, то при выходе из режима энергосбережения очищаются стеки PC, STATUS, LOOP и CNTR, регистры IMASK
и ASTAT. В регистр SSTAT записывается 0х55. Процессор начинает выполнять программу с адреса 0х0000.
Сигнал PWDACK (Power Down Acknowledge – подтверждение режима энергосбережения) является ответным на сигнал PWD#. Сигнал
PWDACK устанавливается, когда выполняется команда IDLE, и сбрасывается, когда начинает выполняться первая команда после выхода процессора из режима энергосбережения. Низкий уровень этого сигнала гарантирует наличие сигнала CLKOUT.
Если сигнал RESET# активизируется, когда процессор находится в
режиме энергосбережения, то начинается обычный процесс сброса процессора (см. п. 1.14.1). Если этот сигнал используется только для выхода
из режима энергосбережения, то он должен иметь определенную длительность. Расчет длительности сигнала RESET# для различных вариантов работы процессора приводится в [1].
1.15. Контроллер прямого доступа к байтовой памяти (BDMA)
Байтовый КПДП (см. п. 1.2) обеспечивает пересылку данных и программных кодов между внутренними ПД, ПП и БП, поскольку для доступа к БП не существует специальных команд, например, как для доступа к
адресным пространствам ввода/вывода или внешних ПД, ПП. Ниже рассматриваются наиболее важные аспекты использования байтового КПДП.
1.15.1. Общие сведения
На рис. 1.12 приведена схема подключения БП к процессору ADSP2181. Как показывает рис. 1.12 шина адреса БП состоит из шины адреса
процессора (ADDR[13:0]) и старшего байта шины данных (DATA[23:16]),
поэтому имеет размерность 22 бита (ADDR[21:00]). Это дает возможность
адресоваться к 4МБ байтовой памяти. Большой объем БП по сравнению с
внутренними ПП и ПД, а также быстрота доступа через специальный узел
(BDMA) делает БП похожей на жесткий диск персонального компьютера.
ADSP-2181
ADDR[13:00]
DATA[23:16]
DATA[15:08]
BMS#
14
8
8
БП
ADDR[13:00]
ADDR[21:14]
DATA[07:00]
CS#
Рис. 1.12. Схема подключения БП к ADSP-2181
Шина данных состоит из среднего байта шины данных процессора
(DATA[15:08]) и имеет размерность 8 битов, что и послужило названием
этого вида памяти. Селектирующий сигнал BMS# процессора служит
сигналом выбора микросхемы для БП. Следует отметить, что стробы за-
писи и чтения процессора (WR# и RD# соответственно) на рис. 1.12
условно не показаны.
Для расчета продолжительности Т передачи (в циклах процессора)
N слов с помощью байтового КПДП используется следующая формула:
T = N * (BPW * (WPB + 1) + 1) + HO
(1.3)
где: BPW – число байт в передаваемом слове; WPB – число состояний
ожидания при передаче байта; НО – число циклов останова работы байтового КПДП (обслуживание запроса захвата шины (см. п. 1.1), выполнение
автобуферизации (см. п. 1.12.5) и т.п.).
Для примера подсчитаем длительность пересылки 100 слов (N =
100) программного кода (BPW = 3) с пятью состояниями ожидания (WPB
= 5) без циклов останова работы байтового КПДП (НО = 0). По формуле
(1.3) получаем Т = 100 * (3 * (5 + 1) + 1) = 1900 циклов или 1900 * 33 =
62,7 мкс.
1.15.2. Регистры управления BDMA
Регистры управления BDMA приведены в ПРИЛОЖЕНИИ 1 (см. пп.
П1.9 – П1.12). В регистр счетчика слов BDMA (см. п. П1.9) записывается
число пересылаемых слов BWCOUNT. Этот регистр по разному инициализируется в зависимости от значений входных сигналов процессора
MMAP и BMODE. Если MMAP = 0 и BMODE = 0 (загрузка программы
при сбросе производится из БП, см. п. 1.14.1), то BWCOUNT = 0х20 (этот
случай представлен в п. П1.9), в противном случае (MMAP = 1 или
BMODE = 1), то BWCOUNT = 0.
В регистр управления BDMA Control Register (см. п. П1.10) записывается код режима работы байтового КПДП, который определяет: тип пересылаемых кодов (поле BTYPE), направление пересылки (поле BDIR),
значение бита контекста сброса (поле BCR) и номер страницы БП (поле
BMPAGE). Содержимое последнего поля во время пересылки устанавливается на линиях DATA[23:16] (см. п. 1.15.1).
В регистр внешнего адреса BDMA External Address Register (см. п.
П1.11) записывается начальный адрес БП BEAD, с которого начнется пересылка кодов. Содержимое этого регистра во время пересылки устанавливается на линиях ADDR[13:00] (см. п. 1.15.1).
В регистр внутреннего адреса BDMA Internal Address Register (см. п.
П1.12) записывается начальный адрес внутренней ПП или ПД BIAD, с которого начнется пересылка кодов.
1.15.3. Функционирование BDMA
Перед запуском BDMA необходимо определить значения BEAD,
BIAD (см. п. 1.15.2), а также код режима работы BDMA (содержимое ре-
гистра BDMA Control Register, см. п. 1.15.2). Запуск производится записью не нулевого значения в регистр BWCOUNT (см. п. 1.15.2).
Далее начинаются пересылки в соответствии с кодом режима работы
байтового КПДП. После каждой пересылки значения BEAD и BIAD инкрементируются, а BWCOUNT – декрементируются. Этот процесс продолжается пока BWCOUNT не станет нулевым. Этот момент времени отмечается формированием запроса на прерывание от BDMA (см. п. 1.9.1).
Если прерывание от BDMA не используется, то окончание BDMA
пересылок может быть определено по нулевому содержимому BWCOUNT. Если необходимо срочно (аварийно) прервать работу BDMA, то в
BWCOUNT необходимо записать единицу.
С помощью кода режима можно организовать пересылку программных кодов и кодов данных в различных форматах. Это поясняется содержимым табл. 1.18.
Таблица 1.18
00
Адрес
ПП или ПД
РМ(0х0000)
00
PM(0x0001)
01
DM(0x0000)
01
DM(0x0001)
10
10
11
11
DM(0x0002)
DM(0x0003)
DM(0x0004)
DM(0x0005)
BTYPE
Форматы BDMA
Содержимое
Адрес БП
ПП или ПД
0xABCDEF
BM(0x0000)
BM(0x0001)
BM(0x0002)
0x123456
BM(0x0003)
BM(0x0004)
BM(0x0005)
0x9876
BM(0x0006)
BM(0x0007)
0x3456
BM(0x0008)
BM(0x0009)
0x9800
BM(0x000A)
0x7600
BM(0x000B)
0x0034
BM(0x000C)
0x0056
BM(0x000D)
Содержимое
БП
0xAB
0xCD
0xEF
0x12
0x34
0x56
0x98
0x76
0x34
0x56
0x98
0x76
0x34
0x56
1.15.4. Загрузка программ с помощью BDMA
Загрузка программ с помощью BDMA осуществляется, если при
старте процессора выдержаны следующие условия: MMAP = 0 и BMODE
= 0. При этом автоматически регистры BDMA инициализируются следующим образом:
 BWCOUNT = 32 (из БП во внутреннюю ПП будут записываться не более 32-х команд);
 BDIR = 0 (пересылка из БП во внутреннюю ПП), BMPAGE = 0 (программа расположена на нулевой странице БП), BEAD = 0 (начиная с
нулевого адреса), BIAD = 0 (ПП также записывается с нулевого адреса), BTYPE = 0 (пересылаются трехбайтовые коды операций);
 BCR = 1 (на время пересылок работа процессора запрещена);
 BMWAIT = 7 (предполагается медленная память).
Пересылаемая программа является загрузчиком исполняемой программы. Если исполняемая программа создавалась с помощью утилиты
PROM Splitter, входящей в состав утилит ADSP-2100 Family, то загрузчик
подключается автоматически.
После пересылки загрузчика управление передается на нулевой адрес внутренней ПП (на начало загрузчика). Далее загрузчик выполняет
всю работу по пересылке исполняемой программы во внутреннюю ПП.
1.16. Порт IDMA
Порт IDMA является КПДП к внутренней ПП или ПД со стороны
хост-компьютера. При этом имеется возможность устанавливать адреса
чтения/записи не только со стороны процессора (из программы), но и со
стороны хост-компьютера (извне).
1.16.1. Сигналы IDMA
Сигналы IDMA перечислены в п. 1.1. Их совокупность представляет
собой простой и удобный интерфейс для доступа к внутренним ПП и ПД
со стороны хост-компьютера, напоминающий ISA шину. Действительно,
в его состав входит совмещенная двунаправленная шина адрес/данные
IAD[15:00]. Как и в ISA шине появление адреса на шине IAD[15:00] отмечается специальным сигналом IAL (аналог ALE). Стробы записи/чтения
IWR#/IRD# являются аналогами сигналов MEMW#/MEMR# соответственно.
Сигнал IS# является селектирующим. Операции с IDMA (запись адреса, запись/чтение данных) возможны только при низком уровне сигнала
на входе IS#. Сигнал IACK# является сигналом готовности к проведению
операции. Низкий уровень этого сигнала свидетельствует о возможности
проведения операции, при высоком уровне – операция отвергается. Во
время старта процессора этот сигнал сбрасывается, что дает возможность
взаимодействовать с IDMA. В таком состоянии он находится до первой
операции с IDMA. После начала этой операции он устанавливается на
время проведения операции, после чего снова сбрасывается.
Для управления IDMA существует регистр IDMA Control Register
(см. п. П1.13), в который записывается тип внутренней памяти IDMAD и
начальный адрес выбранной памяти IDMAA. Запись в этот регистр может
осуществляться как из программы (регистр имеет адрес 0x3FE0), так и по
сигналу IAL. При записи по сигналу IAL в IDMA Control Register записывается код, который в этот момент времени присутствует на шине
IAD[15:00].
1.16.2. Функционирование IDMA
Блочная схема алгоритма доступа к внутренней памяти процессора
со стороны хост-компьютера приведен на рис. 1.13.
НАЧАЛО IDMA ПЕРЕСЫЛОК
нет
1. IACK# = 0?
да
2. Хост-компьютер активизирует управляющие сигналы IS# и IAL для записи
начального адреса внутренней памяти IDMAA и ее типа IDMAD в регистр
управления IDMA (это также можно сделать из программы процессора).
3. Хост-компьютер активизирует управляющие сигналы IS# и IRD#/IWR#
для чтения/записи внутренней ПП или ПД.
нет
нет
4. Пересылки завершены?
5. IACK# = 1?
да
да
КОНЕЦ IDMA ПЕРЕСЫЛОК
Рис. 1.13. Блочная схема алгоритма IDMA пересылок
Алгоритм рис. 1.13 достаточно полно иллюстрирует особенности
IDMA пересылок. Осталось добавить:
 после каждой пересылки значение IDMAA инкрементируется. Это дает возможность записывать передаваемый блок кодов по возрастающим адресам;
 во время пересылок процессор продолжает выполнять программу.
1.16.3. Загрузка программ с помощью IDMA
Загрузка программ с помощью IDMA осуществляется в следующей
последовательности:
 сбросить процессор (RESET#:= 0);
 установить MMAP = 0 и BMODE = 1 - это условия загрузки программы через IDMA;
 деактивировать RESET# (RESET#:= 1);
 загрузить выполняемую программу во внутреннюю ПП в соответствии
с п. 1.16.2;
 произвести запись по адресу РМ(0х0000), чтобы запустить загруженную программу на исполнение.
1.17. Система команд
1.17.1. Общие сведения
Язык ассемблера процессора использует алгебраическую запись машинных команд, что позволяет сочетать хорошую читаемость с высокой
эффективностью. Ниже приводится формат команды процессора:
[LABEL:] [IF cond ] COP; [COP;.. COP;][{Commentary}]
где:
 LABEL – метка, т.е. идентификатор (адрес), присваиваемый следующей за ним команде (СОР). Метка используется для передачи управления отмеченной команде, вызова подпрограммы, а также для отметки последней команды тела цикла DO UNTIL. Метка не обязательна,
при ее отсутствии символ : опускается;
 IF cond – условная часть команды, если она есть в команде, то она
проверяется первой. Если условие cond верно, то следующая за ней
команда СОР выполняется, в противном случае – нет. Все проверяемые условия приведены в табл. 1.19. Условная часть не обязательна, в
ее отсутствии команда считается безусловно выполняемой. Условная
часть может находиться не перед всеми командами, так перед КОМАНДАМИ ПЕРЕСЫЛКИ (см. п. 1.17.4) и МНОГОФУНКЦИОНАЛЬНЫМИ КОМАНДАМИ (см. п. 1.17.9) условная часть команды
НЕ используется;
 СОР – (Code OPeration) код операции (команда) заканчивается всегда
символом ; (точка с запятой). Это дает возможность писать в одной
строке несколько команд;
 комментарий Commentary, если он есть, всегда пишется в фигурных
скобках (в среде VisualDSP также отделяется двумя прямыми слешами).
Условие
EQ
NE
LT
GE
LE
GT
AC
NOT AC
AV
NOT AV
Таблица 1.19
Условия, проверяемые оператором IF команды
Описание
Выполняется, когда
Равно нулю
AZ = 1
Не равно нулю
AZ = 0
Меньше чем ноль
AN.XOR.AV = 1
Больше чем или равно нулю
AN.XOR.AV = 0
Меньше чем или равно нулю
(AN.XOR.AV).OR.AZ = 1
Больше чем ноль
(AN.XOR.AV).OR.AZ = 0
Перенос ALU
AC = 1
Нет переноса ALU
AC = 0
Переполнение ALU
AV = 1
Нет переполнения ALU
AV = 0
MV
NOT MV
NEG
POS
NOT CE
FLAG_IN*
Переполнение МАС
Нет переполнения МАС
Отрицательный знак Х входа
Положительный знак Х входа
Счетчик не исчерпан
Сигнал FI установлен
MV = 1
MV = 0
AS = 1
AS = 0
На входе FI высокий
уровень сигнала
NOT
Сигнал FI сброшен
На входе FI низкий уровень
*
FLAG_IN
сигнала
*
Примечание: - только для команд JUMP и CALL.
Примеры команд:
{Сложение содержимых AX0 и AF, если есть перенос ALU}
IF AC AR = AX0 + AF;
{Пересылка содержимого ячейки ПД с адресом 0х1234 в AX0}
AX0 = DM(0x1234);
{Многофункциональная команда МАС. Содержимое MX0 и MY0 перемножаются со знаком, результат суммируется с содержимым MR, после
чего регистры MX0 и MY0 загружаются новыми значениями из ПД и ПП
соответственно. И все это происходит за один машинный цикл. Запятые
разделяют отдельные части многофункциональной команды.}
MR = MR + MX0 * MY0 (SS), MX0 = DM(I0, M0), MY0 = PM(I4, M5);





Процессор ADSP–2181 содержит следующие группы команд:
Пересылочные;
Вычислительные: ALU, MAC, SHIFTER;
Управления потоком команд;
Многофункциональные;
Прочие.
1.17.2. Методы адресации
При описании методов адресации и команд приходится ссылаться на
различные регистры процессора, причем, удобно использовать обобщенные обозначения этих регистров reg и dreg, см. табл. 1.20.
Таблица 1.20
Регистры процессора reg и dreg
Регистры reg
SB
Регистры данных dreg
PX
AX0, AX1, AY0, AY1, AR
I0-I7, M0-M7, L0-L7
MX0, MX1, MY0, MY1, MR0, MR1, MR2
CNTR
SI, SE, SR0, SR1
ASTAT, MSTAT, SSTAT
IMASK, ICNTL, IFC
TX0, TX1, RX0, RX1
Табл. 1.20 показывает, что к регистрам типа reg относятся почти все
регистры процессора, которые не располагаются в ПД. К отсутствующим
регистрам, в частности, относятся AF и MF. Регистры данных dreg являются подмножеством регистров reg. К ним относятся регистры данных
вычислительных устройств, за одним исключением - SB.
Процессор поддерживает четыре метода адресации данных:
 Регистровый, когда месторасположения операнда определяется именем регистра. Пример: AX0 = SI;, где имя SI указывает на местоположение операнда-источника, а АХ0 – операнда-приемника;
 Непосредственный, когда операнд является частью команды. Пример: I0 = 0х1234;, где константа 0х1234 присваивается индексному регистру I0;
 Прямой, когда в команде указан адрес операнда. Например: AX0 =
DM(0x1234);, где константа 0х1234 является адресом в ПД операндаисточника;
 Косвенный, когда адрес операнда находится в одном из индексных
регистров. Пример: AX0 = DM(I1, M1);, где адрес операнда-источника
содержится в индексном регистре I1. После пересылки этот регистр
инкрементируется на величину содержимого М1.
Процессор также поддерживает два метода адресации переходов:
 Прямой, когда в команде явно указан адрес перехода. Например:
IF EQ JUMP zero;, где zero является меткой и при компиляции заменяется соответствующим адресом в ПП;
 Косвенный, когда адрес операнда находится в одном из индексных
регистров, предназначенных для адресации ПП (I4-I7). Пример: IF
FLAG_IN JUMP (I4);, где адрес перехода содержится в индексном регистре I4.
1.17.3. Условные обозначения
При описании команд будут использоваться следующие соглашения
о их записи:
Квадратные скобки [ ] Отмечают необязательную часть команды
Параллельные линии | | Содержат список операндов, из которого может
быть выбран только один операнд
ПРОПИСНЫЕ БУКВЫ Прописные буквы обозначают литерал. К литералам относятся имена команд (например,
ADD), имена регистров (например, АХ0) или
служебная информация (например, (SS) в командах умножения, см. п. 1.17.1). Литералы
должны писаться так, как они приведены в описании команды
Операнды
Обобщенные операнды некоторых команд могут
писаться строчными буквами. В ассемблерной
программе могут иметь различное значение.
Например, в качестве yop могут выступать имена следующих регистров AY0, AY1 или AF
<exp>
Обозначает экспоненту (число и направление
сдвигов) в командах непосредственных сдвигов
(см. п. 1.17.7.е, ж). Экспонента является 8-битным целым со знаком
<data>
Обозначает значение непосредственного данного. Может быть не только числом, но и именем
адресной метки или именем переменной/буфера,
перед которой должны стоять символы ‘%’ или
‘^’
<addr>
Обозначает значение прямого адреса. Может
быть либо непосредственным значением (константой), либо программной меткой
<reg>
Имя любого доступного регистра процессора,
см. табл. 1.20
<dreg>
Имя любого доступного регистра данных процессора, см. табл. 1.20
Непосредственные значения <exp>, <data> или <addr> могут быть
константами в десятичной, шестнадцатеричной, восьмеричной или двоичной системах счисления. По умолчанию в десятичной.
Для отражения состояния флагов ASTAT используются следующие
обозначения:
*
показывает, что бит изменен выполненной командой;
показывает, что бит не зависит от выполненной командой;
0, 1 показывает, что бит безусловно сбрасывается или устанавливается выполненной командой.
1.17.4. Команды пересылки данных
А) ПЕРЕСЫЛКА РЕГИСТР – РЕГИСТР
Синтаксис: reg = reg;
AX0
AX1
AY0
AY1
AR
Допустимые регистры:
MX0 SI
SB
MX1 SE
PX
MY0 SR1
ASTAT
MY1 SR0
MSTAT
MR2 I0-I7
SSTAT (только чтение)
MR1 M0-M7 IMASK
MR0 L0-L7 ICNTL
Пример: I7 = AR;
CNTR
OWRCNTR (только запись)
RX0
RX1
ТХ0
TX1
IFC (только запись)
Описание: Содержимое регистра источника (справа от знака равенства) пересылается в регистр назначения (слева от знака равенства). После пересылки содержимое регистра назначения всегда с правым выравниванием.
Правое выравнивание подразумевает заполнение старшего байта регистра назначения нулем или распространением знака содержимого регистра источника, когда в большой регистр (например, 16-битный) пересылается содержимое малого регистра (например, 8-битного).
В этом случае процессор поступает следующим образом: если источником являются беззнаковые регистры (I0-I7, L0-L7, CNTR, PX,
ASTAT, MSTAT, SSTAT, IMASK и ICNTL), то старший байт регистра
назначения заполняется нулем; если источником являются знаковые регистры (все оставшиеся из разрешенных), то старший бай заполняется знаком операнда источника.
Когда содержимое большого регистра записывается в малый
(например, 16-битный в 14-битный), то отбрасываются два старших бита
операнда источника.
Следует помнить, что при загрузке регистра MR1 знак загружаемого
операнда распространяется в регистр MR2.
Флаги состояния: не изменяются.
Б) ЗАГРУЗКА РЕГИСТРА НЕПОСРЕДСТВЕННЫМИ
ДАННЫМИ
Синтаксис: reg = <data>
dreg = <data>
data: <константа>
'%' <имя переменной/буфера>
'^' <имя переменной/буфера>
(в среде VisualDSP <имя переменной/буфера> и
length(<имя переменной/буфера>) соответственно)
Допустимые регистры:
dreg (16-битные)
AX0 MX0 SI
AX1 MX1 SE
AY0 MY0 SR1
AY1 MY1 SR0
AR MR2
MR1
MR0
reg (максимум 14-битные)
SB
CNTR
PX
OWRCNTR (только запись)
ASTAT
RX0
MSTAT
RX1
IMASK
ТХ0
ICNTL
TX1
I0-I7
IFC (только запись)
M0-M7
L0-L7
Примеры: I0 = ^data_buffer; (I0 = data_buffer;)
L0 =% data_buffer; (L0 = length(data_buffer);)
Описание: Непосредственное данное data загружается в регистр
назначение. Данным может быть константа, а также имя любой переменной/буфера, перед которой стоят операторы длины (%) или указателя (^).
В среде VisualDSP символ (^) необходимо опускать, а символ (%) заменять словом length.
Данное должно быть длиной 16 бит для загрузки регистров данных
(dreg) и не более 14 бит для всех оставшихся регистров (reg). В регистре
назначении данное всегда располагается с правым выравниваем. Если
длина данного меньше длины регистра назначения, то старшие разряды
регистра заполняются знаком данного.
При загрузке регистра MR1 знак загружаемого операнда распространяется в регистр MR2.
Особенность команды является то, что с ее помощью 16-битные регистры RX и ТХ можно загрузить только 14-битной константой. Для полного использования возможностей этих регистров следует применять команды регистр-регистр (см. п. 1.17.4.А) или ПД-регистр (см. п. 1.17.4.В).
Флаги состояния: не изменяются.
В) ЧТЕНИЕ ПД (ПРЯМАЯ АДРЕСАЦИЯ)
Синтаксис: reg = DM(<addr>);
Допустимые регистры: см. п. 1.17.4.А за исключением регистра
SSTAT, который работает только на чтение и не может быть записан.
Пример: SI = DM(0x1234);
Описание: Команда чтения ПД с прямым методом адресации пересылает содержимое ячейки ПД с адресом addr в регистр назначение. Поскольку метод адресации – прямой, то адрес (заданный константой или
меткой) запоминается в самой команде как 14-битное поле. Операнд в регистр назначение загружается с правым выравниваем. При загрузке регистра MR1 знак загружаемого операнда распространяется в регистр MR2.
Флаги состояния: не изменяются.
Г) ЧТЕНИЕ ПД (КОСВЕННАЯ АДРЕСАЦИЯ)
Синтаксис:
dreg = DM (
I0 ,
I1
I2
I3
M0
M1
M2
M3
I4
I5
I6
I7
M4
M5
M6
M7
);
Допустимые регистры dreg:
AX0 MX0 SI
AX1 MX1 SE
AY0 MY0 SR1
AY1 MY1 SR0
AR MR2
MR1
MR0
Пример: AY0 = DM(I3, M1);
Описание: Команда чтения ПД с косвенным методом адресации пересылает содержимое ячейки ПД, адрес которой находится в индексном
регистре Ix, в регистр назначение. После пересылки содержимое индексного регистра модифицируется (инкрементируется) содержимым регистра
модификации Мх. Для линейной косвенной адресации необходимо, чтобы
регистр длины Lх, соответствующий индексному регистру был обнулен.
Операнд в регистр назначение загружается с правым выравниваем.
Флаги состояния: не изменяются.
Д) ЧТЕНИЕ ПП (КОСВЕННАЯ АДРЕСАЦИЯ)
Синтаксис:
dreg = PM (
I4 ,
I5
I6
I7
M4
M5
M6
M7
);
Допустимые регистры dreg: см. п. 1.17.4.Г.
Пример: MX1 = PM(I6, M5);
Описание: Команда чтения ПП с косвенным методом адресации пересылает содержимое ячейки ПП, адрес которой находится в индексном
регистре Ix, в регистр назначение. После пересылки содержимое индексного регистра модифицируется (инкрементируется) содержимым регистра
модификации Мх. Для линейной косвенной адресации необходимо, чтобы
регистр длины Lх, соответствующий индексному регистру был обнулен.
В регистр назначение пересылается содержимое битов 23-8 (самые
значащие) указанной ячейки ПП. Причем, бит 8 источника попадает в бит
0 назначения (правое выравнивание). Если регистр назначение короче 16
битов, то лишние старшие разряды отбрасываются. Младший байт источника (биты 7-0) всегда загружаются в РХ регистр. Их можно игнорировать. Если они нужны, то могут быть прочитаны в следующем цикле.
Флаги состояния: не изменяются.
Е) ЗАПИСЬ В ПД (ПРЯМАЯ АДРЕСАЦИЯ)
Синтаксис: DM(<addr>) = reg;
Допустимые регистры: см. п. 1.17.4.А за исключением регистров
OWRCNTR и IFC, которые работают только на запись и поэтому не могут
быть считаны.
Пример: DM(0x2345) = AR;
Описание: Команда записи ПД с прямым методом адресации пересылает содержимое регистра источника (справа от знака равенства) в
ячейку ПД с адресом addr. Поскольку метод адресации – прямой, то адрес
(заданный константой или меткой) запоминается в самой команде как 14битное поле.
Операнд в ячейку памяти загружается с правым выравниваем. Это
означает, что если длина регистра источника меньше 16 бит, то старшие
разряды ячейки памяти заполняются либо нулем, либо знаком пересылаемого операнда.
Процессор поступает следующим образом. Если регистр источник
беззнаковый (I0-I7, L0-L7, CNTR, PX, ASTAT, MSTAT, SSTAT, IMASK и
ICNTL), то старшие биты ячейки памяти заполняются нулем, в противном
случае (любой другой допустимый регистр кроме перечисленных) – знаком пересылаемого операнда.
При загрузке регистра MR1 знак загружаемого операнда распространяется в регистр MR2.
Флаги состояния: не изменяются.
Ж) ЗАПИСЬ В ПД (КОСВЕННАЯ АДРЕСАЦИЯ)
Синтаксис:
DM (
I0 ,
I1
I2
I3
M0
M1
M2
M3
I4
I5
I6
I7
M4
M5
M6
M7
)=
dreg
<data>
;
data: <константа>
'%' <имя переменной/буфера>
'^' <имя переменной/буфера>
см., также, п. 1.17.4.Б
Допустимые регистры dreg: см. п. 1.17.4.Г.
Пример: DM(I2, M0) = MR1;
Описание: Команда записи в ПД с косвенным методом адресации
пересылает содержимое регистра источника или непосредственное данное
в ячейку ПД, адрес которой находится в индексном регистре Ix. После пересылки содержимое индексного регистра модифицируется (инкрементируется) содержимым регистра модификации Мх. Данным может быть
константа, а также имя любой переменной/буфера, перед которой стоят
операторы длины (%) или указателя (^),см., также, п. 1.17.4.Б.
Для линейной косвенной адресации необходимо, чтобы регистр длины Lх, соответствующий индексному регистру был обнулен. Операнд в
ячейку ПД загружается с правым выравниваем. Если длина регистра источника меньше 16 бит, то в ячейке ПД происходит распространение знака операнда влево.
Флаги состояния: не изменяются.
З) ЗАПИСЬ В ПП (КОСВЕННАЯ АДРЕСАЦИЯ)
Синтаксис:
PM (
I4
I5
I6
I7
,
M4
M5
M6
M7
data: <константа>
'%' <имя переменной/буфера>
'^' <имя переменной/буфера>
)=
dreg;
см., также, п. 1.17.4.Б
Допустимые регистры dreg: см. п. 1.17.4.Г.
Пример: PM(I6, M5) = AR;
Описание: Команда записи в ПП с косвенным методом адресации
пересылает содержимое регистра источника в ячейку ПП, адрес которой
находится в индексном регистре Ix. После пересылки содержимое индексного регистра модифицируется (инкрементируется) содержимым регистра модификации Мх. Для линейной косвенной адресации необходимо, чтобы регистр длины Lх, соответствующий индексному регистру был
обнулен.
Содержимое регистра источника загружается в старшие 16 бит ячейки ПП, т.е. бит 0 операнда загружается в бит 8 ячейки памяти (правое выравнивание). Восемь младших бит ячейки памяти загружаются из регистра РХ. Если длина регистра источника меньше 16 бит, то в ячейке ПП
происходит распространение знака операнда влево.
Флаги состояния: не изменяются.
И) ЧТЕНИЕ/ЗАПИСЬ ПРОСТРАНСТВА ВВОДА/ВЫВОДА
Синтаксис: IO(<addr>) = dreg;
dreg = IO(<addr>);
{ запись в порт}
{чтение порта}
<addr> - 11 – битный прямой адрес от 0 до 2047
Допустимые регистры dreg: см. п. 1.17.4.Г.
Описание: Команды записи/чтения пространства ввода/вывода используются для доступа к пространству памяти ввода/вывода. Только эти
команды формируют сигнал IOMS# (см. п. 1.1).
Флаги состояния: не изменяются.
1.17.5. Команды ALU
А) СЛОЖЕНИЕ/СЛОЖЕНИЕ С ПЕРЕНОСОМ
Синтаксис:
[IF cond] AR
AF
= xop
+ yop
;
+C
+ yop + C
+ constant
+ constant + C
Допустимые:
регистры xop
AX0 MR2
AX1 MR1
AR MR0
SR1
SR0
регистры yop
AY0
AY1
AF
условия cond
EQ
LE
NE
NEG
GT
POS
GE
AV
LT
NOT AV
AC
NOT AC
MV
NOT MV
NOT CE
Допустимые константы: 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,
2048, 4096, 8192, 16384, 32767, -2, -3, -5, -9, -17, -33, -65, - 129, -257, -513, 1025, -2049, -4097, -8193, -16385, -32768.
Примеры: IF EQ AR = AX0 + AY0 + C;
AR = AR + 512;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит сложение первого операнда источника со вторым операндом источником, а также битом АС, если в команде присутствует символ С. Результат сохраняется в регистре назначения.
Операнды и константа содержатся в регистрах, которые определены в команде.
Операция xop + constant не может использоваться в многофункциональных командах.
Флаги состояния:
ASTAT: 7
6
5
4
3
2
1
0
SS MV AQ AS AC AV AN AZ
*
*
*
*
AZ – устанавливается, если результат равен нулю и сбрасывается в
противном случае. AN – устанавливается, если результат отрицательный
и сбрасывается в противном случае. AV – устанавливается, если случилось арифметическое переполнение и сбрасывается в противном случае.
AC – устанавливается, если есть перенос и сбрасывается в противном
случае.
Б) ВЫЧИТАНИЕ X-Y/ВЫЧИТАНИЕ X-Y С ЗАЕМОМ
Синтаксис:
[IF cond] AR
AF
= xop
- yop
- yop + C – 1
+C–1
- constant
- constant + C - 1
;
Допустимые: регистры xop, регистры yop, условия cond и константы см. п. 1.17.5.А.
Пример: IF GE AR = AX0 – AY0;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит вычитание второго операнда источника из первого операнда источника, а также прибавляет АС – 1, если
в команде присутствует терм С – 1. Результат сохраняется в регистре
назначения. Терм (С – 1) позволяет поддерживать операцию заема при
вычитании чисел длиной более 16 бит. Операнды и константа содержатся
в регистрах, которые определены в команде.
Операция xop - constant не может использоваться в многофункциональных командах.
Флаги состояния: см. п. 1.17.5.А.
В) ВЫЧИТАНИЕ Y-X/ВЫЧИТАНИЕ Y-X С ЗАЕМОМ
Синтаксис:
[IF cond] AR
AF
=
yop -
xop
xop + C – 1
- xop + C – 1
- xop + constant
- xop + constant + C – 1
;
Допустимые: регистры xop, регистры yop, условия cond и константы см. п. 1.17.5.А.
Пример: IF GT AR = AY0 – AX0 + C – 1;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит вычитание второго операнда источника из первого операнда источника, а также прибавляет АС – 1, если
в команде присутствует терм С – 1. Результат сохраняется в регистре
назначения. Терм (С – 1) позволяет поддерживать операцию заема при
вычитании чисел длиной более 16 бит. Операнды и константа содержатся
в регистрах, которые определены в команде.
Операция xop - constant не может использоваться в многофункциональных командах.
Флаги состояния: см. п. 1.17.5.А.
Г) AND, OR, XOR
Синтаксис:
[IF cond] AR
AF
= xop
AND
OR
XOR
yop
constant
;
Допустимые: регистры xop, регистры yop, условия cond и константы см. п. 1.17.5.А.
Примеры: IF POS AR = MR0 AND 8192;
AR = AX0 XOR AY0;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит побитную логическую операцию
И/ИЛИ/ИСКЛЮЧАЮЩЕЕ ИЛИ между первым операндом источником и
вторым операндом источником. Результат сохраняется в регистре назначения. Операнды и константа содержатся в регистрах, которые определены в команде.
Операция xop AND/OR/XOR constant не может использоваться в
многофункциональных командах.
Флаги состояния:
ASTAT: 7
6
5
4
3
2
1
0
SS MV AQ AS AC AV AN AZ
0
0
*
*
AZ – устанавливается, если результат равен нулю и сбрасывается в
противном случае. AN – устанавливается, если результат отрицательный
и сбрасывается в противном случае. AV – всегда сбрасывается. AC –
всегда сбрасывается.
Д) ПРОВЕРКА БИТА, УСТАНОВКА БИТА, ОЧИСТКА БИТА,
ИНВЕРСИЯ БИТА
Синтаксис:
[IF cond] AR
AF
=
TSTBIT n OF xop
SETBIT n OF xop
CLRBIT n OF xop
TGLBIT n OF xop
;
Допустимые: регистры xop и условия cond см. п. 1.17.5.А.
Допустимые значения n: 0 – 15.
Примеры: IF LE AF = TSTBIT 5 OF AR;
AR = TGLBIT 13 OF AX0;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит следующее:
 Если выполняет TSTBIT, то производит операцию логического И
между содержимым регистра источника и 1 в выбранном бите n;
 Если выполняет SETBIT, то производит операцию логического ИЛИ
между содержимым регистра источника и 1 в выбранном бите n;
 Если выполняет CLRBIT, то производит операцию логического И
между содержимым регистра источника и 0 в выбранном бите n;
 Если выполняет TGLBIT, то производит операцию логического ИСЛЮЧАЮЩЕГО ИЛИ между содержимым регистра источника и 1 в
выбранном бите n.
Перечисленные команды не могут выполняться в многофункциональном режиме.
Следующий пример показывает, как произвести переход на метку
set, если установлен пятый бит AR.
AF = TSTBIT 5 OF AR;
IF NE JUMP set
Флаги состояния: см. п. 1.17.5.А.
Е) ПЕРЕСЫЛКА/ОЧИСТКА
Синтаксис:
[IF cond] AR
AF
= PASS
xop
yop
constant
;
Допустимые: регистры xop, регистры yop и условия cond см. п.
1.17.5.А.
Допустимые константы: -1, 0, 1
2, 3, 4, 5, 7, 8, 9, 15, 16, 17, 31, 32, 33, 63, 64, 65, 127, 128, 129, 255, 256,
257, 511, 512, 513, 1023, 1024, 1025, 2047, 2048, 2049, 4095, 4096, 4097,
8191, 8192, 8193, 16383, 16384, 16385, 32766, 32767
-2, -3, -4, -5, -6, -8, -9, -10, -16, -17, -18, -32, -33, -34, -64, -65, -66, -128, 129, -130, -256, -257, -258, -512, -513, -514, -1024, -1025, -1026, -2048, 2049, -2050, -4096, -4097, -4098, -8192, -8193, -8194, -16384, -16385, 16386, -32767, -32768
Примеры: IF GE AR = PASS AY0; {пересылка содержимого AY0 в AR}
AR = PASS 0;
{очистка AR}
AR = PASS 8191; {загрузка AR константой 8191}
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит пересылку содержимого регистра
источника или константы в регистр приемник. Операнды и константа содержатся в регистрах, которые определены в команде.
В отличие от функционально идентичных команд пересылки данных
(см. п. 1.17.4), команда PASS xop/yop/-1/0/1 устанавливает некоторые
флаги (см. ниже). Если операндами команды являются константы, отличные от -1, 0, 1, то состояние флагов ASTAT не определено.
Команда PASS xop/yop/-1/0/1 может использоваться в многофункциональных командах. Константы, отличные от –1, 0, 1, не могут использоваться в многофункциональных командах.
Флаги состояния: см. п. 1.17.5.Г.
Ж) ОТРИЦАНИЕ ЗНАКА ОПЕРАНДА
Синтаксис:
[IF cond] AR
AF
= -
xop
yop
;
Допустимые: регистры xop, регистры yop и условия cond см. п.
1.17.5.А.
Пример: IF LT AR = - AY0;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит пересылку содержимого регистра
источника в регистр приемник с инверсией знака операнда. Операнды содержатся в регистрах, которые определены в команде.
Флаги состояния:
ASTAT: 7
6
5
4
3
2
1
0
SS MV AQ AS AC AV AN AZ
*
*
*
*
AZ – устанавливается, если результат равен нулю и сбрасывается в
противном случае. AN – устанавливается, если результат отрицательный
и сбрасывается в противном случае. AV – устанавливается, если операнд
= 0х8000 и сбрасывается в противном случае. AC – устанавливается, если
операнд равен нулю и сбрасывается в противном случае.
З) ИНВЕРСИЯ БИТОВ ОПЕРАНДА
Синтаксис:
[IF cond] AR
AF
= NOT
xop
yop
;
Допустимые: регистры xop, регистры yop и условия cond см. п.
1.17.5.А.
Пример: IF NE AF = NOT AX0;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит пересылку содержимого регистра
источника в регистр приемник с инверсией всех битов операнда. Операнды содержатся в регистрах, которые определены в команде.
Флаги состояния: см. п. 1.17.5.Г.
И) АБСОЛЮТНОЕ ЗНАЧЕНИЕ
Синтаксис:
[IF cond] AR
AF
= ABS
xop
;
Допустимые: регистры xop и условия cond см. п. 1.17.5.А.
Пример: IF NEG AF = ABS AX0;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит пересылку содержимого регистра
источника в регистр приемник с формированием абсолютной величины
операнда. Операнды содержатся в регистрах, которые определены в команде.
Флаги состояния:
ASTAT: 7
6
5
4
3
2
1
0
SS MV AQ AS AC AV AN AZ
*
0
*
*
*
AZ – устанавливается, если результат равен нулю и сбрасывается в
противном случае. AN – устанавливается, если хор = 0х8000 и сбрасывается в противном случае. AV – устанавливается, если хор = 0х8000 и
сбрасывается в противном случае. AC – всегда сбрасывается. AS – устанавливается, если операнд источник отрицательный и сбрасывается в
противном случае.
К) ИНКРЕМЕНТ
Синтаксис:
[IF cond] AR
AF
=
yop + 1
;
Допустимые: регистры yop и условия cond см. п. 1.17.5.А.
Пример: IF GT AF = AF + 1;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит пересылку содержимого регистра
источника в регистр приемник с увеличением на 1 значения операнда.
Операнды содержатся в регистрах, которые определены в команде.
Флаги состояния: см. п. 1.17.5.А.
Л) ДЕКРЕМЕНТ
Синтаксис:
[IF cond] AR
AF
=
yop – 1
;
Допустимые: регистры yop и условия cond см. п. 1.17.5.А.
Пример: IF EQ AR = AY1 – 1;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит пересылку содержимого регистра
источника в регистр приемник с уменьшением на 1 значения операнда.
Операнды содержатся в регистрах, которые определены в команде.
Флаги состояния: см. п. 1.17.5.А.
М) ДЕЛЕНИЕ
Синтаксис: DIVS yop, xop
DIVQ xop
Допустимые:
регистры xop
регистры yop
AX0 MR2
AY1
AX1 MR1
AF
AR MR0
SR1
SR0
Описание: Эти команды выполняют деление yop на xop. Команды
DIVS, DIVQ являются примитивами, поскольку при их выполнении формируется только один разряд частного: знак – при выполнении команды
DIVS и остальные разряды – при выполнении команды DIVQ. Поэтому
деление с одинарной точностью (32-битное делимое, 16-битные делитель
и частное) требует 16 циклов. Возможно деление с более высокой точностью.
Деление может быть знаковым и беззнаковым, в любом случае операнды должны быть одного типа: знаковые или беззнаковые. Для подготовки деления необходимо старшую часть делимого загрузить в любой
допустимый yop регистр (AY1 или AF), младшую часть делимого загрузить в AY0, а делитель загрузить в любой хор.
Далее операция деления выполняется с помощью примитивов деления DIVS, DIVQ. Повторные выполнения DIVQ реализуют алгоритм деления с помощью условного сложения/вычитания без восстановления
остатка. После окончания деления частное формируется в AY0.
Для выполнения знакового деления необходимо сначала однократно
выполнить команду DIVS, чтобы сформировать знак частного. Далее
необходимо выполнить команду DIVQ столько раз, сколько бит осталось
в частном (для выполнения знакового деления с одинарной точностью
команду DIVQ необходимо выполнить 15 раз).
Для выполнения беззнакового деления необходимо старшую часть
делимого загрузить в AF, затем сбросить бит AQ регистра ASTAT (при
этом сформируется положительный знак частного). Далее выполнить команду DIVQ столько раз, сколько битов содержит частное (для выполнения беззнакового деления необходимо 16 раз выполнить команду DIVQ).
В конце выполнения команд DIVS, DIVQ очередной бит частного
запоминается в бите AQ регистра ASTAT. Остаток формируется в AF, но
он нуждается в коррекции.
Флаги состояния:
ASTAT: 7
6
5
4
3
2
1
0
SS MV AQ AS AC AV AN AZ
*
AQ – формируется командами DIVS и DIVQ.
Н) ФОРМИРОВАНИЕ ФЛАГОВ ALU
Синтаксис: NONE = <ALU>;
ALU – может быть любой безусловной командой кроме DIVS и DIVQ.
Примеры: NONE = AX0 – AY0;
NONE = PASS SR0;
Описание: Процессор выполняет команду ALU, формирует флаги
состояния, а результат игнорирует. Команда позволяет тестировать содержимое регистров источников без изменения содержимого регистров
AR и AF.
Примечание: кроме команд DIVS и DIVQ недопустимо использовать
также следующие команды ALU:
 сложение (xop + constant);
 вычитание X – Y (xop – constant);
 вычитание Y – X (- xop + constant);
 AND, OR, XOR (xop  constant);
 PASS constant (отличные от –1, 0, 1);
 TSTBIT, SETBIT, CLRBIT, TGLBIT.
Флаги состояния: см. п. 1.17.5.А.
1.17.6. Команды МАС
А) УМНОЖЕНИЕ
Синтаксис:
Допустимые:
регистры xop
MX0 AR
MX1 SR1
MR2 SR0
MR1
MR0
[IF cond] MR = xop *
MF
регистры yop
MY0
MY1
MF
yop
xop
(SS)
;
(SU)
(US)
(UU)
(RND)
условия cond
EQ
LE
NE
NEG
GT
POS
GE
AV
LT
NOT AV
AC
NOT AC
MV
NOT MV
NOT CE
Примеры: IF EQ MR = MX0 * MF (UU); {xop * yop}
MF = SR0 * SR0 (SS); {xop * xop}
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит перемножение операндов источников и сохранение результата в регистре назначения. Операнды содержатся
в регистрах, которые определены в команде. Если назначением является
регистр MF, то в нем сохраняются только биты 31-16 результата, как
наиболее значимые.
Возможна также операция возведения в квадрат xop * xop. Оба xop
должны находится в одном и том же регистре. Такая возможность позволяет вычислять Х2 и  Х2 в одном цикле.
Поле выбора формата данных, которое следует за двумя сомножителями, соответственно определяет формат данного каждого операнда.
Формат может быть знаковым (S) и беззнаковым (U). Если операндами
являются xop и yop, то возможны все комбинации форматов. Если операндами являются xop и xop, то возможны только следующие комбинации
форматов: (SS), (UU), (RND). Синтаксис не предусматривает умолчаний,
поэтому спецификация форматов должна всегда приводиться.
Если выбран формат RND (Round - округлять), то после перемножения двух операндов процессор округляет результат до 24 старших битов
(или до битов 31-16, если при умножении не было переполнения) и получившийся результат сохраняет в регистре назначения. При этом операнды
рассматриваются как знаковые. Округление возможно как смещенное, так
и не смещенное. Выбор типа округления определяется битом 12 в регистре управления автобуферизацией SPORT0, см. п. П1.3.
Флаги состояния:
ASTAT: 7
6
5
4
3
2
1
0
SS MV AQ AS AC AV AN AZ
*
MV (MAC oVerflow – переполнение МАС) – устанавливается, если
не все 9 старших битов регистра MR являются нулями или единицами.
Сбрасывается в противном случае.
Б) УМНОЖЕНИЕ/НАКОПЛЕНИЕ
Синтаксис:
[IF cond] MR = MR + xop *
MF
yop
xop
(SS)
(SU)
(US)
(UU)
(RND)
;
Допустимые регистры xop, регистры yop и условия cond см. п.
1.17.6.А.
Примеры: IF GE MR = MR + MX0 * MY1 (UU); {xop * yop}
MF = MR + MX0 * MX0 (SS); {xop * xop}
Описание: Команда выполняется аналогично команде умножения
(см. п. 1.17.6.А) за исключением того, что результат перемножения операндов суммируется с текущим содержимым регистра MR. Именно сумма сохраняется в регистре назначения.
Флаги состояния: см. п. 1.17.6.А.
В) УМНОЖЕНИЕ/ВЫЧИТАНИЕ
Синтаксис:
[IF[IF
cond]
– xop
* *yopyop (SS)
cond]MRMR= MR
= MR
- xop
(SS) ; ;
MFMF
xopxop (SU)
(SU)
(US)
(US)
(UU)
(UU)
(RND)
(RND)
Допустимые регистры xop, регистры yop и условия cond см. п.
1.17.6.А.
Примеры: IF LT MR = MR – MX1 * MY0 (SU); {xop * yop}
MR = MR – MX0 * MX0 (SS); {xop * xop}
Описание: Команда выполняется аналогично команде умножения
(см. п. 1.17.6.А) за исключением того, что результат перемножения опе-
рандов вычитается из текущего содержимого регистра MR. Именно разность сохраняется в регистре назначения.
Флаги состояния: см. п. 1.17.6.А.
Г) ОЧИСТКА
Синтаксис:
[IF cond] MR = 0;
MF
Допустимые условия cond см. п. 1.17.6.А.
Пример: IF GT MR = 0;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит обнуление либо 40-битного регистра MR, либо 16-битного регистра MF.
Флаги состояния:
ASTAT: 7
6
5
4
SS MV AQ AS
0
MV – всегда сбрасывается.
3
AC
-
2
AV
-
1
AN
-
0
AZ
-
Д) ПЕРЕСЫЛКА MR
Синтаксис:
[IF cond] MR = MR [(RND)];
MF
Допустимые условия cond см. п. 1.17.6.А.
Пример: IF EQ MF = MR (RND);
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит умножение/накопление (см. п.
1.17.6.Б) при yop = 0. Если определено округление (RND), то содержимое
MR может округляться на границе 15-го и 16-го битов. Если в качестве
регистра назначения определен MF, то в нем сохраняются только биты
31-16 регистра MR. Если в качестве регистра назначения определен MК,
то в нем сохраняются все 40 битов регистра MR.
Флаги состояния: см. п. 1.17.6.А.
Е) УСЛОВНОЕ НАСЫЩЕНИЕ MR
Синтаксис: IF MV SAT MR;
Описание: Процессор проверяет состояние флага MV и, если он
установлен, производит насыщение младших 32 бит содержимого 40битного регистра MR. Если флаг MV сброшен, то выполняется команда
NOP (см. п. 1.17.10.г).
Команда дается обычно после выполнения ряда умножений/накоплений. Результат насыщения зависит от состояния флага MV и
знака содержимого регистра MR (старшего значащего разряда (СЗР) регистра MR2). Ниже приведены все возможные комбинации флага MV и СЗР
MR2.
MV СЗР MR2 Содержимое MR после насыщения
0
0
не изменяется
0
1
не изменяется
1
0
00000000 0111111111111111 1111111111111111
1
1
11111111 1000000000000000 0000000000000000
Флаги состояния: не изменяются.
1.17.7. Команды SHIFTER
А) АРИФМЕТИЧЕСКИЙ СДВИГ
Синтаксис:
Допустимые:
регистры xop
SI
AR
SR1 MR2
SR0 MR1
MR0
[IF cond] SR = [SR OR] ASHIFT xop
условия cond
EQ
LE
NE
NEG
GT
POS
GE
AV
LT
NOT AV
(HI) ;
(LO)
AC
NOT AC
MV
NOT MV
NOT CE
Пример: IF LT SR = SR OR ASHIFT SI (LO);
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит арифметический сдвиг битов операнда. Направление и число сдвигов зависит от содержимого регистра SE
(счетная величина).
Положительное число в регистре SE вызывает левый сдвиг, отрицательное – правый сдвиг. Сдвинутый операнд может быть размещен в
старшей половине выходного поля SHIFTER (опция HI) или в младшей
половине (опция LO). Сдвинутый операнд может быть также подвергнут
операции логического ИЛИ с текущим содержимым регистра SR (опция
SR OR).
При размещении сдвинутого операнда в 32-битном выходном поле
слева от СЗР распространяется знак операнда, а справа от самого младшего значащего разряда (МЗР) распространяется ноль. Биты сдвинутого
операнда, выходящие за SR31 (при левом сдвиге) или за SR0 (при правом
сдвиге) опускаются.
При сдвиге с двойной точностью содержимое SE используется для
обеих половин операнда. В первом цикле сдвигается старшая половина
операнда с двойной точностью (команда ASHIFT используется с опцией
HI). Младшая половина операнда с двойной точностью сдвигается с помощью команды LSHIFT, которая использует с опции LO и SR OR. Это
препятствует распространению знака младшей половины операнда, что
может исказить результат сдвига.
Флаги состояния: не изменяются.
Б) ЛОГИЧЕСКИЙ СДВИГ
Синтаксис:
[IF cond] SR = [SR OR] LSHIFT xop
(HI) ;
(LO)
Допустимые регистры xop и условия cond см. п. 1.17.7.А.
Пример: IF GE SR = LSHIFT SI (HI);
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит логический сдвиг битов операнда.
Направление и число сдвигов зависит от содержимого регистра SE (счетная величина).
Положительное число в регистре SE вызывает левый сдвиг, отрицательное – правый сдвиг. Сдвинутый операнд может быть размещен в
старшей половине выходного поля SHIFTER (опция HI) или в младшей
половине (опция LO). Сдвинутый операнд может быть также подвергнут
операции логического ИЛИ с текущим содержимым регистра SR (опция
SR OR).
При левом сдвиге справа от МЗР распространяется ноль, а биты
сдвинутого операнда, выходящие за SR31 опускаются. При правом сдвиге
слева от СРЗ распространяется ноль, а биты сдвинутого операнда, выходящие за SR0 опускаются.
При сдвиге с двойной точностью содержимое SE используется для
обеих половин операнда. В первом цикле сдвигается старшая половина
операнда с двойной точностью (команда LSHIFT используется с опцией
HI). Для сдвига младшей половины операнда с двойной точностью команда LSHIFT использует с опциями LO и SR OR.
Флаги состояния: не изменяются.
В) НОРМАЛИЗАЦИЯ
Синтаксис:
[IF cond] SR = [SR OR] NORM xop
(HI) ;
(LO)
Допустимые регистры xop и условия cond см. п. 1.17.7.А.
Пример: SR = NORM SI (HI);
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит арифметические сдвиги входного
операнда, чтобы убрать все избыточные знаковые биты за исключением
одного. Число сдвигов содержит регистр SE. Этот регистр может быть загружен командой извлечения экспоненты (EXP, см. п. 1.17.7.Г), обычно
это отрицательная величина, равная по модулю числу знаковых битов
минус один.
Сдвинутый операнд может быть размещен в старшей половине выходного поля SHIFTER (опция HI) или в младшей половине (опция LO).
Сдвинутый операнд может быть также подвергнут операции логического
ИЛИ с текущим содержимым регистра SR (опция SR OR).
Если выбрана опция LO, то слева от СРЗ распространяется ноль, а
биты сдвинутого операнда, выходящие за SR31 опускаются.
Все биты правее МЗР обнуляются. Если экспонента результата операции ALU с переполнением была извлечена с модификатором HIX, то
все биты выходного поля SHIFTER левее СЗР заполняются значением бита АС регистра ASTAT при выполнении команды NORM (HI). В этом
случае (SE = 1, см. п. 1.17.7.Г) формируется правый сдвиг.
При сдвиге с двойной точностью содержимое SE используется для
обеих половин операнда. В первом цикле сдвигается старшая половина
операнда с двойной точностью (команда NORM используется с опцией
HI). Для сдвига младшей половины операнда с двойной точностью команда NORM использует с опциями LO и SR OR.
Флаги состояния: не изменяются.
Г) ИЗВЛЕЧЕНИЕ ЭКСПОНЕНТЫ
Синтаксис:
[IF cond] SE = EXP xop
(HI)
(LO)
(HIX)
;
Допустимые регистры xop и условия cond см. п. 1.17.7.А.
Пример: IF GT SE = EXP MR1 (HI);
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит извлечение экспоненты входного
операнда. Обычно это делается перед командой нормализации NORM
(см. п. 1.17.7.В).
Значение экспоненты (счетной величины для команды NORM) формирует детектор экспоненты, который подсчитывает число ведущих знаковых битов. Выходной код детектора экспоненты запоминается в регистре SE. Это значение зависит от режима работы детектора экспоненты:
HI, HIX или LO.
В режиме HI входной операнд интерпретируется как число со знаком
одинарной точности или как старшая половина числа со знаком двойной
точности. Значение экспоненты определяется по следующему правилу:
сначала подсчитывается число избыточных ведущих знаковых битов
(число всех знаковых битов минус один) и затем у получившегося числа
меняется знак на отрицательный. Именно это значение запоминается в регистре SE (см. табл. 1.4).
В режиме HIX входной операнд интерпретируется как результат
операции ALU с возможным переполнением. В этом режиме проверяется
бит AV регистра ASTAT. Если AV установлен (переполнение есть), то в
регистр SE записывается значение +1, в противном случае (AV = 0), результат режима HIX не отличается от результата режима HI (см. табл.
1.5).
В режиме LO входной операнд интерпретируется как младшая половина числа с двойной точностью. Извлечение экспоненты чисел с двойной
точностью достигается выполнением двух команд EXP. Первая команда
применяется к старшей половине числа и используется с модификаторами
HI или HIX. Вторая – применяется к младшей половине числа и используется с модификатором LO. Если старшая половина числа содержит не
знаковый бит, то экспонента всего числа становится известной уже после
выполнения первой команды EXP. Если все биты старшей половины числа знаковые, то формирование значения экспоненты довершит вторая команда EXP (см. табл. 1.6).
Флаги состояния:
ASTAT: 7
6
5
4
3
2
1
0
SS MV AQ AS AC AV AN AZ
*
SS – устанавливается командой EXP в режимах HI или HIX равным
СЗР входного операнда, если AV = 0, в противном случае устанавливается
равным инвертированному значению СЗР входного операнда. Команда
EXP в режиме LO не влияет на этот флаг.
Д) КОРРЕКЦИЯ БЛОЧНОЙ ЭКСПОНЕНТЫ
Синтаксис: [IF cond] SB = EXPADJ xop;
Допустимые регистры xop и условия cond см. п. 1.17.7.А.
Пример: IF GT SB = EXPADJ SI;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит извлечение блочной экспоненты
массива (блока) входных операндов, под которой понимается максимальная экспонента (с учетом знака) из всех экспонент блока. Это значение
находится в регистре SB.
Перед первым использованием команды EXPADJ в регистр SB
должно быть записано значение –16 (минимальная величина). Далее при
каждом вызове команды она извлекает экспоненту и сравнивает ее значение с содержимым регистра SB. Если текущая экспонента больше содержимого регистра SB, то ее значение записывается в регистр SB. В противном случае, содержимое регистра SB не изменяется. Очевидно, что
после обработки всего блока чисел в регистре SB будет находиться максимальная экспонента всего блока.
Команда EXPADJ является инспекционной (проверочной) командой,
поскольку не выполняет никаких сдвигов.
Эта команда не может применяться к переполненным числам и к
младшим половинам чисел с двойной точностью.
Флаги состояния: не изменяются.
Е) НЕПОСРЕДСТВЕННЫЙ АРИФМЕТИЧЕСКИЙ СДВИГ
Синтаксис:
SR = [SR OR] ASHIFT xop BY <exp>
(HI)
(LO)
;
Допустимые регистры xop см. п. 1.17.7.А.
Допустимое значение <exp> – любая константа от –128 до 127.
Пример: SR = SR OR ASHIFT SR0 BY 3 (LO); {нельзя “+3”}
Описание: Процессор производит арифметический сдвиг битов операнда. Направление и число сдвигов зависит от значения экспоненты,
введенной непосредственным числом <exp>.
Положительное значение <exp> (перед ним нельзя ставить знак “+”)
вызывает левый сдвиг, отрицательное – правый сдвиг. Сдвинутый операнд может быть размещен в старшей половине выходного поля SHIFTER
(опция HI) или в младшей половине (опция LO). Сдвинутый операнд может быть также подвергнут операции логического ИЛИ с текущим содержимым регистра SR (опция SR OR).
При размещении сдвинутого операнда в 32-битном выходном поле
слева от СЗР распространяется знак операнда, а справа от МЗР распространяется ноль. Биты сдвинутого операнда, выходящие за SR31 (при левом сдвиге) или за SR0 (при правом сдвиге) опускаются.
При сдвиге с двойной точностью константа <exp> используется для
обеих половин операнда. В первом цикле сдвигается старшая половина
операнда с двойной точностью (команда ASHIFT используется с опцией
HI). Младшая половина операнда с двойной точностью сдвигается с помощью команды LSHIFT, которая использует с опции LO и SR OR. Это
препятствует распространению знака младшей половины операнда, что
может исказить результат сдвига.
Флаги состояния: не изменяются.
Ж) НЕПОСРЕДСТВЕННЫЙ ЛОГИЧЕСКИЙ СДВИГ
Синтаксис:
SR = [SR OR] LSHIFT xop BY <exp>
(HI) ;
(LO)
Допустимые регистры xop см. п. 1.17.7.А.
Допустимое значение <exp> – любая константа от –128 до 127.
Пример: SR = LSHIFT SR1 BY –6 (HI);
Описание: Процессор производит логический сдвиг битов операнда. Направление и число сдвигов зависит от значения экспоненты, введенной непосредственным числом <exp>.
Положительное значение <exp> (перед ним нельзя ставить знак “+”)
вызывает левый сдвиг, отрицательное – правый сдвиг. Сдвинутый операнд может быть размещен в старшей половине выходного поля SHIFTER
(опция HI) или в младшей половине (опция LO). Сдвинутый операнд может быть также подвергнут операции логического ИЛИ с текущим содержимым регистра SR (опция SR OR).
При левом сдвиге справа от МЗР распространяется ноль, а биты
сдвинутого операнда, выходящие за SR31 опускаются. При правом сдвиге
слева от СРЗ распространяется ноль, а биты сдвинутого операнда, выходящие за SR0 опускаются.
При сдвиге с двойной точностью константа <exp> используется для
обеих половин операнда. В первом цикле сдвигается старшая половина
операнда с двойной точностью (команда LSHIFT используется с опцией
HI). Для сдвига младшей половины операнда с двойной точностью команда LSHIFT использует с опциями LO и SR OR.
Флаги состояния: не изменяются.
1.17.8. Команды управления потоком программы
А) КОМАНДА ПЕРЕХОДА
Синтаксис:
[IF cond] JUMP
(I4)
;
(I5)
(I6)
(I7)
<addr>
Допустимые условия cond:
EQ
NE
GT
GE
POS
AV
NOT AV
AC
NOT CE
LT
NOT AC
LE
MV
NEG
NOT MV
Пример: IF NOT CE JUMP top_loop; {CNTR декрементируется}
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит переход на указанный а команде
адрес. Метод адресации перехода может быть прямым или косвенным регистровым.
Прямой адрес <addr> (задается непосредственным операндом или
меткой) располагается в 14-битном поле внутри команды. При косвенной
регистровой адресации в команде задается один из I регистров. После выполнения перехода пост-модификация этого регистра не производится.
Если команда JUMP является последней командой цикла DO UNTIL,
то необходимо корректировать состояния стеков цикла. Если используется условие NOT CE (как в примере), то при выполнении команды регистр
CNTR декрементируется.
Флаги состояния: не изменяются.
Б) КОМАНДА ВЫЗОВА ПОДПРОГРАММЫ
[IF cond] СALL
(I4)
;
(I5)
(I6)
(I7)
<addr>
Допустимые условия cond см. п. 1.17.8.А.
Синтаксис:
Пример: IF AV CALL scale_down;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит переход на указанный а команде
адрес, но предварительно сохраняет в стеке РС адрес возврата. Это делает
удобным вызов подпрограмм.
Метод адресации перехода может быть прямым или косвенным регистровым. Прямой адрес <addr> (задается непосредственным операндом
или меткой) располагается в 14-битном поле внутри команды. При косвенной регистровой адресации в команде задается один из I регистров.
После выполнения перехода пост-модификации этого регистра не производится.
Если команда CALL является последней командой цикла DO UNTIL,
то необходимо корректировать состояния стеков цикла.
Флаги состояния: не изменяются.
В) КОМАНДЫ JUMP И CALL С ФЛАГОМ FLAG_IN
Синтаксис:
IF FLAG_IN
NOT FLAG_IN
JUMP <addr>;
CALL
Пример: IF FLAG_IN JUMP service_proc_three;
Описание: Процессор проверяет состояние своего входа FI и, если
оно соответствует заявленному в команде условию, то выполняются
обычные JUMP или CALL (см. пп. 1.17.8.А, 1.17.8.Б) с прямым методом
адресации переходов.
Флаги состояния: не изменяются.
Г) МОДИФИКАЦИЯ ВЫХОДНЫХ ФЛАГОВ ПРОЦЕССОРА
Синтаксис:
[IF cond]
SET
RESET
TOGGLE
FLAG_OUT
FL0
FL1
FL2
[, …];
Допустимые условия cond см. п. 1.17.8.А.
Пример: IF MV SET FLAF_OUT, RESET FL1;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит модификацию сигналов на своих
выходах FO, FL0-FL2 (см. п. 1.1). Упомянутый в команде сигнал, может
быть установлен (SET), сброшен (RESET) или инвертирован (TOGGLE).
В одной команде можно модифицировать множество флагов, которые записываются через запятые (см. пример).
Флаги состояния: не изменяются.
Д) ВОЗВРАТ ИЗ ПОДПРОГРАММ
Синтаксис: [IF cond] RTS;
Допустимые условия cond см. п. 1.17.8.А.
Пример: IF LE RTS;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит считывание с вершины стека РС
адреса возврата из подпрограммы, который он пересылает в РС. Указатель стека РС при этом соответственно корректируется.
Если RTS является последней командой внутри цикла DO UNTIL, то
необходимо корректировать состояния стеков цикла.
Флаги состояния: не изменяются.
Е) ВОЗВРАТ ИЗ ПРЕРЫВАНИЙ
Синтаксис: [IF cond] RTI;
Допустимые условия cond см. п. 1.17.8.А.
Пример: IF MV RTI;
Описание: Если команда выполняется (условие отсутствует или вернуло TRUE), то процессор производит считывание с вершины стека РС
адреса возврата из обработчика прерываний, который он пересылает в РС.
Указатель стека РС при этом соответственно корректируется. Происходит
также считывание с вершин стеков арифметического состояния (код пересылается в ASTAT), состояния режима (код пересылается в MSTAT) и
маски прерывания (код пересылается в IMASK). Указатели этих стеков
при этом соответственно корректируются.
Если RTI является последней командой внутри цикла DO UNTIL, то
необходимо корректировать состояния стеков цикла.
Флаги состояния: не изменяются.
Ж) ЦИКЛ DO UNTIL
Синтаксис: DO <addr> [UNTIL term];
Допустимые term см. табл. 1.7
Пример: DO loop_label UNTIL CE; {CNTR декрементируется при
каждом прохождении цикла}
Описание: Цикл DO UNTIL организует повторное (циклическое)
выполнение фрагмента программы, который называется телом цикла. Тело цикла начинается командой, которая непосредственно следует за командой цикла. Концом тела цикла является команда, которая отмечена
прямым адресом <addr> (непосредственный операнд или метка).
Выполнение тела цикла повторяется до тех пор, пока выполняется,
записанное в команде цикла условие выхода из цикла. Если условие отсутствует, то цикл становится бесконечным. Условие (сформированное
предыдущими командами) проверяется при выполнении последней команды. Если условием является СЕ, то содержимое регистра CNTR декрементируется при каждом прохождении тела цикла.
Во время выполнения цикла DO адрес последней команды тела цикла (совместно с кодом условия выхода из цикла) хранится в вершине
LOOP стека (см. п. 1.8), а адрес первой команды тела цикла – в вершине
РС стека.
Любое вложение DO циклов продолжает запись в LOOP и РС стеки
до их предельных уровней (4 уровня для LOOP стека и 16 уровней для РС
стека). Попытка нового вложения цикла DO (записи в любой из перечисленных стеков) за пределами указанных уровней вызовет установку битов
переполнения соответствующих стеков и выполнение команды NOP.
Флаги состояния ASTAT: не изменяются.
Флаги состояния SSTAT:
SSTAT: 7
6
5
4
3
2
1
0
LSO LSE SSO SSE CSO CSE PSO PSE
*
0
*
0
LSO – переполнение LOOP стека: устанавливается при переполнении LOOP стека, а противном случае не изменяется.
LSE – LOOP стек пуст: всегда очищается, что говорит о заполнении
LOOP стека.
PSO – переполнение РС стека: устанавливается при переполнении
РС стека, а противном случае не изменяется.
PSE – РС стек пуст: всегда очищается, что говорит о заполнении РС
стека.
З) ЭНЕРГОСБЕРЕЖЕНИЕ
Синтаксис: IDLE;
IDLE(n);
Описание: Команда IDLE вызывает переход процессора в режим
энергосбережения. Только прерывания могут вывести его из этого режима. Если прерывание случилось, то оно обрабатывается (осуществляется
переход на соответствующий обработчик) и выполнение программы продолжается с команды, которая следует за командой IDLE. Обычно такой
командой является команда перехода на IDLE, чтобы опять перевести
процессор в режим энергосбережения. Если команда IDLE является последней внутри тела цикла DO UNTIL, то необходимо предусмотреть
предосторожности, которые описаны в п. 1.8.
IDLE(n) является специальной версией команды IDLE, которая
уменьшает частоту внутренней синхронизации процессора для уменьшения энергопотребления. Коэффициент деления частоты синхронизации
задается параметром n = 16, 32, 64 или 128. После выполнения команды
IDLE(n) процессор остается в рабочем состоянии, но с уменьшенной частотой синхронизации. Пока процессор находится в таком состоянии частота всех внутренних и внешних синхросигналов уменьшается в n раз.
Прерывания также выводят процессор из состояния IDLE(n), но восстановление нормальной частоты происходит по прошествии промежутка
времени не менее n тактов.
Если процессор находится в состоянии IDLE(n) и использует внешнюю синхронизацию последовательного порта, то частота внутренней
синхронизации процессора может быть меньше частоты внешней синхронизации. Это может создать проблемы, поскольку запросы на прерывания
от последовательного порта с прежней интенсивностью процессор обрабатывать не в состоянии по причине сниженной частоты внутренней синхронизации.
Флаги состояния: не изменяются.
1.17.9. Многофункциональные команды
А) ВЫЧИСЛЕНИЯ С ЧТЕНИЕМ ПАМЯТИ
Синтаксис:
<ALU>
, dreg =
<MAC>
<SHIFT>
DM(
I0 , M0
I1
M1
I2
M2
I3
M3
I4
I5
I6
I7
PM(
)
M4
M5
M6
M7
I4 , M4
I5
M5
I6
M6
I7
M7
)
;
Допустимые dreg:
AX0 MX0 SI
AX1 MX1 SE
AY0 MY0 SR0
AY1 MY1 SR1
AR
MR0
MR1
MR2
Описание: Команда выполняет означенную арифметическую операцию одновременно с пересылкой данного. Операция чтения пересылает
содержимое источника в регистр назначения. Метод адресации только регистровый косвенный с последующей модификацией содержимого I регистра. Для линейной (не кольцевой) адресации L регистр, соответствующий I регистру, должен быть обнулен. Содержимое источника записывается в регистр назначения всегда с правым выравниванием.
Операция вычисления должна быть безусловной. Допустимы все команды ALU, MAC и SHIFTER кроме команд непосредственных сдвигов, а
также команд DIVS и DIVQ.
Фундаментальным принципом выполнения многофункциональных
команд является то, что регистры (и память) считываются в начале цикла
выполнения команда, а записываются в конце. Для реализации этого принят обычный (слева направо) порядок записи составляющих элементов
команды: сначала арифметическая операция, а затем операция чтения.
Программист может нарушить этот порядок записи, но ассемблер, выдав
предупреждение, сгенерирует одинаковый машинный код. Выдачу предупреждения можно подавить, отключив проверку семантики с помощью
ключа s.
Принятый порядок доступа к регистрам данных вычислительных
устройств (сначала считывание, потом запись) позволяет использовать
один и тот же регистр в качестве источника для одной операции и приемника для другой. Например, команда
AR = AX0 + AY0, AX0 = DM(I0, M0);
является правильной, причем содержимое АХ0 сначала считывается
для выполнения арифметической операции, а затем записывается операцией пересылки. Можно эту команду записать в обратном порядке
AX0 = DM(I0, M0), AR = AX0 + AY0;
но ассемблер, выдав предупреждение, сформирует такой же машинный код команды как в первом примере.
Запрещается использовать один и тот же регистр как назначение для
обеих операций, поскольку это приводит к непредсказуемому результату,
например, следующая команда неверна, хотя ассемблер выдаст только
предупреждение
AR = AX0 + AY0, AR = DM(I0, M0);
Флаги состояния: флаги устанавливаются арифметическими командами, как они устанавливаются в не многофункциональных командах
(см. пп. 1.17.5-1.17.7).
Б) ВЫЧИСЛЕНИЯ С ПЕРЕСЫЛКОЙ РЕГИСТР-РЕГИСТР
Синтаксис:
<ALU>
<MAC>
<SHIFT>
, dreg = dreg ;
Допустимые регистры dreg см. п. 1.17.9.А.
Пример: AR = AX0 + AY0, AX0 = MR1;
Описание: Процессор выполняет означенную арифметическую операцию одновременно с пересылкой данного. Содержимое источника записывается в регистр назначения всегда с правым выравниванием. Справедливы все положения п. 1.17.9.А.
Флаги состояния: флаги устанавливаются арифметическими командами, как они устанавливаются в не многофункциональных командах
(см. пп. 1.17.5-1.17.7).
В) ВЫЧИСЛЕНИЯ С ЗАПИСЬЮ В ПАМЯТЬ
Синтаксис:
DM(
I0 , M0
I1
M1
I2
M2
I3
M3
I4
I5
I6
I7
PM(
)
M4
M5
M6
M7
I4 , M4
I5
M5
I6
M6
I7
M7
Допустимые dreg см. п. 1.17.9.А.
)
= dreg, <ALU>
<MAC>
<SHIFT>
;
Описание: Команда выполняет означенную арифметическую операцию одновременно с пересылкой данного. Операция записи пересылает
содержимое регистра источника в память назначения. Метод адресации
только регистровый косвенный с последующей модификацией содержимого I регистра. Для линейной (не кольцевой) адресации L регистр, соответствующий I регистру, должен быть обнулен. Содержимое источника
записывается в регистр назначения всегда с правым выравниванием.
Операция вычисления должна быть безусловной. Допустимы все команды ALU, MAC и SHIFTER кроме команд непосредственных сдвигов, а
также команд DIVS и DIVQ.
Фундаментальным принципом выполнения многофункциональных
команд является то, что регистры (и память) считываются в начале цикла
выполнения команда, а записываются в конце. Для реализации этого принят обычный (слева направо) порядок записи составляющих элементов
команды: сначала операция записи памяти, а затем арифметическая операция. Программист может нарушить этот порядок записи, но ассемблер,
выдав предупреждение, сгенерирует одинаковый машинный код. Выдачу
предупреждения можно подавить, отключив проверку семантики с помощью ключа s.
Принятый порядок доступа к регистрам данных вычислительных
устройств (сначала считывание, потом запись) позволяет использовать
один и тот же регистр в качестве источника для одной операции и приемника для другой. Например, команда
DM(I0, M0) = AR, AR = AX0 + AY0;
является правильной, причем содержимое АR сначала считывается
для записи в память, а затем записывается (загружается) в ходе выполнения арифметической операции. Можно эту команду записать в обратном
порядке
AR = AX0 + AY0, DM(I0, M0) = AR;
но ассемблер, выдав предупреждение, сформирует такой же машинный код команды как в первом примере.
Флаги состояния: флаги устанавливаются арифметическими командами, как они устанавливаются в не многофункциональных командах
(см. пп. 1.17.5-1.17.7).
Г) ЧТЕНИЕ ПД И ПП
Синтаксис:
AX0 = DM ( I0 , M0 ),
AX1
I1
M1
MX0
I2
M2
MX1
I3
M3
AY0
AY1
MY0
MY1
= PM (
I4
I5
I6
I7
, M4 );
M5
M6
M7
Описание: Команда производит одновременно две операции чтения
памяти: чтение ПД и чтение ПП. Каждая из этих операций пересылает содержимое ячеек памяти ПД и ПП в регистры назначения, заданные в команде. При этом содержимое ПД пересылается в Х регистры ALU и МАС,
а содержимое ПП – в Y регистры ALU и МАС.
Метод адресации только регистровый косвенный с последующей
модификацией содержимого I регистра. Для линейной (не кольцевой) адресации L регистр, соответствующий I регистру, должен быть обнулен.
Содержимое источника записывается в регистр назначения всегда с правым выравниванием.
На самом деле необходимо считать три слова: два операнда и саму
команду. Если не используется внешняя память, то такое считывание
происходит за один машинный цикл.
Если из внешней памяти необходимо считать два слова, например,
команду и данное или два слова данных из ПД и ПП, то для выполнения
команды необходим еще один дополнительный цикл. Если из внешней
памяти необходимо считать три слова (команда и два слова данных), то
требуется два дополнительных цикла.
Флаги состояния: не изменяются.
Д) ВЫЧИСЛЕНИЯ С ЧТЕНИЕМ ПД И ПП
Синтаксис:
<ALU> , AX0 = DM (
<MAC>
AX1
MX0
MX1
I0 , M0
I1
M1
I2
M2
I3
M3
), AY0 = PM (
AY1
MY0
MY1
I4
I5
I6
I7
, M4 );
M5
M6
M7
Описание: Команда одновременно производит операцию вычисления в ALU или MAC и две операции чтения памяти: чтение ПД и чтение
ПП. Каждая из пересылочных операций пересылает содержимое ячеек
памяти ПД и ПП в регистры назначения, заданные в команде. При этом
содержимое ПД пересылается в Х регистры ALU и МАС, а содержимое
ПП – в Y регистры ALU и МАС.
Метод адресации только регистровый косвенный с последующей
модификацией содержимого I регистра. Для линейной (не кольцевой) адресации L регистр, соответствующий I регистру, должен быть обнулен.
Содержимое источника записывается в регистр назначения всегда с правым выравниванием.
На самом деле необходимо считать три слова: два операнда и саму
команду. Если не используется внешняя память, то такое считывание
происходит за один машинный цикл.
Если из внешней памяти необходимо считать два слова, например,
команду и данное или два слова данных из ПД и ПП, то для выполнения
команды необходим еще один дополнительный цикл. Если из внешней
памяти необходимо считать три слова (команда и два слова данных), то
требуется два дополнительных цикла.
Операция вычисления должна быть безусловной. Допустимы все команды ALU, MAC кроме команд непосредственных сдвигов, а также команд DIVS и DIVQ. Результаты вычислений должны быть записаны в регистры результатов вычислительных блоков: результаты ALU в AR, результаты МАС в MR.
Фундаментальным принципом выполнения многофункциональных
команд является то, что регистры (и память) считываются в начале цикла
выполнения команда, а записываются в конце. Для реализации этого принят обычный (слева направо) порядок записи составляющих элементов
команды: сначала арифметическая операция, а затем операции чтения.
Программист может нарушить этот порядок записи, но ассемблер, выдав
предупреждение, сгенерирует одинаковый машинный код. Выдачу предупреждения можно подавить, отключив проверку семантики с помощью
ключа s.
Принятый порядок доступа к регистрам данных вычислительных
устройств (сначала считывание, потом запись) позволяет использовать
один и тот же регистр в качестве источника для одной операции и приемника для другой. Например, команда
MR=MR+MX0*MY0(UU), MX0 = DM(I0, M0), MY0 = DM(I4, M4);
является правильной, причем содержимое регистров MХ0 и MY0
сначала считывается для выполнения арифметической операции, а затем
записывается операциями пересылки. Можно эту команду записать в обратном порядке
MX0 = DM(I0, M0), MY0 = DM(I4, M4), MR=MR+MX0*MY0(UU);
но ассемблер, выдав предупреждение, сформирует такой же машинный код команды как в первом примере.
Флаги состояния: флаги устанавливаются арифметическими командами, как они устанавливаются в не многофункциональных командах
(см. пп. 1.17.5-1.17.7).
1.17.10. Прочие команды
А) УПРАВЛЕНИЕ СТЕКАМИ
Синтаксис:
[ PUSH STS][, POP CNTR][, POP PC][, POP LOOP];
POP
Пример: POP CNTR, POP PC, POP LOOP;
Описание: Команда управления стеками производит запись и считывание стеков с соответствующей коррекцией указателей стеков. Команда выполняется за один машинной цикл, не смотря на количество указанных в ней стеков
Команда PUSH STS инкрементирует указатель STATUS стека, а затем по новому адресу записывает в стек содержимое следующих регистров: ASTAT, MSTAT и IMASK. Эта команда выполняется автоматически, когда происходит вход в обработчик прерывания.
Все команды POP производят считывание с вершины означенного
стека с последующим декрементированием указателя стека. Отличие команды POP STS заключается в том, что она считывает сразу три стека с
загрузкой следующих регистров: ASTAT, MSTAT и IMASK. Эта команда
выполняется автоматически, когда происходит выход из обработчика
прерывания (выполняется команда RTI).
РС стек автоматически считывается при выполнении команд RTI и
RTS.
Флаги состояния SSTAT:
SSTAT: 7
6
5
4
3
2
1
0
LSO LSE SSO SSE CSO CSE PSO PSE
*
*
*
*
*
PSE – РС стек пуст: устанавливается, если после очередной операции POP стек РС становится пустым, в противном случае сбрасывается.
CSE – стек счетчика циклов пуст: устанавливается, если после очередной операции POP стек счетчика циклов становится пустым, в противном случае сбрасывается.
SSE – STATUS стек пуст: для PUSH STS этот бит всегда сбрасывается (что говорит о не пустом стеке); для POP STS этот бит устанавливается, если после очередной POP операции STATUS стек становится пустым,
в противном случае сбрасывается.
SSO – переполнение STATUS стека: для PUSH STS устанавливается
при переполнении STATUS стека, а противном случае не изменяется.
LSE – LOOP стек пуст: устанавливается, если после очередной POP
операции LOOP стек становится пустым, в противном случае сбрасывается.
Примечание: если происходит переполнение стека, то устанавливается соответствующий ххО бит в регистре SSTAT, как сигнал о потере
информации. Сброс этого бита возможен только сбросом процессора.
Процессор поддерживает специальную версию команды пересылки
регистр-регистр – TOPPCSTACK. Она позволяет при операциях с РС стеком быть назначением не только РС (как в стандартной команде POP РС),
но множеству других регистров. Для считывания с вершины РС стека (с
соответствующей коррекцией указателя стека) можно написать:
reg = TOPPCSTACK; {РС стек считывается в регистр reg}
NOP;
{необходима для корректного завершения считывания }
Кроме того, нет стандартной команды PUSH PC. Чтобы записать в
РС стек определенное значение, можно выполнить следующее:
TOPPCSTACK = reg;
При этом стек загрузится (с соответствующей коррекцией указателя
стека) содержимым reg за один цикл (не надо давать NOP;).
Примечание: в других контекстах использовать TOPPCSTACK запрещается.
Примеры: АХ0 = TOPPCSTACK; {считывание РС в АХ0}
NOP;
TOPPCSTACK = I7;
{запись содержимого I7 в РС стек}
Для команды TOPPCSTACK доступны только следующие регистры:
AX0, AX1, AY0, AY1, AR, MX0, MX1, MY0, MY1, MR0, MR1, MR2, SI,
SE, SR0, SR1, I0-I7, M0-M7, L0-L7. Необходимо учитывать также следующие ограничения:
 Команда TOPPCSTACK не может быть размещена непосредственно
перед командой RTI, они должны разделяться хотя бы одной командой
NOP;
 Команда TOPPCSTACK не может быть последней (и даже предпоследней) командой в теле цикла DO UNTIL;
 Внутри цикла DO UNTIL должно быть одинаковое число записей/чтений РС стека с учетом использования как обычных команд доступа к РС стеку, так и команды TOPPCSTACK.
Б) УПРАВЛЕНИЕ РЕЖИМОМ РАБОТЫ ПРОЦЕССОРА
Синтаксис:
ENA
DIS
BIT_REV
[, …];
AV_LATCH
AR_SAT
SEC_REG
G_MODE
M_MODE
TIMER
Пример: DIS AR_SAT, ENA M_MODE;
Описание: Команда устанавливает (ENA) или (DIS) запрещает означенный режим работы процессора. При этом соответствующий бит режима в регистре состояния режима процессора (MSTAT) устанавливается
командой ENA или сбрасывается командой DIS. После сброса процессора
регистр MSTAT обнулен, поэтому все режимы работы процессора запрещены. Командой можно изменить любое число режимов за один машинный цикл. При этом команды ENA и DIS должны разделяться запятыми.
Названия битов команды являются синонимами названий битов регистра MSTAT (см. табл. 1.12): BIT_REV – RME; AV_LATCH –OLME;
AR_SAT – SME; SEG_REG – DRBS; G_MODE – GME; M_MODE – MRP;
TIMER – TE. Функциональное назначение этих битов описано в п. 1.10.
В) МОДИФИКАЦИЯ АДРЕСНЫХ РЕГИСТРОВ
Синтаксис:
MODIFY(
I0 ,
I1
I2
I3
M0
M1
M2
M3
I4
I5
I6
I7
M4
M5
M6
M7
);
Пример: MODIFY (I1, M1);
Описание: Команда производит сложение содержимого выбранного
I регистра с содержимым выбранного М регистра. Между суммой и содержимым L регистра производится операция модуля, результат этой
операции сохраняется в I регистре. Для линейной (не кольцевой) адресации L регистр, соответствующий I регистру, должен быть обнулен. Допускается комбинировать I и М регистры, принадлежащие одному и тому
же DAG.
Флаги состояния: не изменяются.
Г) НЕТ ОПЕРАЦИИ
Синтаксис: NOP;
Описание: При выполнении команды никакой операции не производится. Команда выполняется за один машинный цикл.
Флаги состояния: не изменяются.
Д) РАЗРЕШЕНИЕ/ЗАПРЕЩЕНИЕ ПРЕРЫВАНИЙ
Синтаксис: ENA INTS;
DIS INTS;
Описание: После сброса процессора все прерывания по умолчанию
разрешены. После выполнения команды DIS INTS все прерывания замаскированы (включая прерывание powerdown) без изменения содержимого
регистра IMASK.
Команда ENA INTS разрешает обслуживание всех незамаскированных прерываний.
Примечание: запрет прерываний не влияет на автобуферицацию последовательных портов и BDMA, IDMA пересылки.
Флаги состояния: не изменяются.
1.18. Инструментальные средства разработки программного
обеспечения
К инструментальным средствам разработки программного обеспечения ADSP-2181 относятся: компиляторы языка высокого уровня (обычно
СИ), ассемблер, линкер и сплиттер (утилита, позволяющая готовить программу для ее загрузки из БП (см. п. 1.15.4)). Такие средства разработаны
как для операционной среды DOS, так и для операционной среды WINDOWS.
1.18.1. Инструментальные средства для DOS
К этим средствам относятся: компилятор языка СИ – G21.exe, ассемблер – asm21.exe, симулятор – sym2181.exe, линкер – ld21.exe, сплиттер –
spl21.exe и EzKitapp.exe – загрузчик программ в EZ-KIT Lite. Установка
этих программных продуктов, а также описание ключей для их запуска из
командной строки DOS (кроме СИ) приводится в [2].
Кроме этого, в директории d:\Adi_Dsp\21xx\Ezkitl (где d – символ
диска, на котором расположены инструментальные средства для DOS)
приводится множество примеров использования перечисленных инструментальных средств, а в директории d:\Adi_Dsp\21xx\Lib расположен
файл архитектуры Adsp2181.ach отладочного стенда EZ-KIT Lite. Имеются примеры программирования также в [2].
В настоящем пособии также приводятся примеры программирования
с использованием инструментальных средств для DOS (см. пп. 1.8, 1.11.1,
1.12.3, 1.12.6). Всех этих примеров достаточно для успешного программирования ADSP-2181 в операционной среде DOS.
1.18.2. Инструментальные средства для WINDOWS
Инструментальным средством для WINDOWS является среда программирования [4] под названием VusualDSP. Компилятор СИ, ассемблер,
линкер, симулятор и сплиттер инкапсулированы (внедрены) в эту среду
вместе с редактором текста, с помощью которого можно создавать программы.
Среда кроме меню содержит три окна: левое, правое и нижнее. Левое
окно (окно проекта) отражает состав проекта (перечень всех файлов,
включенных в проект). Правое окно (окно редактирования) является окном редактора текста, в котором находится выбранный файл, входящий в
состав проекта. Нижнее окно (окно статуса программы) отражает протокол компилирования файлов проекта. Если есть ошибки (синтаксические,
отсутствие определенных программой файлов и т.п.), то их перечень появляется именно в этом окне.
1.18.3. Создание проекта в VisualDSP
Любая программа для ADSP-2181 должна быть частью проекта. Создание проекта осуществляется за несколько шагов:
 В меню выбрать File | New, появится форма с заголовком Новый документ;
 Из списка выбрать Project, появится форма с заголовком Сохранение;
 В этой форме указать директорию, в которой будет сохранен проект;
 В окне редактирования Имя файла ввести имя файла проекта,
например, Async (это имя появится в окне проекта рядом с фирменным
голубым треугольником). Появится форма с заголовком Project
Option. Форма содержит несколько закладок, на каждой из которых
можно задать ту или иную опцию проекта. Существенно задать тип
процессора ADSP-2181, что можно сделать на закладке Project. На
этой же закладке следует выбрать тип генерируемого компилятором
файла – DSP executable file. Все остальные опции можно оставить без
изменения.
Все файлы проекта можно создать выбором File | New. При этом будет появляться форма с заголовком Новый документ, в которой необходимо выбрать Editor File. Окно редактора очистится (или останется пу-
стым) и ему будет присвоено имя Untitled Edit1. Это имя следует заменить
на значимое с помощью выбора File | Save As. Новое имя будет фигурировать в заголовке формы VisualDSP.
Далее вновь образованный файл следует подключить к проекту. Это
осуществляется с помощью выбора Project | Add to Project | File(s). Вновь
созданный файл подключится к проекту, а его имя появится в окне проекта. Каждому вновь подключенному файлу можно назначить уникальные
опции. Для этого его надо отметить щелчком мыши в окне проекта, а затем выбрать Project | File Option. Новые опции назначаются на появившейся форме. Для установки/назначения опций всего проекта необходимо
в окне проекта щелчком мыши отметить имя проекта, а затем сделать выбор Project | Project Option. Новые опции назначаются на появившейся
форме, которая имеет вид совокупности закладок (см. выше).
Таким же образом к проекту можно подключить уже существующий
файл. Для этого необходимо использовать выбор File | Open. Если подключенный файл пуст (новый), то, используя встроенный редактор, в него можно записать программу (на языке СИ или ассемблере) или директивы линкерного файла. Далее проект компилируется с помощью выбора
Project | Build Project или Project | Rebuild All. Созданный файл исполняемой программы загружается в EZ-KIT Lite на исполнение.
Следует помнить, что в файле autoexec.bat должны быть записи:
 SET PATH=”d:\VisualDSP”;%PATH%
 SET PATH=”d:\VisualDSP\System”;%PATH%
где d – обозначение диска со средой VisualDSP.
1.18.4. Загрузка программы в EZ-KIT Lite
Загрузчиком в EZ-KIT Lite является приложение EzKitapp.exe, которое входит в состав инструментальных средств для DOS (см. п. 1.18.1).
Особенностью загрузчика является то, что он загружает исполняемые
файлы с расширением ехе. Такие файлы формирует линкер ld21.exe, входящий в состав инструментальных средств для DOS (см. п. 1.18.1).
Среда VisualDSP формирует исполняемые файлы с расширением
dxe, формат которых отличается от формата файлов ехе. Это делает невозможным загрузку dxe файлов приложением EzKitapp.exe. Проблема
может быть решена с помощью конвертера elf2aexe.exe, который входит в
состав модернизированной библиотеки elf2aexe.dll.
Для упрощения использования конвертора можно создать bat-файл с
именем dxe2exe.bat, в который поместить следующую строку текста:
elf2aexe -x debug\%1
Это справедливо, если на закладке Project опций проекта в разделе
Setting for configuration определена директория debug. Сам bat-файл следует поместить в директорию d:\VisualDSP\System. Далее на закладке Post
Build опций проекта следует определить строку dxe2exe.bat dxe_name,
где dxe_name – имя файла с расширением dxe (само расширение не писать).
Теперь после каждой компиляции в директории debug будут находиться файлы с расширением dxe и ехе. Это дает возможность воспользоваться приложением EzKitapp.exe для загрузки в EZ-KIT Lite вновь созданной программы.
1.19. Примеры программирования в среде VisualDSP
1.19.1. Формирование эхо-сигнала
Задание: с помощью EZ-KIT Lite на выходе кодека AD1847 [5] (далее просто – кодек) сформировать эхо-сигнал от микрофона, подключенного ко входу кодека.
Метод решения: адаптировать для VisualDSP программу, которая
приведена в [2].
Пример иллюстрирует приемы работы с кодеком: инициализацию,
прием и выдачу данных. Приведенная программа может служить основой
для множества приложений, связанных с формированием и обработкой
звуковых сигналов.
Создадим проект с именем echo, в который входят два файла:
echo.asm и echo.ldf. Первый из них является файлом программы, а второй
– линкерным файлом. К файлу программы подключается файл
(Reg2181.inc) определений адресов регистров процессора ADSP-2181.
Этот файл может подключаться к любой программе для указанного процессора. Его текст приводится на рис. 1.14. Важное примечание: VisualDSP не допускает использование символов русского алфавита, поэтому
комментарии на русском языке приведены условно.
//---------- Содержимое файла Reg2181.inc
// Объявление констант
#define IDMA
#define BDMA_BIAD
#define BDMA_BEAD
#define BDMA_BDMA_Ctrl
#define BDMA_BWCOUNT
#define PFDATA
#define PFTYPE
#define SPORT1_Autobuf
#define SPORT1_RFSDIV
#define SPORT1_SCLKDIV
#define SPORT1_Control_Reg
#define SPORT0_Autobuf
#define SPORT0_RFSDIV
#define SPORT0_SCLKDIV
#define SPORT0_Control_Reg
#define SPORT0_TX_Channels0
0x3fe0
0x3fe1
0x3fe2
0x3fe3
0x3fe4
0x3fe5
0x3fe6
0x3fef
0x3ff0
0x3ff1
0x3ff2
0x3ff3
0x3ff4
0x3ff5
0x3ff6
0x3ff7
#define SPORT0_TX_Channels1
#define SPORT0_RX_Channels0
#define SPORT0_RX_Channels1
#define TSCALE
#define TCOUNT
#define TPERIOD
#define DM_Wait_Reg
#define System_Control_Reg
0x3ff8
0x3ff9
0x3ffa
0x3ffb
0x3ffc
0x3ffd
0x3ffe
0x3fff
Рис. 1.14. Содержимое файла определений адресов регистров процессора ADSP-2181
Содержимое файла Reg2181.inc показывает, что встроенный ассемблер VisualDSP поддерживает директиву define и отделение комментариев двумя прямыми слешами. Программа приведена на рис. 1.15.
//---------- Содержимое файла echo.asm
#include "Reg2181.inc"
// Объявление переменных и буферов предваряется именованием секции,
// в которых они будут располагаться физически
.SECTION/DM data_sect;
// Директива ALIGN выравнивает адрес rx_buf[0] на границе кратной
// 4-ем. Это необходимо сделать потому, что буфер rx_buf является
// циклическим, а директива CIRC прежнего ассемблера не
// поддерживается. Кратность выбирается из следующих соображений // это ближайшее сверху к размерности буфера число, кратное целой
// степени двойки. Это применимо и к буферам tx_buf и init_cmds.
.ALIGN 4;
.VAR
rx_buf[3]; // циклический буфер, принимаемых из кодека
// данных (всегда три слова, первое является
// словом состояния кодека, второе – выходом
// левого АЦП, третье – выходом правого АЦП)
.ALIGN 4;
// Циклический буфер, передаваемых в кодек данных (также три слова,
// первое является кодом команды, второе – выводимые данные через
// левый ЦАП, третье – выводимые данные через правый ЦАП)
.VAR
tx_buf[3] = 0xc000, 0x0000, 0x0000;
.ALIGN 16;
// Команды инициализации кодека, первая цифра (с) всех команд
// разрешает изменение управляющих регистров, а также конфигурирует
// кодек на обновление битов переполнения в слове состояния после
// выполнения очередного отсчета
.VAR init_cmds[13] = 0xc003, // усиление по левому входу 1 – 4,5 dB
0xc103, // усиление по правому входу 1 – 4,5 dB
0xc288, // запрет левого дополнительного входа 1
// запрет правого дополнительного входа 1
// запрет левого дополнительного входа 2
// запрет правого дополнительного входа 2
// выключение левого ЦАП
// выключение правого ЦАП
// частота синхронизации 16,9344 МГц,
// частота отсчетов 44,1 КГц, стерео,
// линейное представление отсчетов, 16 бит
0xc909, // запуск автокалибровки с возможностью
// получения данных из кодека
0xca00,
0xcc40, // разрешение двухпроводной связи
0xcd00; // запрет цифрового смешивания сигналов
// Признак окончания инициализации кодека (если stat_flag = 0)
.VAR
stat_flag;
// Объявление (именование) программной секции
.SECTION/PM program_sect;
0xc388,
0xc488,
0xc588,
0xc680,
0xc780,
0xc85b,
jump start;
rti; rti; rti;
// обход области векторов прерываний
rti;
rti; rti; rti;
// вектор прерывания - IRQ2
rti;
rti; rti; rti;
// вектор прерывания - IRQL1
rti;
// вектор прерывания - IRQL0
rti; rti; rti;
// Вектор прерывания SPORT0 tx, сюда процесс приходит перед
// выдачей очередной команды инициализации кодека
ar = dm(stat_flag); // проверка флага stat_flag, если он равен
ar = pass ar;
// нулю, то выход из обработчика;
if eq rti;
// в противном случае – выдача очередной
jump next_cmd; // команды в кодек (переход на метку next_cmd)
// Вектор прерывания SPORT0 rx, сюда процесс приходит после
// получения данных из кодека
jump input_samples;
rti; rti; rti;
rti;
rti; rti; rti;
// вектор прерывания - IRQE
rti;
rti; rti; rti;
// вектор прерывания - BDMA
rti;
rti; rti; rti;
// вектор прерывания - SPORT1 tx или IRQ1
rti;
rti; rti; rti;
// вектор прерывания - SPORT1 rx или IRQ0
rti;
rti; rti; rti;
// вектор прерывания - timer
rti;
rti; rti; rti;
// вектор прерывания - down
// Это начало программы, сюда процесс приходит после ее загрузки
start:
i0 = rx_buf;
// инициализация индексного регистра i0 на
// начало приемного буфера, в отличие от
// прежнего ассемблера, символ ^ опускается
l0 = length(rx_buf);//объявление кольцевого буфера, в отличие
// от прежнего ассемблера, символ %
// заменен директивой "length"
i1 = tx_buf;
// инициализация индексного регистра i1 на
// начало передающего буфера
l1 = length(tx_buf);// передающий буфер – кольцевой
i3 = init_cmds;
// инициализация индексного регистра i3 на
// начало буфера команд кодека
l3 = length(init_cmds);// этот буфер тоже кольцевой
m1 = 1;
//---------- Инициализация последовательного порта 0 (SPORT0)
// Разрешение автобуферизации (см. пп. 1.12.5, П1.3) по приему и
// передаче (RBUF = TBUF = 1), приемный буфер ассоциируется с i0
// (RIREG = 0), передающий буфер ассоциируется с i1 (TIREG = 1), оба
// буфера модифицируются значением 1 (RMREG = TMREG = 1)
ax0 = b#0000001010000111;
dm (SPORT0_Autobuf) = ax0;
ax0 = 0;
dm(SPORT0_RFSDIV) = ax0;
dm (SPORT0_SCLKDIV) = ax0;
// Длина данных – 16 бит, разрешение многоканального режима
// (см. п. 1.12.7) приема/передачи (см. п. П1.4)
ax0 = b#1000011000001111;
dm (SPORT0_Control_Reg) = ax0;
// Для передачи разрешены каналы 2, 1, 0
ax0 = b#0000000000000111;
dm (SPORT0_TX_Channels0) = ax0;
// Для передачи разрешены каналы 18, 17, 16
ax0 = b#0000000000000111;
dm (SPORT0_TX_Channels1) = ax0;
// Для приема разрешены каналы 2, 1, 0
ax0 = b#0000000000000111;
dm (SPORT0_RX_Channels0) = ax0;
// Для приема разрешены каналы 18, 17, 16
ax0 = b#0000000000000111;
dm (SPORT0_RX_Channels1) = ax0;
//---------- Инициализация последовательного порта 1 (SPORT1)
ax0 = 0;
dm (SPORT1_Autobuf) = ax0;
// автобуферизация запрещена
dm (SPORT1_RFSDIV) = ax0;
// RFSDIV не используется
dm (SPORT1_SCLKDIV) = ax0; // SCKDIV не используется
dm (SPORT1_Control_Reg) = ax0;// управляющие функции
// запрещены
//---------- Инициализация таймера
ax0 = 0;
dm (TSCALE) = ax0;
dm (TCOUNT) = ax0;
dm (TPERIOD) = ax0;
// таймер не используется
//---------- Инициализация системы и памяти
ax0 = b#0000000000000000;
// запрет тактов ожидания
dm (DM_Wait_Reg) = ax0;
ax0 = b#0001000000000000;
// разрешение SPORT0
dm (System_Control_Reg) = ax0;
ifc = b#00000011111111;
nop;
icntl = b#00000;
mstat = b#0000000;
// очистка необработанных
// прерываний
// выполнение предыдущей
// команды
// запрет вложенных прерываний
//---------- Инициализация кодека AD1847
ax0 = 1;
// очистка флага окончания
dm (stat_flag) = ax0;
// инициализации кодека
imask = b#0001000000;
// разрешение прерываний
// SPORT0 tx
ax0 = dm (i1, m1);
// запуск прерываний (выдача
tx0 = ax0;
check_init:
ax0 = dm (stat_flag);
af = pass ax0;
if ne jump check_init;
// первой команды)
// ожидание окончания
// инициализации кодека, т.е.
// выполнения условия stat_flag=0
ay0 = 2;
check_acih:
ax0 = dm (rx_buf);
ar = ax0 and ay0;
if eq jump check_acih;
// после инициализации ожидание
// входа кодека в автокалибровку,
// т.е. выполнения условия ACI=1
check_acil:
ax0 = dm (rx_buf);
ar = ax0 and ay0;
if ne jump check_acil;
idle;
// ожидание выхода кодека из
// автокалибровки, т.е.
// выполнения условия ACI=0
ay0 = 0xbf3f;
ax0 = dm (init_cmds + 6);
ar = ax0 AND ay0;
dm (tx_buf) = ar;
idle;
// включение левого ЦАП
ax0 = dm (init_cmds + 7);
ar = ax0 AND ay0;
dm (tx_buf) = ar;
// включение правого ЦАП
ax0 = 0xc901;
dm (tx_buf) = ax0;
idle;
// очистка запроса на
// автокалибровку
ax1 = 0x8000;
dm (tx_buf) = ax1;
// очистка битов переполнения
ifc = b#00000011111111;
// очистка не обработанных
// прерываний
// выполнение предыдущей
// команды
nop;
imask = b#0000100000;
// разрешение прерываний
// SPORT0 rx
//---------- Вход в бесконечный цикл для ожидания прерываний
talkthru:
idle;
jump talkthru;
//---------- ОБРАБОТЧИКИ ПРЕРЫВАНИЙ
//---------- Прием данных (SPORT0 rx)
input_samples:
ena sec_reg;
ax1 = dm (rx_buf + 1);
mx1 = dm (rx_buf + 2);
// использование вторичного
// банка регистров
// прием данных из кодека
// Здесь можно поместить программу обработки данных от кодека,
// например, фильтрацию. Следует учитывать, что данные от АЦП левого
// канала находятся в ах1, а данные от АЦП правого канала – в mx1.
dm (tx_buf + 1) = ax1;
dm (tx_buf + 2) = mx1;
rti;
// выдача данных обратно в кодек
//---------- Инициализация кодека (SPORT0 tx)
next_cmd:
ena sec_reg;
ax0 = dm (i3,m1);
// очередной управляющий код
dm (tx_buf) = ax0;
// помещаем первым словом
// команды кодека
// Проверка окончания инициализации. Если i3 > init_cmds, то
// инициализация не завершена и следует выход из обработчика. Если
// i3 = init_cmds, то инициализация завершается выдачей последней
// команды кодеку с битом МСЕ = 0 (что запрещает изменение
// содержимого управляющих регистров) и сбросом флага stat_flag.
ax0 = i3;
ay0 = init_cmds;
ar = ax0 - ay0;
if gt rti;
ax0 = 0x8000;
// МСЕ = 0
dm (tx_buf) = ax0;
ax0 = 0;
// stat_flag = 0
dm (stat_flag) = ax0;
rti;
Рис. 1.15. Программа формирования эхо-сигнала кодека AD1847
Работа программы рис. 1.15 протекает в два этапа. На первом этапе
происходит инициализация кодека (в обработчике прерываний по переда-
че next_cmd). Это достигается выдачей трехсловной команды, причем
первое слово этой команды каждый раз берется из буфера (массива)
init_cmds. Последующие два слова нулевые.
Инициализация является сложным процессом не только потому, что
приходиться выдавать в кодек множество команд, но еще и потому, что
приходиться ожидать окончание процесса автокалибровки каналов кодека. Все команды кроме последней имеют старшим байтом значение 0хс0,
что, среди прочего, определяет единичное значение бита МСЕ. Это значение разрешает изменение многих конфигурационных регистров кодека,
что, собственно, и позволяет производить инициализацию. Последняя команда имеет старшим байтом значение 0х80, что определяет нулевое значение бита МСЕ, что запрещает изменение многих конфигурационных
регистров кодека, защищая их содержимое от случайных изменений.
Программа echo.asm достаточно закомментирована и не нуждается в
дополнительном описании. Содержимое линкерного файла приведено на
рис. 1.16. Важное примечание: линкер VisualDSP чувствителен к регистру
клавиатуры. Это означает, что названия секций в линкерном файле должны точно совпадать по написанию с названиями секций в ассемблерном
файле.
//---------- Содержимое файла echo.ldf
ARCHITECTURE(ADSP-2181)
// определение типа процессора
SEARCH_DIR( $ADI_DSP\218x\lib ) // определение пути к библиотекам
// Имена файлов, библиотек, ключей берутся из командной строки
$OBJECTS = $COMMAND_LINE_OBJECTS;
// 2181 имеет 16K слов (24-bit) ПП и 16K слов (16-bit) ПД
MEMORY {
// Используется вся доступная область ПП и ПД
prg_area {TYPE(PM RAM) START(0x0000) END(0x37fe) WIDTH(24)}
data_area {TYPE(DM RAM) START(0x0000) END(0x3dfe) WIDTH(16)}
}
PROCESSOR p0 {
LINK_AGAINST( $COMMAND_LINE_LINK_AGAINST )
// Имя выходного файла берется из командной строки
OUTPUT( $COMMAND_LINE_OUTPUT_FILE )
SECTIONS {
// Определение программной секции
sec_code {
// "program_sect" – имя программной секции в файле echo.asm
INPUT_SECTIONS( $OBJECTS(program_sect) )
} >prg_area // см. выше MEMORY
// Определение секции данных
sec_data {
// "data_sect" – имя секции данных в файле echo.asm
INPUT_SECTIONS( $OBJECTS(data_sect))
} >data_area // см. выше MEMORY
}// Здесь заканчивается область действия SECTIONS
}// Здесь заканчивается область действия PROCESSOR p0
Рис. 1.16. Содержимое линкерного файла echo.ldf, входящего в проект echo
Существенными для программиста в линкерном файле являются
разделы MEMORY и PROCESSOR. Первый – позволяет обозначить символическими именами различные области физической ПП или ПД. В
нашем случае области физической ПП с адресами 0x0000…0x37fe присвоено имя prg_area, а области физической ПП с адресами
0x0000…0x3dfe присвоено имя data_area.
Второй – позволяет располагать (с помощью директивы SECTION) в
различных областях физической ПП или ПД различные программные
секции и секции данных. В нашем случае программная секция program_sect будет отнесена с области памяти prg_area, т. е. начинаться с нулевого адреса в ПП, а секция данных data_sect будет отнесена с области
памяти data_area, т. е. начинаться с нулевого адреса в ПД.
1.19.2. Эмуляция интерфейса RS-232
Задание: с помощью EZ-KIT Lite программно эмулировать работу
коммуникационного интерфейса RS-232 в двух вариантах: с использованием флагов FLAG_IN, FLAG_OUT; с использованием битов PF[1], PF[2].
Метод решения: адаптировать для VisualDSP программу uart.dsp,
которая входит в состав монитора EZ-KIT Lite (программные средства для
DOS (см. п. 1.18.1)).
Задача актуальна тем, что процессор ADSP-2181 не содержит асинхронного коммуникационного порта, который мог бы поддерживать
очень распространенный интерфейс типа RS-232. Приведенная программа
позволяет устранить этот недостаток.
Создадим проект с именем async, в который входят два файла:
async.asm и async.ldf. Первый из них является файлом программы, а второй – линкерным файлом. К файлу программы подключается файл
(Reg2181.inc) определений адресов регистров процессора ADSP-2181.
Эмулируемое устройство назовем UART. Программа (async.asm) поддержки UART приведена на рис. 1.17.
//---------- Содержимое файла async.asm
#include <Reg2181.inc>;
// Частота кварцевого резонатора в КГц
#define CRYSTAL_FREQ_IN_kHZ
16667
{
Для поддержки интерфейса RS-232 ADSP-2181 в составе EZ-KIT Lite
использует ресурсы FLAG_IN, FLAG_OUT и TIMER следующим образом:
ADSP-2181 FLAG_OUT ----------> AD233 ----------> RS-232 TX
ADSP-2181 FLAG_IN <----------- AD233 <---------- RS-232 RX
(TIMER определяет скорость обмена)
Или (в зависимости от определения HOST):
ADSP-2181 PF[2] ----------> AD233 ----------> RS-232 TX
ADSP-2181 PF[1] <---------- AD233 <---------- RS-232 RX
Формат посылки (число информационных бит, число стоп бит, наличие/отсутствие контроля по четности) и скорость обмена задаются программно. Преобразование логических уровней сигналов RxD и TxD в
уровни интерфейса RS-232 производится микросхемой AD233.
Подпрограммы инициализации передатчика и приемника функционируют независимо друг от друга. Передача и прием данных синхронизируются сигналами таймера. Это не мешает производить одновременный
асинхронный (по отношению друг к другу) прием/передачу. По умолчанию приемник заблокирован (выключен), поэтому перед его использованием необходимо вызвать подпрограмму "turn_rx_on".
Используемые подпрограммы:
init_uart
Должна быть вызвана после сброса системы.
get_char_ax1 Ожидание приема байта с линии RX и возврат
его через ax1.
out_char_ax1 Ожидание текущей выдачи байта через линию
TX и выдача следующего байта из ax1.
turn_rx_on
Разрешение работы приемника.
turn_rx_off Запрет работы приемника.
Используемый флаг: DM(flag_rx_ready)
Если flag_rx_ready содержит все единицы, то это означает, что
UART готов получать данные. Если flag_rx_ready содержит все нули, то
это означает, что UART уже получает данные. Может использоваться для
управления потоком данных по протоколу xon, xoff.
}
// Если определено символическое имя HOST, то используются флаги
// FLAG_IN, FLAG_OUT, в противном случае биты PF[1], PF[2]
#define HOST
// Следующие константы могут быть изменены для установки новых
// параметров UART
#define tx_num_of_bits 10
// старт бит + информ. биты + стоп биты
#define rx_num_of_bits 8
// информ. биты (старт&стоп биты не
// считаются)
#define RX_BIT_ADD 0x0100 // = 1<<rx_num_of_bits
#define TX_BIT_ADD 0xfe00 // = 0xffff<<(информационные биты + 1)
#define Baud
9600
// скорость обмена в Бод
// PERIOD == 1144
{
PERIOD - период прерываний таймера (в 3 раза меньше битового
интервала). Коэффициент 2000 переводит частоту кварцевого резонатора
в КГц в частоту внутренней синхронизации ADSP-2181 в Гц.
}
#define PERIOD (CRYSTAL_FREQ_IN_kHZ * 2000 / (3 * Baud)) – 1
// Объявление секции данных
.SECTION/DM UART_DATA;
.VAR flag_rx_off;
// индицирует выключенное состояние приемника
.VAR flag_tx_ready;
// 1 - передачи нет, 0 - передача есть
.VAR flag_rx_ready;
// 1 - приема нет, 0 - прием есть
.VAR flag_rx_stop_yet; // 1 - стоп бит не достигнут, 0 - достигнут
.VAR flag_rx_no_word; // 0 - принятый символ находится в user_rx_buffer,
// в противном случае - 1
.VAR timer_tx_ctr;
// делитель на 3 передатчика, таймер работает
// на частоте 3 x скорость обмена
.VAR timer_rx_ctr;
// делитель на 3 приемника, таймер работает
// на частоте 3 x скорость обмена
.VAR user_tx_buffer;
// регистр данных передатчика UART
.VAR user_rx_buffer;
// регистр данных приемника UART
.VAR internal_tx_buffer; // сдвиговый регистр передатчика, именно в нем
// форматируется посылка (добавляются старт и
// стоп биты), в него перед отправкой
// копируется содержимое user_tx_buffer
.VAR internal_rx_buffer; // сдвиговый регистр приемника
.VAR bits_left_in_tx;
// число оставшихся для передачи битов
.VAR bits_left_in_rx;
// число оставшихся для приема битов
// Объявление программной секции
.SECTION/PM UART_CODE;
jump start;
rti; rti; rti;
rti;
// вектор прерывания - IRQ2
rti; rti; rti;
rti;
// вектор прерывания - IRQL1
rti; rti; rti;
rti;
// вектор прерывания - IRQL0
rti; rti; rti;
rti;
// вектор прерывания - SPORT0 tx
rti; rti; rti;
rti;
// вектор прерывания - SPORT0 rx
rti; rti; rti;
rti;
// вектор прерывания - IRQE
rti; rti; rti;
rti;
// вектор прерывания - BDMA
rti; rti; rti;
rti;
rti; rti; rti;
rti;
rti; rti; rti;
jump process_a_bit;
rti; rti; rti;
rti;
rti; rti; rti;
// вектор прерывания - SPORT1 tx или IRQ1
call init_uart;
call turn_rx_on;
// инициализация UART
// разрешение приема данных
call get_char_ax1;
call out_char_ax1;
jump next_byte;
// ожидание и прием символа из UART
// выдача принятого символа в UART
// вектор прерывания - SPORT1 rx или IRQ0
// вектор прерывания - timer
// вектор прерывания - power down
start:
next_byte:
//---------- Подпрограмма инициализации
{
Использование регистров:
вход:
нет
обновленные: imask
выход:
нет
измененные: ar, ax0, ay0
сохраняемые: нет
память:
dm (TSCALE)=0, dm(flag_tx_ready)=1,
dm(flag_rx_ready)=1, dm(flag_rx_stop_yet)=1,
dm(flag_rx_no_word)=1, dm(flag_rx_off)=1
flag_out/PF[2]
вызовы:
нет
}
init_uart:
ax0=0;
dm(TSCALE)=ax0; // декремент TCOUNT каждый
// машинный цикл
ax0=PERIOD;
// установка скорости обмена (9600 Бод)
dm(TCOUNT)=ax0;
dm(TPERIOD)=ax0; // прерывания генерируются с тройной
// частотой
ax0=1;
dm(flag_tx_ready)=ax0;
// передачи нет
dm(flag_rx_ready)=ax0;
// установки режима по умолчанию
// (UART занят)
dm(flag_rx_stop_yet)=ax0;
dm(flag_rx_no_word)=ax0;
dm(flag_rx_off)=ax0;
// приемник выключен
#ifdef HOST
set flag_out;
// TxD = 1
#else
ax0 = dm(PFTYPE);
// PF[2] - TxD
ar = setbit 2 of ax0;
dm(PFTYPE) = ar;
ax0 = dm(PFDATA);
// TxD = 1
ar = setbit 2 of ax0;
dm(PFDATA) = ar;
#endif
ifc = b#00000011111111;
// очистка запросов прерываний
nop;
// ожидание очистки
ax0 = b#0000100000000000;
ay0 = dm (System_Control_Reg);
ar = ax0 or ay0;
// разрешение SPORT1
ay0 = b#1111101111111111;
ar = ar and ay0;
// очистка для разрешения FI, и т.д.
dm (System_Control_Reg) = ar;
ax0=imask;
ay0=b#0000000001;
ar=ax0 or ay0;
imask=ar;
// разрешение прерываний TIMER
ena timer;
// запуск TIMER
rts;
//---------- Подпрограмма останова UART
{
Использование регистров:
вход:
нет
обновленные: imask
выход:
нет
измененные: ar, ay0
сохраняемые: нет
память:
нет
flag_out/PF[2]
вызовы:
нет
}
stop_uart:
dis timer;
// останов TIMER
#ifdef HOST
set flag_out;
// TxD = 1
#else
ax0 = dm(PFDATA);
// TxD = 1
ar = setbit 2 of ax0;
dm(PFDATA) = ar;
#endif
ifc = b#00000011111111;
nop;
ar=imask;
ay0=b#1111111110;
ar=ar and ay0;
imask=ar;
rts;
// очистка запросов на прерывания
// ожидание очистки
// запрет прерываний TIMER
//---------- Обработчик прерываний TIMER
{
Эта подпрограмма является основной частью UART. Она вызывается
запросом на прерывание TIMER, т.е. с частотой в три раза большей частоты обмена. Подпрограмма формирует выходной бит данных установкой/сбросом сигнала на выходе FLAG_OUT/PF[2] ADSP-2181.
Далее проверяет наличие режима приема данных. Если таковой присутствует, то к принимаемому данному пристыковывается очередной бит
с входа FLAG_IN/PF[1] ADSP-2181, после чего входные данные сдвигаются на один разряд вправо.
Если режим приема данных отсутствует, то проверяется старт бит.
Поскольку интервальный таймер работает на тройной частоте скорости
обмена, то прием/ передача возможны в каждое третье прерывание.
}
{
Использование регистров:
вход:
нет
обновленные: нет
выход:
нет (вторичный банк регистров)
измененные: нет
сохраненные: нет
память:
dm(flag_tx_ready), dm(timer_tx_ctr), dm(internal_tx_buffer),
dm(bits_left_in_tx), dm(flag_rx_off), dm(flag_rx_stop_yet),
dm(timer_rx_ctr), dm(flag_rx_ready), dm(internal_rx_buffer),
dm(flag_rx_no_word), dm(bits_left_in_rx)
flag_out/PF[2]
вызовы:
нет
}
process_a_bit:
ena sec_reg;
// подключение вторичного банка регистров
ax0=dm(flag_tx_ready); // если не передача, то переход на прием
none=pass ax0;
if ne jump receiver;
// Передающая секция
ay0=dm(timer_tx_ctr); // проверка timer_tx_ctr на 0,
ar=ay0-1;
dm(timer_tx_ctr)=ar;
if ne jump receiver;
// если не 0, то декремент, сохранение
// и переход на прием, в противном
// случае передача
sr1=dm(internal_tx_buffer);
// Сдвиг вправо младшего значащего разряда internal_tx_buffer в SR1.
// В SR0 этот бит является знаковым, в соответствии с ним
// FLAG_OUT/PF[2] сбрасывается или устанавливается
sr=lshift sr1 by -1 (hi);
dm(internal_tx_buffer)=sr1;
ar=pass sr0;
#ifdef HOST
if ge reset flag_out;
if lt set flag_out;
#else
ax0 = dm(PFDATA);
if ge ar = clrbit 2 of ax0;
if lt ar = setbit 2 of ax0;
dm(PFDATA) = ar;
#endif
// восстановление timer_tx_ctr, т.е.
// следующий бит будет передан
// через три прерывания
ay0=dm(bits_left_in_tx); // декремент оставшихся для передачи
ar=ay0-1;
// битов
dm(bits_left_in_tx)=ar;
if gt jump receiver; // если биты остались, то переход на прием
ay0=3;
dm(timer_tx_ctr)=ay0;
ax0=1;
dm(flag_tx_ready)=ax0;
// Приемная секция
receiver:
ax0=dm(flag_rx_off);
none=pass ax0;
if ne rti;
// в противном случае - сброс флага
// необходимости передачи
// приемник включен?
// если нет, то выход
ax0=dm(flag_rx_stop_yet);// проверка приема стоп бита,
none=pass ax0;
// если нет, то переход на прием
if ne jump rx_test_busy; // предыдущих битов
ay0=dm(timer_rx_ctr);
ar=ay0-1;
dm(timer_rx_ctr)=ar;
if ne rti;
// стоп бит достигнут, декремент
// timer_rx_ctr, если не 0, то выход
// (выдержка битового интервала)
ax0=1;
// битовый интервал стоп бита выдержан,
dm(flag_rx_stop_yet)=ax0;// восстановление flag_rx_stop_yet,
dm(flag_rx_ready)=ax0; // сброс flag_rx_ready,
ax0=dm(internal_rx_buffer);// копирование принятого символа из
dm(user_rx_buffer)=ax0; // internal_rx_buffer в user_rx_buffer
ax0=0;
// индикация нахождения принятого слова
dm(flag_rx_no_word)=ax0;// в user_rx_buffer
rti;
rx_test_busy:
ax0=dm(flag_rx_ready); // проверка наличия режима приема,
ar=pass ax0;
// если прием идет, то переход на прием
if eq jump rx_busy; // очередного бита, в противном случае // проверка старт бита
#ifdef HOST
if flag_in jump rx_exit;
// если flag_in=1, то старт бита нет –
// выход
#else
ax0=dm(PFDATA);
// если PF[1]=1, то старт бита нет –
ay0 = 2;
// выход
ar = ax0 and ay0;
if ne jump rx_exit;
#endif
ax0=0;
dm(flag_rx_ready)=ax0 // в противном случае, устанавливаем
dm(internal_rx_buffer)=ax0; // флаг режима приема и очищаем
// приемный регистр
ax0=4;
// первый бит необходимо проверить через
dm(timer_rx_ctr)=ax0;
// 4 прерывания, чтобы проверка
// пришлась на середину его битового
// интервала
ax0=rx_num_of_bits;
// инициализация числа оставшихся
dm(bits_left_in_rx)=ax0; // для приема битов
rx_exit:
rti;
rx_busy:
ay0=dm(timer_rx_ctr);// декремент timer_rx_ ctr и проверка его
ar=ay0-1;
// на 0, если не 0, то битовый интервал
dm(timer_rx_ctr)=ar; // не выдержан - выход
if ne rti;
rcv:
// Битовый интервал выдержан, прием очередного бита
ax0=3;
// восстановление счетчика бит. интервала
dm(timer_rx_ctr)=ax0;
// проверка следующего бита
// произойдет через три прерывания
ay0=RX_BIT_ADD;
ar=dm(internal_rx_buffer);
#ifdef HOST
// Если flag_in=0, то переход на сдвиг
if not flag_in jump pad_zero;
#else
ax0 = dm(PFDATA); // если PF[1] =0, то переход на сдвиг
ay1 = 2;
af = ax0 and ay1;
if eq jump pad_zero;
#endif
// подстыковка 1
ar=ar+ay0;
pad_zero:
sr=lshift ar by -1 (lo);
// сдвиг вправо результата для
dm(internal_rx_buffer)=sr0; // подготовки к приему следующего
// бита
ay0=dm(bits_left_in_rx);
// декремент счетчика оставшихся
ar=ay0-1;
// битов, если осталось один или
dm(bits_left_in_rx)=ar;
// более битов, то выход (остаемся в
if gt rti;
// режиме приема), в противном
// случае – осталось сформировать
// стоп бит
ax0=3;
// восстановление счетчика битового интервала
dm(timer_rx_ctr)=ax0;
ax0=0;
// установка флага стоп бита
dm(flag_rx_stop_yet)=ax0;
rti;
//---------- Выдача содержимого user_tx_buffer в канал UART
{
Использование регистров:
вход:
нет
обновленные: нет
выход:
нет
измененные: ar, ax0, sr
сохраненные: нет
память:
dm(timer_tx_ctr), dm(bits_left_in_tx), dm(user_tx_buffer),
dm(internal_tx_buffer), dm(flag_tx_ready)
вызовы:
нет
}
invoke_UART_transmit:
ax0=3;
// инициализация делителя частоты
dm(timer_tx_ctr)=ax0; // прерываний, это необходимо из-за
// того, что частота прерываний в 3 раза
// больше частоты обмена
ax0=tx_num_of_bits; // инициализация числа передаваемых
dm(bits_left_in_tx)=ax0;// битов, включая стоп бит и бит
// четности, определяется программистом
{
Формирование кода в internal_tx_buffer в следующем формате:
15 14 13 12 11 10 09 08 07 06 05 04 03 02
1
1
1
1
1
1
1 d7 d6 d5 d4 d3 d2 d1
T
Передаваемый байт
где: Т - стоп бит, S - старт бит.
}
sr1=0;
sr0=TX_BIT_ADD;
ar=dm(user_tx_buffer);
sr=sr or lshift ar by 1 (lo);
dm(internal_tx_buffer)=sr0;
01
d0
00
0
S
ax0=0;
// поднимаем флаг передачи
dm(flag_tx_ready)=ax0;
rts;
//---------- Прием символа из UART
{
Использование регистров:
вход:
нет
обновленные: нет
выход:
ах1 (старшие 8 бит всегда сброшены)
измененные: ax0
сохраненные: нет
память:
dm(flag_rx_no_word), dm(user_rx_buffer),
dm(flag_rx_no_word)
вызовы:
нет
}
get_char_ax1:
ax0=dm(flag_rx_no_word); // ожидание приема символа,
none=pass ax0;
// должно выполниться условие
// flag_rx_no_word = 0
if ne jump get_char_ax1;
get_char_ax1x:
ax1=dm(user_rx_buffer); // принятый символ пересылаем в ах1
ax0=1;
dm(flag_rx_no_word)=ax0; // дезактивируем flag_rx_no_word
rts;
//---------- Прием символа из UART с тайм-аутом
{
Тайм-аут и возврат 0xffff после 500 mS.
(15000 ticks / 3 == 5000 bps ~= 5000 / 9600 ~= .5 S)
}
{
Использование регистров:
вход:
нет
обновленные: нет
выход:
ах1 (все 16 бит установлены, если тайм-аут)
измененные: ax0
сохраненные: нет
память:
dm(flag_rx_no_word), dm(user_rx_buffer)
вызовы:
нет
}
get_char_ax1_to:
ax1 = ar;
// сохраняем ar
ar = 30000;
// 3 тика на бит; 9600 bps, тайм-аут
// в 1 sec ==> 9600 * 3 == 30000
get_char_ax1_to1:
idle;
// ожидание прерываний таймера
ar = ar - 1;
if eq jump get_char_ax1_to2; // тайм-аут достигнут, выход
ax0=dm(flag_rx_no_word);
none=pass ax0;
if ne jump get_char_ax1_to1; // ожидание приема символа
ar = ax1;
// символ принят, восстановление ar
jump get_char_ax1x; // чтение принятого символа
get_char_ax1_to2:
ar = ax1;
ax1 = 0xffff;
rts;
// восстановление ar
// установка признака тайм-аута
//---------- Вывод символа через UART
{
Использование регистров:
вход:
ах1 (сохраняется)
обновленные: нет
выход:
нет
измененные: ax0, (ar, sr)
сохраненные: нет
память:
dm(flag_tx_ready), dm(user_tx_buffer), (dm(timer_tx_ctr),
dm(bits_left_in_tx), dm(internal_tx_buffer))
invoke_UART_transmit
вызовы:
}
out_char_ax1:
ax0=dm(flag_tx_ready);
none=pass ax0;
if eq jump out_char_ax1;
// ожидание выдачи предыдущего
// символа
dm(user_tx_buffer)=ax1;
call invoke_UART_transmit; // выдача нового символа
rts;
//---------- Разрешение приема
{
Использование регистров:
вход:
нет
обновленные: нет
выход:
нет
измененные: ax0 = 0
сохраненные: нет
память:
dm(flag_rx_off)
вызовы:
нет
}
turn_rx_on:
ax0=0;
dm(flag_rx_off)=ax0;
rts;
//---------- Запрет приема
{
Использование регистров:
вход:
нет
обновленные: нет
выход:
нет
измененные: ax0 = 1
сохраненные: нет
память:
dm(flag_rx_off)
вызовы:
нет
}
turn_rx_off:
ax0=1;
dm(flag_rx_off)=ax0;
rts;
Рис. 1.17. Программа поддержки UART
Программа поддержки UART принимает символы из коммуникационного канала, а затем возвращает их обратно (см. бесконечный цикл, тело которого начинается с метки next_byte). Прием осуществляется подпрограммой get_char_ax1 (принятый символ возвращается через регистр
ах1), а выдача – подпрограммой out_char_ax1 (выдаваемый символ берется из регистра ах1).
Перед использованием подпрограмм get_char_ax1 и out_char_ax1
UART необходимо проинициализировать подпрограммой init_uart, а также разрешить прием данных подпрограммой turn_rx_on. Для приема данных из коммуникационного канала связи кроме подпрограммы
get_char_ax1 можно использовать подпрограмму get_char_ax1_to, которая
отличается наличием тайм-аута. Тайм-аут длится 30000 тиков таймера,
что составляет 10000 битовых интервалов. Для частоты связи в 9600 Бод
длительность битового интервала составляет 104 мкс, поэтому длительность тайм-аута составляет 1,04 с. Для деинициализации UART определена подпрограмма stop_uart.
Программа содержит также две внутренние подпрограммы: process_a_bit и invoke_UART_transmit. Первая из них является обработчиком
прерываний таймера и осуществляет все действия для побитной выдачи
(приема) данных в коммуникационный канал связи. После выдачи/приема
очередного байта данных устанавливает соответствующие флаги. Вторая
– подготавливает байт данных для вывода.
Все перечисленные подпрограммы достаточно закомментированы,
чтобы понять их работу без дополнительных разъяснений. Файл async.ldf
может быть получен из файла echo.ldf (см. рис. 1.16) путем замен:
program_sect – UART_CODE, data_sect – UART_DATA.
1.19.3. Эмуляция интерфейса RS-232 (смешанный вариант)
Задание: см. задание в п. 1.19.2. Главную часть программы рис. 1.17
(от метки start до метки init_uart) написать на языке С. Вызываемые подпрограммы написать на языке ассемблера.
Метод решения: использовать в качестве основы программу рис.
1.17.
Актуальность смешанного программирования объясняется тем, что
сложные проекты проще реализовывать на языке высокого уровня,
например, СИ. Но полностью выполненный на языке высокого уровня
проект обладает большим объемом программы и относительно низким ее
быстродействием. Эти недостатки можно существенно уменьшить, если
функции (подпрограммы) писать на языке ассемблера, а их вызовы производить из программы, написанной на языке высокого уровня. Рассматриваемые ниже программы иллюстрируют такой подход.
Проект имеет имя AsyncMix и содержит шесть файлов:
218x_int_tab.asm – ASM файл векторов прерываний программы;
218x_hdr.asm – ASM файл пролога программы; 218x_exit.asm – ASM файл
эпилога программы; async.c – СИ программа (рис. 1.18), uart.asm – ASM
программа (рис. 1.19) и AsyncMix.ldf – линкерный файл (рис. 1.20). Первые три файла находятся в директории ..VisualDSP\218x\lib\crt_src.
//---------- Содержимое файла async.c
#include <Signal.h>
unsigned short ch;
// принимаемый из UART символ
void (*dm handler)(dm int); // переменная, в которой хранится указатель
// на обработчик прерываний таймера
//---------- Функции, определенные в uart.asm
extern void init_uart(void);
extern void stop_uart(void);
extern unsigned short char_received(void);
extern unsigned short get_char(void);
extern void out_char(unsigned short);
extern void turn_rx_on(void);
extern void turn_rx_off(void);
extern void process_a_bit(int);
void main(void) {
handler = process_a_bit;
// инициализация указателя на обработчик
// прерывания от таймера
// Запись адреса обработчика прерываний в таблицу векторов
// прерываний. Константа SIGTIMER определена в Signal.h
interrupt(SIGTIMER, handler);
init_uart();
// инициализация UART
turn_rx_on();
// разрешение приема из UART
while(1) {
ch = get_char(); // ожидание и прием символа из UART
out_char(ch);
// эхо-возврат принятого символа
}
}
Рис. 1.18. СИ программа поддержки UART
Программа, представленная на рис. 1.18, функционально идентична
фрагменту программы рис. 1.17, который начинается с метки start и заканчивается меткой init_uart. Все используемые функции определены в
файле uart.asm, поэтому должны быть объявлены с классификатором extern. Функции, имеющие одинаковое имя на рисунках 1.17, 1.18, имеют
одинаковое назначение.
К таким же функциям относятся get_char и get_char_ax1, а также
out_char и out_char_ax1. Изменение имен get_char_ax1 и out_char_ax1 про-
изошло для упрощения их записи, а также в связи с тем, что прямое указание регистра источника и назначения (ах1) теперь не актуально.
Единственной новой функцией является функция char_received(), которая возвращает TRUE, если символ принят из UART и FALSE в противном случае. Эту функцию удобно использовать перед вызовом функции get_char(), которая может зациклиться, если из последовательного канала не приходят данные.
//---------- Содержимое файла uart.asm
// Объявление экспортируемых имен функций, чтобы они стали
// доступными в других модулях проекта
.GLOBAL _init_uart, _stop_uart, _get_char, _out_char;
.GLOBAL _char_received, _turn_rx_on, _turn_rx_off;
.GLOBAL _process_a_bit;
{
Далее следуют строки программы рис. 1.17, начиная с #include
<Reg2181.inc> и заканчивая строкой SECTION/PM UART_CODE. Строки
jump start;… start: необходимо опустить, они находятся в файле
218x_int_tab.asm. Необходимо также опустить строки start:…jump
next_byte;, они заменены С-программой (см. рис. 1.18).
}
…
_init_uart:
// Тело подпрограммы полностью идентично телу подпрограммы init_uart
// на рис. 1.17
rts
_stop_uart:
// Тело подпрограммы полностью идентично телу подпрограммы stop_uart
// на рис. 1.17
rts
_process_a_bit:
// Тело подпрограммы полностью идентично телу подпрограммы
// process_a_bit на рис. 1.17, только все команды rti необходимо заменить
// на команды rts
rts
invoke_UART_transmit:
// Тело подпрограммы полностью идентично телу подпрограммы
// invoke_UART_transmit на рис. 1.17
rts
_char_received:
ax1 = 1;
ax0=dm(flag_rx_no_word);
none=pass ax0;
if eq rts;
// если символ из UART получен, то возвращаем 1
ax1 = 0;
// в противном случае возвращаем 0
rts;
_get_char:
// Тело подпрограммы полностью идентично телу подпрограммы
// get_char_ax1 на рис. 1.17
rts;
_out_char:
ax0=dm(flag_tx_ready);
none=pass ax0;
if eq jump _out_char; // ожидание передачи предыдущего
// символа
// Формирование указателя (I6) на передаваемый параметр функции
I6 = I4; M5 = 1; MODIFY(I6, M5);
{Pop arg1}
AX1 = DM(I6, M5);
dm(user_tx_buffer)=ax1;
call invoke_UART_transmit; // выдача его в UART
rts;
_turn_rx_on:
// Тело подпрограммы полностью идентично телу подпрограммы
// turn_rx_on на рис. 1.17
rts;
_turn_rx_off:
// Тело подпрограммы полностью идентично телу подпрограммы
// turn_rx_off на рис. 1.17
rts;
Рис. 1.19. ASM программа поддержки UART
Программа рис. 1.19 практически полностью соответствует программе рис. 1.17. Отличие заключается в том, что экспортируемые имена
предваряются подчеркиванием (соглашение языка С) и объявляются директивой GLOBAL. Небольшое отличие наблюдается в функции
_out_char. Ее аналог out_char_ax1 принимает символ (для выдачи в
UART) в регистре ах1, а _out_char – через программный стек Поэтому в
индексном регистре I6 формируется указатель на выдаваемый символ,
хранящийся в стеке.
Передаваемые в качестве параметров функции значения хранятся по
следующим адресам: первый аргумент – в SP + 1, второй – в SP + 2 и т.д.
SP хранится в индексном регистре I4, поэтому первым шагом при формировании указателя на передаваемый параметр является I6 = I4. Затем в
модификационный регистр М5 записывается 1 и окончательно командой
MODIFY(I6, M5); формируется указатель.
Простота адаптации уже написанных программ на ассемблере позволяет широко использовать их в программах на СИ. Необходимо только
следить, чтобы соблюдались соглашения об доступных (scratch), сохраняемых (preserved) и предопределенных (dedicated) регистрах.
//---------- Содержимое файла AsyncMix.ldf
ARCHITECTURE(ADSP-2181)
// определение типа процессора
SEARCH_DIR( $ADI_DSP\218x\lib ) // определение пути к библиотекам
// Имена файлов, библиотек, ключей берутся из командной строки,
// необходимо также подключить libc.dlb, но это можно сделать также
// через Project | Project Options | Link | Additional options: libc.dlb
$OBJECTS = $COMMAND_LINE_OBJECTS, libc.dlb;
// 2181 имеет 16K слов (24-bit) ПП и 16K слов (16-bit) ПД
MEMORY {
// Используем всю доступную ПП и ПД
int_area {TYPE(PM RAM) START(0x0000) END(0x002f) WIDTH(24)}
prog_area {TYPE(PM RAM) START(0x0030) END(0x37fe) WIDTH(24)}
data_area {TYPE(DM RAM) START(0x0000) END(0x2fff) WIDTH(16)}
heap_area {TYPE(DM RAM) START(0x3000) END(0x37ff) WIDTH(16)}
stack_area {TYPE(DM RAM) START(0x3800) END(0x3fdf) WIDTH(16)}
}
PROCESSOR p0 {
// Ключи для линкера берутся из командной строки
LINK_AGAINST( $COMMAND_LINE_LINK_AGAINST )
// Имя выходного файла берется из командной строки
OUTPUT( $COMMAND_LINE_OUTPUT_FILE )
SECTIONS {
// Секция таблицы векторов прерываний,
// названия векторов определены в 218x_int_tab.asm
sec_int {
INPUT_SECTIONS( $OBJECTS(IVreset ) )
INPUT_SECTIONS( $OBJECTS(IVirq2 ) )
INPUT_SECTIONS( $OBJECTS(IVirql1 ) )
INPUT_SECTIONS( $OBJECTS(IVirql0 ) )
INPUT_SECTIONS( $OBJECTS(IVsport0xmit ) )
INPUT_SECTIONS( $OBJECTS(IVsport0recv ) )
INPUT_SECTIONS( $OBJECTS(IVirqe ) )
INPUT_SECTIONS( $OBJECTS(IVbdma ) )
INPUT_SECTIONS( $OBJECTS(IVirq1 ) )
INPUT_SECTIONS( $OBJECTS(IVirq0 ) )
INPUT_SECTIONS( $OBJECTS(IVtimer ) )
INPUT_SECTIONS( $OBJECTS(IVpwrdwn ) )
} >int_area
// Программная секция
sec_code {
// program – имя по умолчанию программной секции кода для
// СИ – файлов, может быть изменено в 218x_hdr.asm или
// директивой segment(segment_name) в тексте СИ-программы
INPUT_SECTIONS( $OBJECTS(program) )
// UART_CODE – имя секции программы,
// заданное в файле uart.asm
INPUT_SECTIONS( $OBJECTS(UART_CODE) )
} >prog_area
// Секция данных
sec_data {
// data1 – имя по умолчанию секции данных для
// СИ – файлов, может быть изменено в 218x_hdr.asm или
// директивой segment(segment_name) в тексте СИ-программы
INPUT_SECTIONS( $OBJECTS(data1))
// UART_DATA – имя секции данных, заданное в файле uart.asm
INPUT_SECTIONS( $OBJECTS(UART_DATA))
} >data_area
// Поддержка инициализации СИ – переменных, включая С++
sec_ctor {
INPUT_SECTIONS( $OBJECTS(ctor) )
} >data_area
// Поддержка кучи
sec_heap {
.heap = .;
.heap_size = MEMORY_SIZEOF(heap_area);
.heap_end = . + MEMORY_SIZEOF(heap_area) - 1;
} >heap_area
// Поддержка стека
sec_stack {
ldf_stack_limit = .;
ldf_stack_base = . + MEMORY_SIZEOF(stack_area) - 1;
} >stack_area
} // окончание SECTIONS
} // окончание processor p0
Рис. 1.20. Содержимое линкерного файла AsyncMix.ldf, входящего в
проект AsyncMix
Файл рис. 1.20 в основном соответствует содержимому файла рис.
1.16. Отличие заключается в том, что:
 раздел $OBJECTS дополнен именем файла libc.dlb;
 в раздел MEMORY включены области памяти int_area, heap_area и
stack_area;
 в раздел SECTION добавлены секции СИ программы: program – для
программной секции, data1 – для секции данных (в которой находятся
переменные ch и handler), ctor – для секции данных (инициализация
переменных CИ-программы), heap – для секции данных (поддержка
кучи), stack – для секции данных (поддержка стека).
2. АРХИТЕКТУРА СИСТЕМЫ НА ОСНОВЕ ADSP-2181
2.1. Структурная схема вычислительной (управляющей)
системы на основе ADSP-2181
Структурная схема системы на основе ADSP-2181 представлена на
рис 2.1. и рис 2.2.
ADSP-2181
1/2x CLOCK
or CRYSTAL
CLKIN
XTAL
FL0-2
PF0-7
IRQ2#
IRQE#
IRQL0#
IRQL1#
SPORT1
SCLK1
RFS1 or IRQ0#
TFS1 or IRQ1#
DT1 or FO
DR1 or FI
SPORT0
SCLK0
RFS1
TFS1
DT1
DR1
IDMA PORT
IRD#
IWR#
IS#
IAL
IACK#
Устройство с
последовательным
интерфейсом
Устройство с
последовательным
интерфейсом
Системный
интерфейс
или
Контроллер
ADDR13-0
DATA23-0
14
24
BMS#
IOMS#
PMS#
DMS#
CMS#
BR#
BG#
BGH#
PWD#
PWDACK#
16
IAD15-0
Рис. 2.1. Структурная схема системы на основе ADSP-2181 (начало)
Рис. 2.1. показывает, что устройство с последовательным интерфейсом (например, такой же процессор ADSP-2181) может быть подключено
напрямую через SPORT0 и/или SPORT1 (см. п. 1.12). Системный интерфейс (например, PCI) или микроконтроллер (например, такой же процессор ADSP-2181) могут быть подключены через порт IDMA (см. п. 1.16).
Большие возможности для подключения различных видов памяти и
периферийных устройств создает внешняя шина: ADDR[13-0], DATA[230], BMS#, IOMS#, PMS#, DMS#, CMS#. Некоторые способы ее использования приводятся на рис. 2.2.
ADDR13-0
DATA23-16
14
А13-А0
А21-А14
BYTE
8
DATA15-8
8
BMS#
ADDR10-0
D7-D0
MEMORY
CS#
11
А10-А0
I/O SPACE
DATA23-8
8
IOMS#
ADDR13-0
D15-D0
CS#
14
(PERIPHERALS)
2048 портов В/В
А13-А0
PMOVERLAY
MEMORY
DATA23-0
D23-D0
24
PMS#
ADDR13-0
CS#
14
Два по 8К
сегмента ПП
А13-А0
DMOVERLAY
MEMORY
DATA23-8
D15-D0
16
DMS#
CS#
Два по 8К
сегмента ПД
Рис. 2.2. Структурная схема системы на основе ADSP-2181 (окончание, сигналы RD#, WR# условно не показаны)
Байтовая память (BYTE MEMORY, см. п. 1.15) подключается к процессору в соответствии с рекомендациями п. 1.15.1. Байтовая память доступна только через BDMA.
Порты ввода/вывода (I/O SPACE) используют в качестве шины адреса 11 линий внешней шины адреса процессора ADDR[10-0], а в качестве
шины данных – 16 линий внешней шины данных процессора DATA[23-8].
Обращение к портам ввода/вывода возможно только с помощью команды
IO(..) (см. п. 1.17.4.и).
Оверлейная ПП (PMOVERLAY MEMORY) использует всю ширину
внешних шин адреса и 16 линий внешней шины данных процессора DATA[23-8]. Ее особенностью является то, что значение бита ADDR13 устанавливается через регистр PMOVLAY (см. п. 1.3). Значение ADDR13 = 0
обеспечивает доступ к первому сегменту оверлейной ПП, а ADDR13 = 1 –
к второму сегменту оверлейной ПП. Обращение к ячейкам памяти обоих
сегментов возможно только с помощью косвенного метода адресации (см.
пп. 1.17.4.д, з).
Оверлейная ПД (DMOVERLAY MEMORY) использует всю ширину
внешней шины адреса и 16 линий внешней шины данных процессора
DATA[23-8]. Ее особенностью является то, что значение бита ADDR13
устанавливается через регистр DMOVLAY (см. п. 1.4). Значение ADDR13
= 0 обеспечивает доступ к первому сегменту оверлейной ПД, а ADDR13 =
1 – к второму сегменту оверлейной ПД. Обращение к ячейкам памяти
обоих сегментов возможно как с помощью прямого метода адресации (см.
пп. 1.17.4.в, е) , так и с помощью косвенного метода адресации (см. пп.
1.17.4.г, ж).
2.2. Цепи синхронизации и запуска процессора
Для формирования импульсов синхронизации процессора используется встроенный генератор, для работы которого ко входам CLKIN (контакт 20) и XTAL (контакт 19) необходимо подключить хронирующие цепи (кварцевый резонатор BQ и конденсаторы С1, С2, см. п. 1.1). Параметр
кварцевого резонатора (частота Fclkin = 16,67 МГц) приводится в п.
1.14.1, осталось определить значения емкостей С1 = С2 = 18 пФ.
Схема цепи запуска процессора приведена на рис 2.3.
5В
R1 100k
D1
D2
1
1
R2 2k
к RESET (контакт 58)
С1 0,33мкФ
Рис. 2.3. Схема цепи запуска процессора (D1, D2 – 74HC14)
Схема цепи запуска процессора функционирует аналогично цепи
сброса микропроцессора М1821ВМ85А, см. п. 2.6 в [6]. Цепь R1, С1
определяет длительность импульса сброса. Цепь R2, D1, D2 является антидребезговой. Если конденсатор С1 перемкнуть нормально разомкнутой
кнопкой, то процессор можно сбрасывать вручную с помощью этой кнопки.
ПРИЛОЖЕНИЕ 1
Формат регистров управления
Ниже представлены форматы всех регистров управления и состояния
кроме ASTAT (см. табл.1.9), SSTAT (см. табл.1.11), MSTAT (см.
табл.1.12), и регистров управления таймером TPERIOD, TCOUNT,
TSCALE (см. табл.1.15). Также не представлены некоторые регистры,
имеющие простой формат, например, SPORTx CLKDIV, SPORTx
RFSDIV.
Цифры в битах и битовых полях отражают содержимое соответствующих битов после сброса, отсутствие цифр отражает неопределенное
содержимое соответствующих битов после сброса. Серым цветом закрашены зарезервированные биты и битовые поля. В них всегда должны записываться нулевые значения.
П1.1. System control register (регистр управления системой)
Адрес регистра: 0x3FFF.
15 14 13 12
11
10
9 8 7 6 5 4 3 2 1 0
0 0 0 0
0
1
0 0 0 0 0 0 0 1 1 1
S0E S1E S1C
PWAIT
где: S0E – SPORT0 Enable (разрешение SPORT0), если S0E = 1, то
SPORT0 разрешен, в противном случае – запрещен;
S1E – SPORT1 Enable (разрешение SPORT1), если S1E = 1, то
SPORT1 разрешен, в противном случае – запрещен;
S1C – SPORT1 Configure (конфигурирование SPORT1), если S1C = 1,
то разрешен последовательный порт, в противном случае разрешены FI, FO, IRQ0#, IRQ1#, SCLK1 (см. п. 1.12.2);
PWAIT – число состояний ожидания при обращении к внешней ПП.
П1.2. Data memory waitstate register (регистр числа состояний ожидания при обращении к внешней ПД)
Адрес регистра: 0x3FFE.
15
0
14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
DWAIT
IOWAIT3
IOWAIT2
IOWAIT1
IOWAIT0
где: DWAIT – число состояний ожидания при обращении к внешней ПД;
IOWAIT0 - IOWAIT3 – число состояний ожидания при обращении к
следующим диапазонам адресов адресного пространства
ввода/вывода соответственно: 0x000-0x1FF, 0x200-0x3FF,
0x400-0x5FF и 0x600-0x7FF.
П1.3. SPORT0 autobuffer control register (регистр управления
автобуферизацией SPORT0)
Адрес регистра: 0x3FF3.
15 14 13 12 11 10 9
8 7
6 5 4
3 2
1
0
0 0 0 0
0
0
С
В TIREG TMREG RIREG RMREG TBUF RBUF
где: С – CLKODIS (CLKOUT disable control bit) бит управления запретом
сигнала CLKOUT;
B – BIASRND (MAC biased rounding control bit) бит управления смещенным округлением МАС, если BIASRND = 0, то округление
нормальное, в противном случае – смещенное;
TIREG, TMREG – номера индексного и модификационного регистров, связанных с передающим буфером, соответственно;
RIREG, RMREG – номера индексного и модификационного регистров, связанных с приемным буфером, соответственно;
TBUF, RBUF – биты разрешения передачи и приема с автобуферизацией (1 – автобуферизация разрешена, 0 – запрещена).
П1.4. SPORT0 control register (регистр управления SPORT0)
Адрес регистра: 0x3FF6.
15 14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
M IS R W T S I
F V N DTYPE
SLEN
где: М – MCE (Multichannel enable) разрешение многоканального режима,
если = 1, то многоканальный режим разрешен, в противном
случае – запрещен;
IS – ISCLK (Internal Serial clock generation) разрешение формирования внутренней синхронизации последовательного порта, если ISCLK = 1, то разрешена внутренняя синхронизация, в
противном случае – внешняя;
R – RFSR (Receive frame sync required) требование фреймовой синхронизации при приеме данных, если RFSR = 0, то фреймовая синхронизация при приеме данных отсутствует, в противном случае – присутствует;
W – RFSW (receive frame sync Width) режим фреймовой синхронизации при приеме данных, если RFSW = 0, то нормальный, в
противном случае – альтернативный;
Т – TFSR (Transmit frame sync required) требование фреймовой синхронизации при передаче данных, если TFSR = 0, то фреймовая синхронизация при передаче данных отсутствует, в противном случае – присутствует;
S – TFSW (transmit frame Sync width) режим фреймовой синхронизации при передаче данных, если RFSW = 0, то нормальный,
в противном случае – альтернативный;
I – ITFS (Internal transmit frame sync enable) источник фреймовой
синхронизации при передаче, если ITFS = 0, то используется
внешний сигнал TFS, в противном случае формируется собственный сигнал TFS;
F – IRFS (internal receive Frame sync enable) источник фреймовой
синхронизации при приеме, если IRFS = 0, то используется
внешний сигнал RFS, в противном случае формируется собственный сигнал RFS;
V – INVTFS (inVert transmit frame sync) выбор уровня активности
фреймовых сигналов при передаче, если INVTFS = 0, то уровень TFS высокий, в противном случае – низкий;
N – INVRFS (receive traNsmit frame sync) выбор уровня активности
фреймовых сигналов при приеме, если INVRFS = 0, то уровень RFS высокий, в противном случае – низкий;
DTYPE – (Data type) формат данных, возможны следующие значения
этого битового поля: 00 – правое выравнивание (старшие неиспользуемые биты заполняются нулями); 01 – правое выравнивание (старшие неиспользуемые биты заполняются
значением знакового бита); 10 – компандинг с использованием -закона; 11 – компандинг с использованием А-закона;
SLEN – (serial word length) длина слова данных в битах, в это поле
следует записывать действительное значение длины уменьшенное на единицу.
Если разрешен многоканальный режим работы последовательного
порта (МСЕ = 1), то некоторые биты регистра управления последовательным портом изменяют свое функциональное назначение, в частности:
 биты 13-10 хранят значение задержки многоканального фрейма
(Multichannel Frame Delay – MFD);
 бит 9 определяет многоканальную длину (Multichannel Length –
MCL), если MCL = 1, то объем фрейма составляет 32 слова, в
противном случае – 24 слова;
 бит 7 (Invert Transmit Data Valid – INVTDV) определяет уровень
активности сигнала TDV (см. п. 1.12.7).
П1.5. SPORT1 autobuffer control register (регистр управления
автобуферизацией SPORT1)
Адрес регистра: 0x3FЕF.
15 14 13 12 11 10 9
8 7
6 5 4
3 2
1
0 0 0 0
0
X D P U TIREG TMREG RIREG RMREG TBUF
0
0
RBUF
где: Х – XTALDIS (Xtal pin disable during powerdown) запрещение сигнала
XTAL при переходе в режим энергосбережения, если XTALDIS
= 1, то сигнал XTALDIS запрещен, в противном случае – разрешен. Если используется внешняя синхронизация сигнал (собственный кварцевый резонатор отсутствует), то сигнал XTAL
необходимо запрещать;
D – XTALDELAY (Delay startup from powerdown) задержка начала
выполнения программы при выходе из режима энергосбережения, если XTALDELAY = 1, то процессор перед началом выполнения программы делает 4096 холостых циклов. Это лучше делать всегда при выходе из режима энергосбережения для того,
чтобы внутренний узел автоматической подстройки частоты
начал стабильно работать;
Р – PDFORCE (PD force) формирование запроса на прерывание (если
PDFORCE = 1) powerdown (см. табл. 1.8);
U – PUCR (PowerUp Context Reset) сброс контекста при перезагрузке,
если PUCH = 1, то программный сброс, в противном случае отказ
от выполнения.
Остальные битовые поля имеют то же функциональное назначение,
как в регистре управления автобуферизацией SPORT0 (см. п. П.1.3).
П1.6. SPORT1 control register (регистр управления SPORT1)
Адрес регистра: 0x3FF2.
15
14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
O IS R W T S I
F V N DTYPE
SLEN
где: O – состояние флага Flag Out (только для чтения, см. п. 1.14.3).
0
0
Остальные биты и битовые поля имеют то же функциональное
назначение, как в регистре управления SPORT0 (см. п. П.1.4) за исключением того, что SPORT1 не может работать в многоканальном режиме.
П1.7. Programmable flag & Composite select control (регистр управления программируемыми флагами и сигналом CMS#)
Адрес регистра: 0x3FE6.
15
0
14 13 12 11
10
9
8
7 6 5 4 3 2 1 0
1
1
1
1
0
1
1
0 0 0 0 0 0 0 0
BMWAIT IOM BM DM PM
PFTYPE
где: BMWAIT – число состояний ожидания при обращении к БП;
IOM, BM, DM, PM – биты, определяющие формирование сигнала
CMS# (см. п. 1.1) при обращении к адресным пространствам
ввода/вывода, БП, внешней ПД, внешней ПП соответственно, если этот бит содержит 1, то при обращении к соответствующему
адресному пространству сигнал CMS# будет формироваться, в
противном случае – нет;
PFTYPE – битовое поле, определяющее тип флага PF[7:0], если какой-либо бит этого поля содержит 0, то соответствующий ему
бит PF[7:0] будет запрограммирован на ввод, в противном случае
– на вывод.
П1.8. Programmable flag data (регистр данных программируемых
флагов)
Адрес регистра: 0x3FE5.
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
PFDATA
где: PFDATA - регистр данных программируемых флагов, при записи в
этот регистр данные появляются на тех флагах PF[7:0],
которые запрограммированы на выход (см. п. П1.7), при
чтении внешние данные находятся в тех флагах PF[7:0],
которые запрограммированы на ввод (см. п. П1.7).
П1.9. BDMA word count (счетчик слов BDMA)
Адрес регистра: 0x3FE4.
15
0
14
0
13
0
12
0
11
0
10
0
9
0
8
0
7
6
5
4
3
2
1
0
0
0
1
0
0
0
0
0
BWCOUNT
где: BWCOUNT – (Byte Word COUNT) содержимое счетчика слов, передаваемых с помощью BDMA.
П1.10. BDMA control (регистр управления BDMA)
Адрес регистра: 0x3FE3.
15
0
14
0
13
0
12 11 10 9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
BMPAGE
B D BTYPE
где: BMPAGE – (Byte Memory Page) номер начальной страницы БП, с которой взаимодействует BDMA;
В – BCR (BDMA Context Reset) сброс контекста во время работы
BDMA, если BCR = 0, то процессор выполняет программу во время работы BDMA, в противном случае – нет;
D – BDIR (BDMA DIRection) направление передачи данных, если
BDIR = 0, то происходит чтение БП, в противном случае
– запись БП;
BTYPE – (BDMA data TYPE) формат передаваемых данных, см. табл.
П1.1.
Таблица П1.1
Формат данных BDMA
BTYPE Внутреннее адресное Длина слова
Выравнивание
Пространство
00
PM
24
Целое слово
01
DM
16
Целое слово
10
DM
8
СЗР
11
DM
8
МЗР
где: СЗР – старшие значащие разряды (младшие 8 бит заполняются нулями);
МЗР – младшие значащие разряды (старшие 8 бит заполняются нулями).
П1.11. BDMA external address (адрес БП BDMA)
Адрес регистра: 0x3FE2.
15
0
14
0
13
0
12
0
11
0
10
0
9
0
8
0
7
6
5
4
3
2
1
0
0
0
0
0
0
0
BEAD
где: BEAD – (BDMA External ADdress) начальный адрес БП BDMA.
0
0
П1.12. BDMA internal address (адрес внутренней памяти BDMA)
Адрес регистра: 0x3FE1.
15
0
14
0
13
0
12
0
11
0
10
0
9
0
8
0
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
BIAD
где: BIAD – (BDMA Internal ADdress) начальный адрес внутренней памяти BDMA.
П1.13. IDMA control (регистр управления IDMA)
Адрес регистра: 0x3FE0.
15
0
14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
M
IDMAA
где: М – IDMAD (IDMA Destination) тип памяти назначения, если IDMAD = 0, то ПП, в противном случае – ПД;
IDMAA – (IDMA Address) начальный адрес внутренней памяти процессора.
П1.14. ICNTL register (регистр управления прерываниями)
Адрес регистра: регистр не находится в ПД, для обращения к нему в
программах на языке ассемблера необходимо ссылаться на его имя.
4
3
2
1
0
0
0
0
0
0
IN
IRQ2# Sens
IRQ1# Sens
IRQ0# Sens
где: IN – (Interrupt Nesting) разрешение/запрет вложенных прерываний,
если бит установлен, то вложенные прерывания разрешены, в
противном случае – запрещены;
IRQ2# Sens, IRQ1# Sens, IRQ0# Sens – (Interrupt ReQuest Sensitivity)
установка чувствительности запросов на прерывания, если какой-либо из этих битов установлен, то определена чувствительность к фронту соответствующего запроса на прерывание,
в противном случае определена чувствительность к уровню.
П1.15. IMASK register (регистр маскирования прерываний)
Адрес регистра: регистр не находится в ПД, для обращения к нему в
программах на языке ассемблера необходимо ссылаться на его имя.
15
0
14
0
13
0
12
0
11
0
10
0
9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
Биты разрешения прерываний (если = 1)
Биты разрешения прерываний действуют на следующие запросы
прерывания:
 бит 0 – на прерывания от таймера;
 бит 1 – на прерывания от SPORT1 (прием) или IRQ0#;
 бит 2 – на прерывания от SPORT1 (передача) или IRQ1#;
 бит 3 – на прерывания от BDMA;
 бит 4 – на прерывания от IRQE#;
 бит 5– на прерывания от SPORT0 (прием);
 бит 6 – на прерывания от SPORT0 (передача);
 бит 7 – на прерывания от IRQL0#;
 бит 8 – на прерывания от IRQL1#;
 бит 9 – на прерывания от IRQ2#.
П1.16. IFC register (регистр форсирования прерываний)
Адрес регистра: регистр не находится в ПД, для обращения к нему в программах на языке ассемблера необходимо ссылаться на его имя.
15 14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Биты форсирования прерываний
Биты очистки прерываний
Биты регистра активны, если = 1, и выполняют следующие функции:
 бит 15, бит 7 – форсирование/очистка IRQ2#;
 бит 14, бит 6 – форсирование/очистка SPORT0 (передача);
 бит 13, бит 5 – форсирование/очистка SPORT0 (прием);
 бит 12, бит 4 – форсирование/очистка IRQE#;
 бит 11, бит 3 – форсирование/очистка BDMA;
 бит 10, бит 2 – форсирование/очистка SPORT1 (передача) или IRQ1#;
 бит 09, бит 1 – форсирование/очистка SPORT1 (прием) или IRQ0#;
 бит 08, бит 0 – форсирование/очистка прерывания таймера.
ЛИТЕРАТУРА
1. ADSP-2100 Family, User’s Manuel, Analog Devices, Inc., Third Edition,
September, 1995
2. ADSP-2100 Family, EZ-KIT Lite Reference Manuel, Analog Devices, Inc.,
First Edition, May, 1995
3. DSP Microcomputer ADSP-2181. – Analog Devices, Inc., 1928.pdf, 1998
4. VisualDSP IDE, v. 3.0.1.1, Analog Devices, Inc., 2000
5. Serial-Port 16-Bit Sound Port Stereo Codec AD1847. – Analog Devices,
Inc., 1061.pdf, August, 1996
6. Комаров А.В. Введение в микропроцессоры. Конспект лекций по курсу
Микропроцессорные устройства (для студентов специальности 22.01)
– Обнинск, ИАТЭ, 1998, - 75 с.
ВЕРСИЯ 23.05.03
Download