DSP接口效率的分析与提高_接口电路论文
关键词:dsp 接口电路 can控制器
近几年来,数字信号处理器(dsp)得到了广泛的应用。由于dsp采用程序空间和数据空间分离的哈佛结构,对程序和数据并行操作,使之成倍地提高了处理速度;再加上流水线技术,使得dsp的指令周期多为10ns级。而与之配套的外围器件却没有像dsp那样猛地发展。首先,dsp与外围器件之间的速度差异日益显著,大部分外围器件的读写周期在50ns以上,即使是最快的静态ram,其读写周期亦为8ns左右,也只能与50mhz以下的dsp直接接口;其次,一些领域的器件在设计时并没有考虑与dsp接口,以至于不能直接接入dsp总线,如can总线控制器sa1000采用地址总线与数据总线分时复用的总线接口。这使得dsp与许多外部器件难以接口,特别是在与多个外部器件接口或者与总线不兼容的外部器件接口时,常常会出现因接口处理不当而导致接口效率低下的情况。当dsp对外部器件的操作频率很高时,接口效率的高低将对系统的运行速度产生不可忽略的影响。
1 多个外设的情况
当dsp与低速器件接口时,可以通过设置dsp片内的等待状态产生控制寄存器(wsgr),在相应的程序空间、数据空间或i/o空间产生1~7个等待周期,以使dsp的访问速度能和低速器件相匹配。当在同一空间内既有低速器件又有高速器件时,通常wsgr的延时值被设置成与速度最慢的器件相一致,以保证dsp对所有的器件都能进行正确的访问。若对高速器件的操作很频繁,则这种对整个空间的延时将极不合理地降低系统速度。例如,有些系统在程序空间同时扩展有ram和rom。而rom的速度一般远远低于ram,其访问周期一般为100~200ns,即使dsp和ram的访问速度均可达到25ns,但对整个数据空间进行延时后,dsp也只能以rom的访问速度(100~200ns)对ram进行访问。
在这种情况下,首先应考虑使用软件方法提供效率。其方法是默认的情况下将wsgr设置成与高速器件一致,当要访问低速器件时再修改wsgr的值。dsp常常对外部件进行连续操作,在这种情况下,软件方法还是比较有效的。但最大问题在于增加了软件负担和不稳定因素。
显然,效率最高的情况是,既不需要修改wsgr,dsp又能以外部器件本身的速度对它们进行访问。事实上,只要能够产生适当的信号控制dsp的ready端,就可以达到这个目的。dsp在开始一个外部总线的操作后,会在每一个clkout信号(dsp的时钟输出)的上升沿时刻对ready端进行查询,若ready为低,则保持总线的状态不变,然后在下一个clkout上升沿时刻两次查询,直至查询到ready为高时结束本次总线访问。
下面的设计实例中介绍的硬件等待电路(见图1)能够实现这个功能。它针对不同的外部器件产生相应的等待信号送到dsp的ready端,实现硬等待。其核心器件采用了广泛应用的通用逻辑阵列(gal),gal的引脚定义与图1相对应。使用gal器件使硬件设计变得简单而灵活,可以完成比较复杂的逻辑关系。
例如,频率为50mhz的dsp在数据空间外扩有ram和rom各一片,访问周期分别为70ns和150ns,地址空间分别为0x8000~0x8fff和0x9000~0x9fff。由dsp的主频可知,对ram和rom的访问各需插入3个和7个等待周期。下面给出gal源文件的关键部分(它们使用汇编程序fm的格式编写):
q0:=/q0*/rd+/q0*/wr
q1:=/q0*q1*/rd+q0*/q1*/rd+/q0*q1*/wr
+q0*/q1*/wr
q2:=/q1*q2*/rd+/q0*q1*q2*/rd+q0*q1*/q2*/rd
+/q1*q2*/wr+/q0*q1*q2*/wr+q0*q1*/q2*/wr
;构成一个三位的二进制计数器
;q2为最高位、q0为最低位
;对读信号或写信号的宽度进行计数
gal_ready.oe=vcc
/gal_ready=/ds*a15*/a14*/a13*/a12*/q1+/ds*a15*/a14*/a13*a12*q1*/a0
;为ram的访问插入3个周期
+/ds*a15*/a14*/a13*a12*/q0
+/ds*a15*/a14*/a13*/q1
+/ds*a15*/a14*/a13*a12*/q2
;为rom的访问插入7个周期
图2是一个与写时序对应的时序图,其中在下三角符号标出的时刻,dsp对ready端进行查询。
这种方法能够充分使用硬件的速度,并且对软件是透明的,不会增加编程人员的负担。
图3 dsp与sja1000的接口原理图
2 总线不兼容的情况
有一类芯片的总线接口是分时复用的,如can总线控制器sja1000。sja1000有8位的数据和地址复用的总线,可以和多种mcu直接相连。一次总线操作开始时,总线先传递此次操作访问的地址,在ale信号将地址锁存后,再进行数据读写。而dsp的数据总线和地址总线被并行地引出,这种并行结构比分时复用的串行结构先进,有着高一倍的带宽。但dsp被设计时并没有考虑过会在芯片外将并行的总线再串行化,也就是没有设计相应的辅助信号来完成这种转换。这使得完全使用硬件方法进行串行转换比较困难。
此类问题通常使用软件和硬件配合解决,并不真正地靠硬件进行园,而是把一次总线操作分解成两步。先把此次操作的目标地址作为数据送到总线上,同时通过硬件产生一个锁存信号将其锁存。然后再进行读写操作,读写操作的目标地址就是上一步被锁存的地址。
使用这种办法,硬件和软件都不需要进行复杂的变换。唯一的缺点是指令的效率变低了。由于sja1000的读写周期一般是dsp的指令周期的几倍,一次访问被分解成两次后多消耗的时间不能忽略。还有一个更重要的影响是,这种转换方法在寻址时无法使用dsp的并行寻址功能,必须使用另外的变量独立运行。在多数的can总线应用中,这种处理方法不会对系统的整体性能产生太大的影响。但在有的系统中,这种低效是不可容忍的,如由dsp和sja1000组成的can总线网关,它含有多个sja1000芯片,并且在sja1000之间需要经常进行数据块的搬移。对于次数频繁并且寻址有规律的操作,利用dsp的并行寻址功能将极大地提高程序的效率。以下程序段可在两个同网段的sja1000之间完成一帧消息搬移功能(它在每次操作的同时对下次操作的地址进行并行寻址):
lar ar0,mlength ;取消息的长度
lar ar1,#sja1_a ;一个sja1000中接收邮箱的首地址
lar ar2,#sja2_s ;另一个sja1000中发送邮箱的首地址
mar *,ar0
mar *-,ar1
loop: ;复制一帧消息
lacl *+,ar2
sacl *+,ar0
banz loop,*-,ar1
如果按下述方法改写这段程序,不仅对sja1000的操作时间要增加倍,而且每次操作前都要对地址进行运算,使得完成同样功能的程序运行时间要增加到原来的3~4倍。
这时,只有使用纯硬件的解决方法才能获得理想的效果。设计的关键是生成合适的锁存信号ale,使它能够满足sja1000的时序要求。通过研究dsp控制信号的时序要吧发现,从地址建立到读写控制信号有效大约要经历二分之一个cpu时钟的时间,而sja1000的ale信号要求的最小宽度为8ns,因此对于主频在50mhz(cpu时钟为20ns)以下dsp,可以利用这二分之一个cpu时钟的时间间隔生成ale信号。图3给出了含两片sja1000的接口电路图。除了片选信号外,这两片sja1000的总线和其它控制信号都连在一起。
假设sja1000的片选地址为0x8xxx和0x9xxx,各引脚定义与图中对应,则gal中的逻辑关系如下:
/addr_g=dsp_rd*dsp_wr*rd*wr
/data_g=/dsp_ds*dsp_a15*/dsp_a14*/dsp_a13*addr_g
/wr=/dsp_wr*/ale
/rd=/dsp_rd*/ale
ale=/dsp_ds*dsp_a15*/dsp_a14*/dsp_a13
*dsp_rd*dsp_wr
/cs1=/dsp_ds*dsp_a15*/dsp_a14*/dsp_a13
*/dsp_a12*addr_g
/cs2=/dsp_ds*dsp_a15*/dsp_a14*/dsp_a13*dsp_a12*addr_g
对其中一片进行读写操作,则时序关系如图4所示。
其中,twr、tww分别为dsp读、写时的ale信号宽度,它们都接近1/2个clkout的周期。t为ale的下降沿到rd、wr有效的时间,它由gal翻转的延时产生,为10ns以上(注:本图中dsp的时序来自tms320c24xxa系列,不同系列的dsp产品之间时序可能有细微的差别)。
对于主频高于50mhz的dsp,应当使用有更高工作频率的可编程逻辑器件,并将前面介绍的主数器引入编程逻辑器件内,来产生满足时序要求的锁存信号。
本文介绍的两种高效率的dsp接口的设计方法,去掉了在dsp访问外设时任何不必要的时间消耗。当然,效率的提高是以增加硬件的复杂杂度为代价的,在能够满足设计要求的前提下,设计者应该选择简单的设计方案。而对于频繁进行外设访问的高性能系统,本文提供了理想的接口方案。