微控制器是最原始的"芯片系统"(SoC)器件。在最近几年,FPGA和PLD厂商提出了"可编程芯片系统"(SOPC)的概念,用可编程逻辑来设计专用硬件如微控制器。
创建专用微控制器的要素包括全功能的32位RISC微处理器、现成的外设以及可选的专用外设、IP和各种开发工具。这些要素都是现成的,再结合低成本的可编程器件(PLD),设计者就可以为现有的微控制器增加各种功能。本文讨论设计者在用PLD设计专用微控制器时的问题,列举的设计实例包括用户定义的硬件加速专用指令和外设。
在过去30多年中,微控制器的核心通用单芯片微处理器用于各个领域中。它在功能和原始计算能力上有巨大的优势。在其发展过程中,越来越多的复杂指令让编译器自行分析如何使用这些指令,并在CISC和RISC之间争论不休。在大计算量的应用中,CISC微处理器会逐渐进入DSP领域。然而在一些应用中,需要类DSP功能的子集。这时,设计者必须在汇编代码和更高频率处理器之间权衡,或选用DSP处理器作为主处理器,或用协处理器完成计算工作。
采用可编程逻辑中的微处理器系统,就可以有其它选择。现在,设计者能够自由地采用特定的软件模块,象硬件那样编写这些代码,从微处理器上看来就是调用一?quot;专用指令"。从软件工程的角度上看,这只是简单的C或汇编语言的功能调用,但不是指令序列,而是用于执行相关算法的硬件模块。同样的,还可以根据具体情况随时改变系统结构,包括在多主总线上增加多仲裁从外设,或根据需要增加专用外设和DMA。本文将给出详细的例子和采用专用指令优化后的MP3播放器的性能参数,以及浮点单元和Web服务器例子的性能参数,藉此说明随着相应性能的提高,可编程逻辑中微控制器能够实现多种实际需求。每个例子都采用了2.1版Nios和2.5版SOPC
Builder,以及Altera的Nios开发工具包。
详例:MP3播放器
专用指令为Nios处理器的算术逻辑单元增加了专用逻辑,提高了系统的性能。我们用MP3播放器设计来说明专用指令能够增强实际大计算应用的性能。根据应用的情况增加两条专用指令,就能够将整个系统的性能提高大约3倍。
本文选用MP3解码器基于如下考虑:
1.大部分人们都很熟悉。
2.它相对简单,软件代码广泛使用,在PC上不需要特别的硬件就可以实现。
3.它的计算量很大,其中的重复操作可以用专用指令实现。
MP3解码器
在一些MP3播放器中,处理器用来控制和传送数据。专用的MP3解码器ASIC来处理大计算量的解码并把数据传送给音频器件。在实例设计中,Nios处理器处理着每一件工作:控制信号、传送数据和MP3解码。
通常,MP3解码器具有以下功能:
通过IDE接口从CF中读取MP3数据
在SRAM中缓冲MP3数据
对MP3数据进行解码
把MP3边带合成到PCM数据
把PCM数据发送给脉宽调制器
MP3解码使用的软件是"MPEG Audio Decoder"或"MAD"。MAD有以下特点:
100%定点(整数)计算
互连网上有源码
在GNU通用公共许可(GPL)下发布
在本文中将参考源码中的功能。
使用专用指令
MP3解码的大部分执行时间是边带的合成 。因此我们关心的功能是"mad_synth_fram"。两个功能可以很容易用专用指令fmul和DCT32来优化。
fmul:
f_mul和 mad_f_mul 是MAD使用的宏,用整数乘法模拟浮点乘法。这些宏的定义如下:
#define mad_f_mul(x, y) ((((x) + 0x00002000L) >> 14)*(((y)
+ 0x00002000L) >> 14))
#define f_mul(x,y)(((x)| 0x0001FFFFL )*((y)| 0x0001FFFFL))
这些功能是简单的一组移位、加法、乘法和或操作,它们用硬件很容易实现。创建一个硬件专用指令fmul,它执行前面的软件宏。用这个预定义的选项,能够把这些宏集成到一个专用指令中。下面是用专用指令f_mul和mad_f_mul定义的代码:
#define f_mul(x,y) nm_fmul((x), (y))
#define mad_f_mul(x,y) nm_fmul_pfx(1, (x),(y))
DCT32:
DCT32功能用来执行MP3解码中的离散富立叶变换(DCT)。MAD软件用优化的DCT增加性能。从软件方面看,这种优化的算法比通用的DCT具有更高的性能,只用了80个乘法,而标准DCT需要1024个乘法。
本文中,DCT专用指令所使用的硬件是有Celoxia提供的,这是可重配置计算方案提供商,采用了基于Handel-C的设计工具。DCT32专用指令具有以下特性:
能存储32个输入和32个输出
在DCT计算过程中,独立于CPU
使用预定义的指令接收命令:
装入/卸载
启动DCT计算
轮询是否完成
因为可以轮询专用指令看是否完成,我们能够同时运行其它代码直到需要DCT输出。在那时,我们可以轮询专用指令看是否已经完成了计算。如果完成,就卸载输出数据,同时转载下一组输入数据。
性能和规模
在测试中,我们测算了用硬件乘法指令以及专用指令fmul和DCT32完成单个mad_synth_frame功能所需的周期数。结果见表1。性能改善不是没有代价的。专用指令改善了性能,需要额外的硬件资源(逻辑单元和存储器)。3个实例设计中所需的硬件资源也参见表1。
最有效的专用指令是fmul,所需的周期数量减少了77%,而系统规模只增加了3%。规模增加很小是因为fmul专用指令无需专用的硬件乘法器。
并行模式运行的DCT32所需的周期数量和fmul相比减少了21%。代价是比fmul设计多占用了18.9%的LE资源。
把专用指令所需的额外资源和性能增加情况和只用硬件乘法的基准系统比较,发现完成mad_synth_frame所需的周期数量减少了80%以上,而系统规模只增加了22.3%。
例子:浮点专用指令
在软件中进行浮点运算相当慢。极少的微控制器支持浮点,只是要求设计者使用软件库或外部浮点单元。在一些情况下,只需要部分浮点指令就可以解决问题。专用指令允许设计者选择哪些操作用硬件实现,哪些留给软件库函数实现。
这是一个实际的例子,一个浮点操作子集包括指令乘法、乘取反、绝对值和求反。这个部分浮点单元使用了1019个LE。每4个指令是单个单元的一部分,用独立前缀调用。表2是每个4浮点指令软件版的性能改善情况。
例子:嵌入Web服务器
可编程逻辑器件和专用指令通过改善计算性能提高系统性能的能力由最后两个例子可以证明。而且,可编程逻辑允许改变嵌入微控制器设计的体系结构,这样能够改善整个系统的性能。本例中,我们开发一个web服务器,它服务多个页面,包括60KB的图像。两个"吞吐量"的测算见表3。首先,"HTTP服务器吞吐量"是从客户端到最终传送和确认的端到端性能。其次,"传送吞吐量"是简单的测算在10Mbps以太网通道上传送http包的时间。
系统结构的优化包括增加校验外设,它把校验IP包的计算从微处理器分离出来,由系统附加的硬件外设并行处理。另一个系统优化方案是为系统增加一个DAM控制器,用来把包从存储器拷贝到MAC/PHY芯片,或从MAC/PHY芯片拷贝到存储器,而不象基准系统那样由微处理器来完成。最后,把这两种方式结合在一起,得到一个整体的吞吐量。
结论
本文提供的数据说明了把软件模块交由硬件处理,或改变微处理器系统的体系在性能方面的改善。必须注意的是所有的例子都在同样的开发板上完成,速度为33MHz。常见的技巧如增加原始时钟频率,采用更快的存储器或增加快速缓存,对系统设计者仍然有用。用可编程逻辑微控制器,设计者有更多的工具改善系统的性能。对微控制器采用可编程逻辑的优势在新设计中一览无余,可以在几分钟内用迭代方法实现设计,软件和硬件开发的界限越来越模糊。
|