- •Цифровые сигнальные процессоры
- •Содержание
- •1. Архитектура adsp-2181
- •1.1. Описание выводов процессора
- •1.2. Структурная схема adsp-2181
- •Генераторы адресов данных dag1 и dag2, регистр команд instruction register и программный конвейер program sequencer.
- •1.3. Память программ
- •1.4. Память данных
- •1.5. Функциональная схема alu
- •1.6. Функциональная схема мас
- •1.7. Функциональная схема shifter
- •Значения выходного кода сдвигателя при различных значениях
- •1.8. Функциональная схема программного конвейера
- •1.9. Система прерываний
- •1.9.3. Конфигурирование прерываний.
- •1.10. Регистры состояния и стек состояния
- •1.11. Передача данных
- •1.11.1. Генераторы адресов
- •1.11.2. Узел обмена данными
- •1.12. Последовательные порты
- •1.12.1. Общие сведения
- •1.12.2. Программирование sport
- •Функциональное назначение конфигурационных регистров
- •1.12.3. Пример конфигурирования последовательных портов
- •{Программа инициализации sport0, sport1}
- •1.12.4. Сжатие данных
- •1.12.5. Автобуферизация
- •1.12.6. Пример программирования автобуферизации
- •1.12.7. Многоканальность
- •1.13. Таймер
- •1.14. Системный интерфейс
- •1.14.1. Сигналы синхронизации
- •Состояние регистров процессора после сброса и перезагрузки
- •Состояние регистров bdma после сброса и перезагрузки
- •1.14.2. Внешние прерывания
- •1.14.3. Флажковые биты
- •1.14.4. Режим энергосбережения
- •1.15. Контроллер прямого доступа к байтовой памяти (bdma)
- •1.15.1. Общие сведения
- •1.15.2. Регистры управления bdma
- •1.15.3. Функционирование bdma
- •1.15.4. Загрузка программ с помощью bdma
- •1.16. Порт idma
- •1.16.1. Сигналы idma
- •1.16.2. Функционирование idma
- •1.16.3. Загрузка программ с помощью idma
- •1.17. Система команд
- •1.17.1. Общие сведения
- •1.17.2. Методы адресации
- •1.17.3. Условные обозначения
- •1.17.4. Команды пересылки данных
- •1.17.5. Команды alu
- •Б) вычитание X-y/вычитание X-y с заемом
- •1.17.6. Команды мас
- •1.17.7. Команды shifter
- •Допустимые регистры xop и условия cond см. П. 1.17.7.А.
- •Допустимые регистры xop и условия cond см. П. 1.17.7.А.
- •Допустимые регистры xop и условия cond см. П. 1.17.7.А.
- •Допустимые регистры xop и условия cond см. П. 1.17.7.А.
- •Допустимые регистры xop см. П. 1.17.7.А.
- •Допустимые регистры xop см. П. 1.17.7.А.
- •1.17.8. Команды управления потоком программы
- •Допустимые условия cond:
- •Допустимые условия cond см. П. 1.17.8.А.
- •1.17.9. Многофункциональные команды
- •1.17.10. Прочие команды
- •1.18. Инструментальные средства разработки программного обеспечения
- •1.18.1. Инструментальные средства для dos
- •1.18.2. Инструментальные средства для windows
- •1.18.3. Создание проекта в VisualDsp
- •1.18.4. Загрузка программы в ez-kit Lite
- •1.19. Примеры программирования в среде VisualDsp
- •1.19.1. Формирование эхо-сигнала
- •Architecture(adsp-2181) // определение типа процессора
- •1.19.2. Эмуляция интерфейса rs-232
- •1.19.3. Эмуляция интерфейса rs-232 (смешанный вариант)
- •Architecture(adsp-2181) // определение типа процессора
- •2. Архитектура системы на основе adsp-2181
- •2.1. Структурная схема вычислительной (управляющей)
- •2.2. Цепи синхронизации и запуска процессора
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).
Узел формирователя следующего адреса основывает свой выбор на анализе следующих сигналов: кода команды (шина 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.
Таблица 1.7
Условия выхода из цикла DO UNTIL
Условие |
Описание |
Выполняется, когда |
EQ |
Равно нулю |
AZ = 1 |
NE |
Не равно нулю |
AZ = 0 |
LT |
Меньше чем ноль |
AN.XOR.AV = 1 |
GE |
Больше чем или равно нулю |
AN.XOR.AV = 0 |
LE |
Меньше чем или равно нулю |
(AN.XOR.AV).OR.AZ = 1 |
GT |
Больше чем ноль |
(AN.XOR.AV).OR.AZ = 0 |
AC |
Перенос ALU |
AC = 1 |
NOT AC |
Нет переноса ALU |
AC = 0 |
AV |
Переполнение ALU |
AV = 1 |
NOT AV |
Нет переполнения ALU |
AV = 0 |
MV |
Переполнение МАС |
MV = 1 |
NOT MV |
Нет переполнения МАС |
MV = 0 |
NEG |
Отрицательный знак Х входа |
AS = 1 |
POS |
Положительный знак Х входа |
AS = 0 |
CE |
Счетчик исчерпан |
|
FOREVER |
Всегда |
|
Когда выполняется команда 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), что в том числе приводит к необходимости вручную (программно) считывать стеки циклов, РС и счетчика. Такая же необходимость существует при экстренном выходе из циклов.
