学海荡舟手机网

主页 > 实用文摘 > 教育文摘_02 > > 详细内容

ADSP-218X的IDMA接口自举设计_DSP论文

摘要:介绍adsp-218x系列dsp芯片的idma接口的自举设计与应用。硬件方面介绍adsp-218x的idma接口特点以及它与主机的连接方式;软件方面介绍如何dsp的程序与主机程序代码结合起来,并由主机通过idma接口与adsp-218x下载程序。此种方法可简化系统设计 ,降低成本。

    关键词:dsp adsp-218x idma 主机 自举

随着dsp芯片技术的发展,其种类和型号日益增多。adi公司推出了adsp-218x系列16位定点dsp,它的idma接口极具特色。

1 idma接口介绍

idma接口是一个并行的i/o接口, 主机可通过idma接口为dsp下载程序、读/写dsp的内部存储器。下面简称adsp-218x为218x。idma接口的读/写访问是完全异步的。也就是说在dsp全速运行时,主机可访问dsp的内部程序空间和数据空间。

idma接口引脚定义如表1所列。其中i/o是针对dsp来说的,i是输入信号,o是输出信号。

表1 idma接口引脚定义

引脚名i/o

功  能  描  述

isiidma接口片选信号
irdiidma接口读信号。当is和ird同时有效时,开始一个idma读周期
iwriidma接口写信号。当is和iwr同时有效时,开始一个idma写周期
ialiidma接口地址锁存信号。当is和ial同时有效时,开始一个idma地址锁存序列。此时主机应将访问idma的起台地址送到iad0~15上
iackoidma接口允许访问的确认信号
iad0~15i/oidma接口的16位地址/数据总线

当is与ial同时有效时,218x将iad0~15总线上的地址写入idma控制寄存器。虽然主机送到iad0~15上的是数据,但对218x来说,它是要锁存的地址。该地址的位14是主机通知218x它要访问的是程序空间(pm)还是数据空间(dm),而位0~13是它要访问的存储器的起始地址。主机第一次访问218x的地址就是idma控制寄存器所保存的地址,以后每访问一次,就在该地址值的基础上再加1。这个工作由218x自动完成,直到主机通过ial和is锁存新的地址。idma控制寄存器定义如图1所示。

主机只要先通知218x它要访问的是程序空间还是数据空间以及要访问的起始地址,以后就可以连续读写一段空间的数据。至于218x是如何实现的,对主机来说是透明的。

2 218x与主机的idma接口设计

下面介绍218x如何通过idma接口自举的系统设计。这样可以减少一个程序片,让218x与主机共用一个程序片。

adsp-218x有多种型号。不同型号的dsp处理器,要设置不同的模式引脚,才能达到idma自举功能。对adsp-2181和adsp-2183来说,要分别设置模式引脚mmap=0,引脚bmode=1。对于其它型号的adsp-218x芯片来说,模式引脚分别设置为mode a=1,mode=1,mode c=0。如果该型号的218x还有模式引脚mode d的话,要设置为0。模式引脚如此设置,表示218x是通过idma接口进行自举的。

图1

    218x占用主机的一个片选信号。对于主机来说,218x只占用两个i/o地址空间,一个是控制端口地址(此时ial为1),另一个是数据端口地址(此时ial为0),因此可将主机的地址线a1与218x的ial相连。而218x的iack与主机的一个输入引脚相连,主机通过查询它来判断218x是否繁忙。其它信号接线如图2所示。

3 218x程序与主机程序的连接

目前大多数主机系统提供c编译器,因此主机采用c语言进行编程,既便于理解又具有实用价值。本文以adsp-2185为例说明如何将218x目标代码链接到主机源程序中。

218x程序编完后,用adi公司提供的visualdsp++ for 21xx软件将它编译生成218x的目标文件,后缀名为dex。在visualdsp++ for 21xx软件中的还有一个转换工具elfsp121,它将218x目标代码转换成便于idma下载的文件。如果218x的目标文件为example1.dex,可以按下面格式调用。

c:example1.dxe dsp.out -idma

其中的开关-idma表示要将example1.dxe转换为idma下载格式,输出文件为dsp.out。下面简单地表示一下dsp.out文件格式。

0040

4000

ffff

fffe

可以看出它不是c语言格式,因此要将dsp.out改写成dsp.h。它内含c语言格式的常量数组,供主机下载程序代码到218x使其自举。

下面对dsp.h文件内容进行编写,并分析其结构。

注:在←及以后的内容dsp.h文件中是没有的,只是帮助说明。

#define max_code_len 257

unsigned short dsp_rom_code[max_code_len]={←32位机使用short,而16位机要将short改为int 0x0040, ←当前一段要下载的代码长度为0x40,不包含idma控制字

0x4000, ←idma控制字。先初始化数据空间,地址为数据空间的0x0000,其中4表示访问的是dm数据空间

0xffff, ←第一个数据字

0xfffe, ←第二个数据字

…………

0x001f,←第0x40个数据字

0x00b8,←当前一段要下载的代码长度

0x0001,←idma控制字。下面下载程序代码至pm程序空间,起始地址为0x0001

0x0000,←第1个程序代码的高16位一个程序代码由24位的字组成,因此要下载两个字

0x0000,←第1个程序代码的低8位

…………

0x000f,←最后一个程序代码的低8位,相当于下载的第0xb8个程序字

0x0002,←当前段长度为2,218x的idma口程序下载最后是对程序空间地址0写代码。

0x0000, ←idma控制字。下载程序代码至pm程序空间,起始地址为0x0000,一写完,218x就开始运行程序

0x1803,

0x000f,

0xffff};←0xffff表示下面没有数据要主机下载了

从上面描述可以看出,主机下载218x程序时,要多个段。如果218x程序在数据空间定义了常量数组,就要先下载数据段,然后下载程序段最后再对程序空间地址0x0000写代码。如果218x工作在idma接口自举模式下,在系统复位后,218x并不执行程序。一旦主机对程序空间地址0x0000写了代码,218x才开始运行程序。

4 主机下载218x程序

在主机的c程序中,将dsp.h作为头文件,dsp_rom_code是填充218x程序的常量数组,数组长度由max_code_len宏定义。由主机将dsp_rom_code中的数据按其格式下载到218x中。这样主机源泉程序无需修改。下面给出主机下载218x程序的主要程序。

对主机来说,dsp_addr是218x的控制端口地址,注意其地址a1为1;dsp_data是218x的数据端口,地址a1为0。这是因为a1接218x的ial引脚。

#define dsp_addr (*(volatile unsigned short *)0x300002

#define dsp_data (*(volatile unsigned short*)0x300000)

//功能:判断218x的iack信号是否有效。主机每进行一次idma访问前都要先判iack。

void wait_ack(void)

{unsigned char ch;

while(1)/*查询i/o口,判断iack是否为低,为低则已获利218x确认,退出*/

{ch=sim_portf;

if((ch & 0x20)!=0x20)break;

}

}

//功能:完成218x程序下载

void downcodetodsp(void)

{unsigned short icount,ip,idata;

ip=0;

while(1)

{icount=dsp_rom_code[ip++];//读要写的字节数

if(icount==0xffff)break;

//当字节数为0xffff时,218x所有段都已下载完成,结束下载wait_ack();

dsp_addr=dsp_rom_code[ip++];

//向218x的idma口写起始地址

while(icount) //此循环完成写一个段

{idata=dsp_rom_code[ip++];

//向218x的idma口数据或程序代码

dsp_data=idata;

wait_ack();

icount--;}

}

}

一般单片机的计算功能,特别是乘、除法性能比较差,开发人员可根据自己所要设计的系统的要求,选择相应的主机cpu。要求至少是16位的单片机,因为idma接口为16位的地址/数据总线。在程序功能的分配上,让主机完成一些复杂的逻辑运算、通信等功能,主机通过idma接口与218x相连;由218x完成极为耗时的乘、除法计算。主机通过idma接口为218x下载程序,减少了218x的程序片;双方通过idma接口交换数据,这又减少了218x与主机之间的双口ram。对于主机来说,218x只不过是一个计算协处理器,系统设计成本低而又极为简洁。