Разработка устройств на основе цифровых сигнальных процессоров фирмы Analog Devices с использованием Visual DSP++ - Олег Вальпа
Шрифт:
Интервал:
Закладка:
С помощью разъемов XU и XP адаптер подключается непосредственно к устройству с сигнальным процессором через интерфейсный порт IDMA.
Питание адаптера осуществляется от источника питания напряжением +5 В самого устройства. В качестве такого устройства с сигнальным процессором можно использовать тестовую плату, описанную ранее. Эта плата имеет все необходимое для подключения адаптера LPT-IDMA без всяких переделок.
Все схемы и проект прошивки для ПЛИС прилагаются в виде соответствующих файлов на компакт-диске этой книги.
Глава 10. Менеджер памяти
В этой главе описывается программа под названием «Менеджер памяти», разработанная автором книги для загрузки в сигнальный процессор программ и их отладки.
Для того чтобы можно было использовать адаптер LPT-IDMA для загрузки программ и данных в сигнальный процессор, а также иметь возможность редактировать содержимое памяти сигнального процессора во время его работы, мною была написана программа менеджера памяти цифрового сигнального процессора «mngdsp». Эта программа является приложением DOS и может работать в режиме DOS под Windows95/98/Me. Данная программа в составе проекта для Borland С++ 3.1, с исходными текстами программы находится на диске, прилагаемом к книге.
После запуска программы mngdsp.exe на экране монитора должно появиться окно, изображенное на рис. 10.1.
Рис. 10.1. Экран монитора после запуска программы mngdsp.exe
Данное окно отображает содержимое памяти сигнального процессора в шестнадцатеричном формате. Внизу этого окна приведены команды управления программой. При перемещении маркера по окну с помощью клавиш управления, можно выбрать любую доступную ячейку памяти процессора, для записи в нее произвольных данных. Адрес выбранной ячейки памяти отображается слева вверху. Переключение между памятью данных и памятью программ процессора производится с помощью клавиши TAB клавиатуры. Адаптер позволяет подключаться параллельно к двум портам IDMA разных процессоров. Например, к мультипроцессорному устройству. Для этого он использует сигнал -SEL, подключаемый к выводу - IS порта IDMA. Поскольку при пассивном состоянии данного сигнала порт IDMA не активизируется, допускается запараллеливание всех сигналов IDMA двух процессоров, за исключением сигнала -IS, который позволит выбирать один из двух процессоров. При такой схеме включения необходимо к выводу -IS одного из двух процессоров подключать сигнал -SEL непосредственно, а к выводу -IS второго процессора через инвертор. Выбор процессора из программы производится клавишами F1 и F2. С помощью клавиши F3 можно заполнить всю память данных процессора произвольным числовым значением. Клавиша F4 позволяет очистить память данных процессора путем записи во всю область памяти нулевого значения. Клавиша F8 производит принудительный сброс процессора путем формирования сигнала сброса -INIT для процессора. Кроме того, программа менеджер позволяет загрузить программу в память процессора и запустить ее. Для этого используется клавиша F9. После нажатия этой клавиши, программа запросит имя загружаемого файла, а также предложит загрузить файл с именем dsp.lda, используемым в программе по умолчанию. Поэтому перед запуском программы можно переименовать файл, который должен загружаться в процессор, в файл с именем dsp.lda либо ввести имя загружаемого файла по запросу программы. О формате данного файла и о том, как получить такой файл, было рассказано ранее.
Таким образом, используя программу менеджера памяти DSP, можно загружать и отлаживать программы для сигнального процессора, пользуясь при этом многократными итерациями, высокой скоростью и удобством интерфейса программы.
Приведу еще один пример использования порта IDMA, который можно использовать в мультипроцессорных системах. При разработке таких систем часто возникает необходимость загрузки программы или данных в один из ведомых процессоров с помощью ведущего процессора. Для этих целей также хорошо подходит порт IDMA. Структурная схема подключения двух процессоров между собой через порт IDMA показана на рис. 10.2.
Рис. 10.2. Структурная схема подключения двух процессоров
Как видно из схемы, ведущий процессор подключен к порту IDMA ведомого процессора с использованием сигнала обращения к портам ввода-вывода -IOMS, сигнала записи -IWR, двух сигналов программируемых флагов PF0 и PF2, адресного сигнала A0, шины данных D8–D23 и сигнала синхронизации тактовой частоты CLKOUT. Такая схема включения позволяет выполнять операцию записи данных через порт IDMA ведомого процессора с помощью одной команды записи данных в порт ввода-вывода io(address)=data. Сигнал CLKOUT обеспечивает маскирование адресной линии A0 при формировании сигнала защелки адреса IAL. Такое маскирование необходимо для блокировки переходных процессов на линии А0 при установке адреса. Это хорошо видно из временной диаграммы цикла записи данных процессором в порт ввода-вывода, приведенной на рис. 10.3.
Рис. 10.3. Временная диаграмма цикла записи
Сигнальные цепи PF2 и PF0 используются ведущим процессором для активизации схемы защелки адреса в порт IDMA и для анализа состояния готовности порта IDMA ведомого процессора.
Ниже приведен исходный текст программы idmaidma.dsp для ведущего процессора данной схемы, позволяющей ему загрузить в память программ ведомого процессора массив данных, размещенных в файле idmaidma.dat, являющихся программой для ведомого процессора.
Текст программы/*********************************************************************/
/* Эта программа транслирует данные от ведущего процессора ADSP-2181 */
/* к ведомому процессору ADSP-2181 через IDMA порт */
/*********************************************************************/
.module/abs=0x0000 idma_transfer;
.include <def2181.h>; { Включить файл определений }
.const length=68; { Десятичное значение длины вектора }
.var/pm/ram x_input[length]; { Описание массива данных }
.init x_input: <idmaidma.dat>; { Файл передаваемых данных }
jump start; nop; nop; nop; { Таблица векторов прерываний }
RTI; NOP; NOP; NOP; { Прерывания не используются }
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
RTI; NOP; NOP; NOP;
/*** Начало программы ***/
start:
ax0=0x0000;
dm(System_Control_Reg)=ax0; { Такты ожидания PM отключить }
dm(PFTYPE)=ax0; { Все флаги PF назначить выходами }
dm(DM_Wait_Reg)=ax0; {Такты ожидания DM и портов ввода-вывода отключить}
l6=0; { Длина буфера данных }
i6=^x_input; { Адрес начала буфера транслируемых данных }
m6=1; { Приращение = 1 }
modify(i6,m6); { Модификация адреса }
/*** Защелкнуть адрес 0x0001 ***/
call check_ack; { Проверить готовность к приему }
ax0=0x0001; { Стартовый адрес для записи в ведомый процессор }
io(0x0001)=ах0; { Запись этого адреса с переключением линий -IS и IAL }
/*** Запись всех данных начиная с адреса 0x0001 ***/
cntr=length-1; { Установить счетчик транслируемых слов }
do loop1 until се; { Организовать цикл записи }
call check_ack; { Проверить готовность к приему }
call format; { Форматировать данные }
io(0x0100)=ay0; { -IWR и IS записывают старшие 16 бит IAD 0-15 }
call check_ack; { Проверить готовность к приему }
io(0x0100)=ay1; { -IWR и IS записывают младшие 8 бит IAD 0-15 }
loop1: nop;
/*** Защелкнуть адрес 0x0000 ***/
call check_ack; { Проверить готовность к приему }
ax0=0x0000; { Стартовый адрес для записи в ведомый процессор }
io(0x0001)=ax0; { Запись этого адреса с переключением линий -IS и IAL }
/*** Запись по адресу 0x0000 ***/
i6=^x_input; { Указатель на начало буфера данных }
call check_ack; { Проверить готовность к приему }
call format; { Форматировать данные }
io(0x0100)=ay0; { -IWR и IS записывают старшие 16 бит IAD 0-15 }
call check_ack; { Проверить готовность к приему }
io(0x0100)=ay1; { -IWR и IS записывают младшие 8 бит IAD 0-15 }
idle; { Режим ожидания }