引言
在LED等大屏幕显示系统中,由于显示面积的不断增大及显示内容色彩变化的日益丰富,使得显示数据的输出速度成为大屏幕显示系统中要解决的瓶颈问题。目前显示系统提高数据输出速度的方法,除了输出电路比较复杂的采用FPGA/CPLD芯片进行替代的外,主要采用的是提高显示系统控制板单片机主频的方法。本文以几款LED大屏幕控制卡为例,论述在硬件电路挖潜改造方面,运用SPI方式提高显示数据输出速度的实现办法。
1 基于信号复用的电路优化
在读取数据及输出过程中,需要同时产生不少的控制信号,如锁存器、收发器及大屏幕显示需要的控制信号(如LED单元板中HC595的SCK移位、RCK锁存、E使能信号。LED大屏幕的显示原理见参考文献[1])。这些必需的信号的产生也延长了数据送出显示过程的时间。如果能够复用读存储器及屏幕显示中的信号,势必缩短这一过程的时延。
如在LED显示系统中,常用到把显示数据按行存储到外部ROM/RAM中的办法。该办法设定存储器的高位并接到LED的行控制线上,数据按行存储,按行读出数据时也同时开通行控制信号。下面的信号复用方案也是类似的原理。
在考查读外存的MOVX命令时可知,执行该命令时可产生读信号(RD),即在读外存时不但不需要特别地产生读信号(RD),还可以将此信号供给触发器74HC273及LED板上的移位信号SCK使用。这里要注意的是:在数据读出后SCK信号才送入,所以RD信号不可直接做SCK信号使用,必须做延时处理。本例中的延时时间大约为100 ns。
经过改进后的硬件结构框图如图1所示。
图1 硬件优化后结构框图
图中数据在RD信号控制下经74HC273送入LED显示屏。数据移位信号SCK由RD信号经延时电路演变而来。读出数据并送出显示过程各信号的时序关系如图2所示。
图2读取数据及屏幕显示控制信号时序
从图2中可以看出,P0口在RD信号为低电平期间读取数据,在RD信号上升沿时将数据锁存到74HC273;同时RD信号经延时电路延时约100 ns后作为数据锁存信号SCK使用,在上升沿时将数据送出到LED显示屏。
下面介绍优化前后输出程序的对比情况。
该电路的显示程序部分如下:
修改前显示子程序
…
MOVA,#P0(0x80) ;A指向P0
MOVDPL,R7
MOVDPH,R6;DPTR指向外部存储器读取
;地址
MOVR0,XX;置循环次数
DP:MOVXA,@DPTR
INCDPTR
STEB P3.6;产生送显示时需要的控制信号
CLRP3.6
DJNZ R0,DP
RET ;返回
修改后显示子程序
…
MOV A,#P0(0x80);A指向R0
MOV DPL,R7
MOV DPH,R6;DPTR指向外部存储器读取
;地址
MOVXA,@DPTR;数据送P0口
INC DPTR;且产生读信号,可复用为控制
;信号
MOVXA,@DPTR
INC DPTR;重复MOVX,INC指令达到读
;数据次数
…
RET;返回
减少的3条信号产生的指令相当于用硬件来实现了,即将软件硬件化。这不仅可以减少控制线,还节约了指令,提高了数据输出并送出显示的速度。另外,程序把循环结构改成了平铺顺序结构。在编写输出函数时,为了提高数据的输出速度,应尽量减少循环体的使用。特别是从存储器中读出数据的代码段部分,建议将循环结构改成平铺顺序结构。这样虽然会使输出函数的代码增加不少,对于现在的微处理器自带的Flash存储器的容量来说,增加的代码段占用空间的比例是比较小的;但程序却大大减少了每字节数据输出所耗费的机器周期。经过测算,数据输出速度提高了30%。[1]需要注意的是,如果用C语言编写代码,一定要查看确认所产生的汇编代码和自己预想的代码的一致性,否则容易产出冗余循环,加大程序运行耗时。
2 SPI在数据输出中的使用
上文提出了基础信号复用的电路优化原理及实现方法;但如果要提高数据输出过程的速度,首先要提高数据的读出速度。基于读出的大片数据都是顺序存放在一起的特点,设计了一个提供地址顺序变化的计数器辅助电路。该电路必须提供触发脉冲的信号源。单片机ALE脚或是利用串行口工作方式1也会产生一定频率的脉冲,但这两种方式的使用均有一定的限制,且没有SPI方式下产生的脉冲频率高。
SPI(Serial Peripheral Interface,串行外围接口)是Motorola公司首先在其MC68HCxx系列处理器上定义的。SPI系统使用4个I/O脚,它们是串行时钟SPSCK、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低位有效的从机选择数据线SS。SPSCK用于同步数据从MOSI输入和MISO的输出传送,通过对SPI控制寄存器SPCR的设置,SPSCK的频率最高可达振荡器频率fOSC的1/4。
在控制卡设计中,可以考虑增加一块SPI模式的Flash存储器。一方面可以保存重要文档,另一方面可以利用SPSCK产生的信号,实现对外部存储器件的高速读出,并将该信号转换给大屏幕控制用,实现大屏幕的同步高速显示。
在利用SPSCK的信号进行外部存储器件的读写时,设计构建了一个计数器电路来保存读写的初始地址。再利用SPSCK供给的脉冲,实现对计数器保存地址的顺序增加,以达到对数据的顺序高速读出的目的。
图3为SPI配合计数器对存储器进行快速读写操作的具体实现电路。根据ROM/RAM的容量大小(即地址线的数目),来确定级联计数器的个数。微处理器通过驱动器连接SPI串行存储器,驱动器可以选择7407或7417的型号。RM_MODE用来区别不同的读写操作方式。当RM_MODE=1时,是普通读写外部存储器的方式;当RM_MODE=0时,可以让主机作为主器件,串行Flash存储器作为从器件,两者以SPI方式进行通信,利用此时产生的SPSCK信号对存储器进行高速读数据操作。另外,SPSCK信号经过变换与延时处理,可以供给LED做SCK移位信号用。
图3SPI配合计数器读外存电路
图4为使用致远LA5034逻辑分析仪的测量结果。单片机配备的晶振频率为36 MHz,SCK信号的频率测量结果约为9 MHz,即主频的1/4。
图4 SPI模式下读取数据速度测量
从调试的情况来看,应用此方式需要注意以下问题:
使用SPSCK信号读取外部存储器时,同样会产生SPI主从模式下的溢出错误,即连续传输多个数据时,后一个数据覆盖了前一个数据而产生的错误。这种错误产生的原因是从器件的传输标志SPIF相对于主器件的传输标志SPIF总有一定的滞后,在主器件连续发送数据时,会导致从器件的传输标志和主器件下一个数据的传输标志相重叠,而利用SPSCK触发计数器使地址递增读取数据,第一个收到的数据也会被覆盖。先启动SPI模式,再进入计数器读外存模式,可避免数据溢出错误。
另外,要注意计数器及外存芯片的读写速度必须与SPSCK相匹配。器件读取速度越高,数据出错的几率越低。在测试中发现,存取时间为35 ns的RAM芯片与此模式匹配效果最好。
在图3的运用案例中,LED单元板中的RCK信号必须在输出函数中另外给出。RCK的作用是锁存数据,即在每行数据串行输入后,给出RCK行号将整行数据输出显示在屏幕上。每输出一个字节的数据需要一个SCK信号,假设一行为128个点,那么在128个SCK后需要一个RCK信号。根据这一关系,可以从SCK中生成RCK信号(采用SCK连至计数器电路,计数器的块数根据屏幕行的最大点数确定,电路预置行点数值,计数满后给出RCK信号)。这样从数据的输出到送至显示就是一个纯硬件的实现过程,加快了数据显示的时间。 不过, 这样也增加了硬件的开销。这种设计思想值得进一步探讨。
结语
在显示设备对数据输出速度要求日益提高的情况下,对控制设备进行改造首选的办法是更换更高速率的微处理器,而硬件电路的挖潜往往容易被忽视。本文给出的例子虽是基于LED大屏幕应用的,但在LCD大屏幕等其他对数据有高速输出要求的系统中,同样具有借鉴意义。在实践运用中,建议首先考虑在原有的系统上进行硬件电路优化;如仍不能满足显示要求,再考虑更换高速率微处理器及用FPGA/CPLD器件进行输出电路简化处理的方案。如果两种方法配合使用,不但能提高数据的输出速率,还将大大降低控制电路的制作成本,提高系统的整体性能。