MCU(Micro Controller Unit;MCU)已被广泛应用在各个层面,从消费性产品到通讯系统,支援各种不同的工作。其中,8位元MCU因为同时拥有低成本及处理密集运算作业的能力而广受欢迎。 MCU特别擅长串联(sequential)处理以及支援各种非高速型(non-time critical)作业,一般运作速度约在20MHz左右,但有些MCU核心会切分内部时脉,让单一指令可有多组时脉周期运作。例如,较早期的CISCMCU,通常使用25组较简单的指令来执行一组乘法运算。
现今业者采取的作法则是利用多组RISC MCU,以较低的耗电量达到单时脉(clock)指令周期的模式;例如Atmel AVR MCU能在1MHz的时脉下达到1MIPS的处理效能。在如此优越的效能下,MCU可完成绝大多数的作业。这类MCU的体积相当小,但是可以用不同的简单的ALU单元与通用型I/O元件记忆体执行不同的多功能类比功能与汇流排介面差异化作业。
CPLD与MCU功能比较
因为可编程逻辑元件(PLD)能满足市场对于低耗电可编程逻辑解决方案的需求,大幅提升其在MCU市场的市占率,像是CPLD之类的可编程逻辑元件,也被应用在类似的领域。微处理器与CPLD主要的差异在于串联与平行的处理模式,MCU有时会以分支常式(branch routines)的模式执行指令。而CPLD则以平行(parallel)模式处理输入与输出的指令,故能达到更高的速度以及可预知的时序结果。对于已中断再趋动(interrupt driven)的元件而言,CPLD能达到大幅提升的速度。
CPLD速度极高,且系统速度能轻易超过300MHz;CPLD的时序特性经常以奈秒为单位而不以MHz为单位(100MHz等于10奈秒,200MHz等于5奈秒),输入与输出延迟为3.0奈秒的元件,其速度等于385MHz。 (图一)显示CPLD功能区块图;对于CPLD而言,这种架构经常被应用在各种元件。不同系列元件的差异点包括时脉速度、I/O标准以及安全功能。对于MCU而言,其架构大致相近,但大多数的系统增加了如时脉、ADC、DAC等功能。
《图一 CPLD功能区块图》 | 数据源:图片来源:Texas Instruments |
|
CPLD与MCU相似性
由于CPLD与MCU有类似的功能,因此拥有相似的特色,像是两者都具有可重复编程的能力,且通常支援JTAG测试功能,并能应用在类似的产品等。 (表一)列出两者之间的类似处。
表一 CPLD与MCU之相似性比较
元件类型 |
编程支援 |
支援语言 |
测试 |
研发工具 |
成本 |
CPLD |
协力厂商 |
HDL 或 schematic |
JTAG |
时序/功能模拟 |
0.80 至35.00美元 |
MCU |
协力厂商 |
C 或其它支援的程式语言 |
JTAG |
即时模拟 |
0.60 至40.00美元 |
有些厂商提供内线路(in-circuit)硬体除错器,能支援MCU以及嵌入型软体核心MCU;例如Nohau 就针对MCU与软体核心处理器提供多款除错器。
CPLD与MCU之差异性
但是MCU与CPLD亦有许多不同的地方。 CPLD可以打开电源时就立即启动,不需要开机程序,此外CPLD亦有极精准的时序模式,且运用平行模式处理,故能比以串联运作模式的MCU提供更高的效能。但是MCU则有其他可选择的附加功能,例如像A/D、专属I/O汇流排连结埠以及特定的针脚功能。 (表二)列出MCU与CPLD之间的差异。
表二 CPLD与MCU之差异性比较
元件类型 |
封装演进 |
速度 |
关机模式 |
指令集 |
类比功能 |
CPLD |
额外增加正反器与逻辑元件 |
500MHz序列385MHz混合 |
DataGATE (输入闸) |
依设计而异(数量不一) |
无 |
MCU |
额外功能 (A/D、DAC等.) |
12~50MHz |
待机/睡眠模式 |
通用(25~70) |
有(有些差异) |
虽然MCU提供较多的功能,但客户不一定会用到MCU全部的功能,而必须付出成本增加的代价;例如若要设计一套内含50组GPIO的8通道ADC,即可能要为其中用不到的功能付出成本。功能与价格之间的抉择,往往让人难以取舍,但选用恰好符合设计需求的方案,总比支付更多元件成本、承担设计失败的风险来的聪明。
在要求高安全性的产业中,像是电信业与工业设备市场,对以上差异性的风险已注意许久。这类设备依其性能以各种故障测试机制测试,通过各种检验,业者若运用可预测功能的可重复逻辑元件,通过检验则比较简单,若运用MCU,有更多复杂状态需要列入考虑。检验过程中会评估一串指令序列所可能产生的结果,而分支指令(branch instruction)通常会让检验流程复杂化,因为电压下降或停电会造成运作结果难以掌控。若采用CPLD,系统在电力回复后可重新载入原先的逻辑状态,故使用者可预测元件原本预设的状态,元件可根据预先定义的电力故障状况进行设计。系统测试方面,可将难以模拟的中断处理功能建置在PLD中,让测试作业更流畅。
如何在CPLD与MCU之间做选择
比较这两项功能相似但架构不同的产品其实相当有趣。类似之处,如MCU及CPLD软体核心微控制器都需要撰写程式;撰写组译程式码以应用于处理器或可重编程逻辑元件上。不过,不同的是可重编程逻辑元件可自行选用不同密度与功能的系列元件。市面上亦有许多专为可编程逻辑元件所开发的参考设计方案,例如像SPI、I2C及SMBus。
值得注意的是,就重复使用性及可移动性(portability)而言,可编程逻辑元件拥有更佳的成功率。运用VHDL等高阶语言进行硬体合成,比使用不同制造商提供的处理器更容易预测结果。透过VHDL,可重新编程逻辑元件的运用,可依目标环境与MCU特定功能之改变而改变。业者亦可能因矽元件升级或变更作业系统,被迫重新设定程式码。
同时使用CPLD与MCU
在某些状况下,这两种元件能相辅相成。对于非关效能的作业而言,CPLD提供针脚对针脚的快速效能及可预测之时序,而MCU则提供像是ADC、DAC及像是CAN与USB等汇流排介面。虽然这些功能会限制通用型I/O的数量,但我们可运用CPLD作为MCU连结埠的扩充器,满足这方面的需求。为了I/O数量购买尺寸较大之MCU,其成本远高于拥有必要功能的简化型MCU。 CPLD提供32至250组I/O,并能在I/O封装中加入更多的逻辑资源。CPLD的价格随着几何排列空间缩小持续下滑,让设计业者在需求、效能与价格之间取得最佳的平衡上能有更多的选择。
CPLD软体核心MCU介绍
以一套8位元的CPLD软体核心MCU设计方案PicoBlaze为例,该方案支援8位元资料汇流排与16位元指令汇流排,如(图三)。设计采用RISC(reduced instruction set computer)之「Harvard 架构」模型,内含独立的资料与指令连结埠。业者将C语言开发的程式码经交叉组译器组译成程式,使用VHDL程式语言,能运用对照组译器直接追踪架构的运算流程。
从许多角度来看,CPLD软体核心MCU是一套以常数为基础的元件。程式指定的常数主要支援下列应用:
- (1)以固定的资料值在ALU运算中应用;
- (2)以固定的连接埠位址存取外部的特定资讯或控制逻辑;
- (3)以固定的位址值控制程式执行序列。
指令集编码的功能是让任何指令字元都能指定常数,因此使用的常数不会增加程式体积或造成执行上的负担。这种效率模式能将简单的指令集扩展为整个范围的「模拟执行单元」,所有指令在两个时脉周期内执行完毕。在程式处于被嵌入至即时环境的状态时,一致化的执行速度有助于程式执行时间上的判断。程式长度为256个指令,所有位址值为8位元,且储存于指令编码中。固定的记忆体大小让模组能维持固定的效能。若有必要,设计方案可进行扩充借以支援较大的记忆体范围。
指令集
指令集的状况亦相当类似。但对于CPLD软体核心MCU而言,其指令集是可变的;例如可根据本身的需求加入或删除特定的指令。 (表三)比较RISC MCU与CPLD软体核心MCU的指令集。
表三 RISC MCU与CPLD软体核心MCU指令集比较
元件 |
RISC MCU |
CPLD软体核心MCU |
基本指令集 |
ADD、ADC、ADIW、SUB、SUBI、SBC、SBCI、SBIW、AND、ANDI、OR、ORI、EOR、COM、NEG、SBR、CBR、INC、DEC、RST、CLR、SER、RJMP、IJMP、RCALL、 ICALL、RET、RETI、PSE、CP、CPC、CPI、SBRC、SBRS、SBIC、SBIS、BRBS、BRBC、BREQ、BRNE、BRCS、BRCC、BRSH、BRLO、BRMI、BRPL、BRGE、BRLT、BRHS、BRCH、 BRTS、BRTC、BRVS、BRVC、BRIE、BRID、MOV、LDI、LD、LDD、LDS、ST、STD、STS、LPM、IN、OUT、PUSH、POP、SBI、CBI、LSL、LSR、ROL、ROR、 ASR、SWAP、BSET、BCLR、BST、BLD、SEC、CLC、SEN、CLN、SEZ、CLZ、SEI、CLI、SES、CLH、NOP、SLEEP、WDR(以及各种衍生指令) |
JUMP、CALL、RETURN、INPUT 、OUTPUT、RETURN ENABLE、SR、SR1、SRX、SRA、RR、REURN
DISABLE、RETURN ENABLE、INTERRUPT ENABLE、INTERRUPT DISABLE、LOAD、AND、OR、XOR、ADD、ADD、SUB、SUBCY、SL0、SL1、SLX、SL、RL
(以及各种衍生指令) |
新增或删除指令
CPLD软体核心MCU的优点在于让能视本身需求扩充或删除元件的功能。例如仅须将VHDL程式码不需要的指令加上注解符号,就可将该指令从指令集中删除。可视需要将指令从组译器中移除,但这个动作其实是不必要的,若有些程式必须运用现有指令以外的指令,亦可自行加入指令。设计者亦能同时删除与新增指令;例如大多数程式开发人员在日常的程式中使用约20组指令,可先选出这20种经常使用的指令再移除其余部份,再开始撰写程式码。若发觉加入专为特定作业设计的指令可突破「内部回圈」(inner loop)的效能瓶颈,亦可自行撰写VHDL程式码。 CPLD软体核心MCU能运用处理器中的DualEDGE正反器,在时脉的开始与结束处执行运算。
DSP 范例
为展现CPLD软体核心MCU的弹性,以下举一个DSP的范例,将汇流排中的程式码与位元进行反置,采用快速傅立叶转换技术(Fast Fourier Transforms),求出的值通常根据位址管线进行处理,这个流程是基本演算法的重要步骤。若要运用「标准」指令执行这些演算,须执行多组「遮罩与与转换」指令,这将造成处理效率上的瓶颈。
(表四)列出组译器的基本运作流程,以显示暂存器的内容。演算流程一开始是载入一个标为A-H的资料位元组。这个位元组第一步先进行内部切换(四次转换),之后内部位元依序以AND/OR布林运算式(Boolean)推出至外层,然后每次以两个位元为单位将结果储存至目标暂存器。经过一个流程(pass)后,最终暂存器储存的内容正好是原始资料的倒序值。依照演算法的细节不同,整个流程须使用12至18个指令。在这个范例中,我们以指标(pointer)与计数器来管理回圈,并展出其演算内容
表四 位元反序排列步骤
步骤编号 |
状态 |
注解 |
1 |
|A|B|C|D|E|F|G|H| |
原始状态 |
2 |
|E|F|G|H|I|J|K|L| |
切换半位元 |
3 |
|0|0|0|1|0|0|0|1| |
遮罩2位元 |
4 |
|0|0|0|H|0|0|0|D| |
OR INT结果 |
5 |
|D|E|F|G|H|A|B|C| |
右侧ROOT 切换 |
6 |
|0|0|H |0|0|0|D|0| |
左侧ROT INT 结果 |
7 |
|0|0|0|1|0|0|0|1| |
遮罩2位元 |
8 |
|0|0|H|G|0|0|D|G| |
OR INT结果 |
9 |
|C|D|E|F|G|H|A|B| |
右侧ROOT 切换 |
10 |
|0|H|G|0|0|D|C|0| |
左侧ROT INT 结果 |
11 |
|0|0|0|1|0|0|0|1| |
遮罩2位元 |
12 |
|0|H|G|F|0|D|C|B| |
OR INT结果 |
13 |
|B|C|D|E|F|G|H|A| |
右侧ROOT 切换 |
14 |
|H|G|F|0|D|C|B|0| |
左侧ROT INT 结果 |
15 |
|0|0|0|1|0|0|0|1| |
遮罩2位元 |
16 |
|H|G|F|E|D|C|B|A| |
OR INT结果 |
在(图四)中,我们将「反置」(flip)指令加入VHDL,再重新编译程式码,此时处理器就会「重新布线」并加入这组关键指令。这种作法能将许多指令透过各种合成工具,结合成逻辑闸重新布线的效果。许多位元层级的运算演变成对CPU重新布线,最重要的是由合成器执行全部的工作。
指令改良
先前提到的步骤是指令集最佳化,但无法借此加入新功能。许多MCU在机板中内建许多功能区块,其作用超越指令集。例如许多8位元的MCU内建周边计数器或计时器、中断控制器及DMA线路。运用CPLD软体核心MCU,业者可根据所选用之CPLD的密度,在晶片中加入适当的周边功能。 (表五)列出各种扩增功能使用到的巨单元(macrocell)估计值。
表五 巨单元估计值
功能 |
巨单元 |
IrDA 与UART |
87 |
计时器 |
16 以上 |
DMA 埠 |
16-32 |
Manchester 编码器/解码器 |
55 |
无线收发器 |
156 |
16b/20b 编码器/解码器 |
76 |
Flash NAND 介面 |
135 |
UART |
61 |
SPI 介面 |
135 |
DDR SDRAM 介面 |
128 |
SMBus 控制器 |
158 |
在选择加入功能时须注意一项重点,即选用实际需要的功能,才能得到最佳的使用效率。大多数业者根本不需要通用型非同步接收器/传送器(universal asynchronous receiver/transmitter),而仅需要收发器(RT)功能。因此业者选用内含50种功能的方案,却仅用到其中的2种。这造成花钱购来的元件中,内含许多从未用到电路,形成不必要的浪费。为了避免这种浪费,仅须选用需要的功能,才能尽可能取得最低廉、最快速、最省电的解决方案。
提升效能
下一步就是充份发挥设计方案的资源,典型的改良方法是进行「调校」(tune)──先观察效能行为,找出处理器执行各种作业所耗用的时间,判断作业的内容,再思索最佳的改良途径。之后再建置新版本的架构以及/或程式码,然后再进行评估。
其中一种建置方式就是运用CPLD研发工具电路板,如(图五)所示。许多设计方案可轻易搭配电路板上的256-macrocell XC2C256。电路板上留有空置的针脚接点,可加入一组64 macrocell XC2C64,其讯号已与XC256相互连结。运用计时器与计数器可轻易在64 macrocell CPLD中建构一个小型硬体效能监视器,能计算256 macrocell CPLD中不同程式区段所耗费的时间,并能回报执行时间。透过检查位址空间与时间方面的行为,就可判断出各种作业所耗用的时间。
对照组译器
如先前所述,CPLD软体核心MCU对照组译器有完善的注解,能直接处理组译码与设计档案中的VHDL程式码。转译器本身是使用ANSI-C语言所撰写,并在Microsoft组译器上进行编译。交叉组译器具有极高的移植能力,并支援多种输出档案格式;例如它产生的二进位输出档案,能以英特尔的十六进位程式码(Intel hex)格式载入至外部EPROM。交叉组译器亦能为VHDL模拟器产生重要的模组档案。可以运用高速模拟器立即分析程式码,判断已建置程式码的功能与效率。最后再将程式码载入至CPLD研发工具电路板,检查实际的执行结果是否如先前所预期。
结论与建议
运用CPLD软体核心MCU,设计者可自行开发适合的系统,避免MCU被淘汰的窘境。此外,在学会如何变更指令以及分析指令的使用状况后,亦可让本身的应用程式达到最佳的效能,可将处理器设定成16或什至32位元,甚至是非二进位的模式。
(Xilinx美商智霖公司行销经理)