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、ADDCY、SUB、SUBCY、SL0、SL1、SLX、SLA、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| |
右側ROT 切換 |
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| |
右側ROT 切換 |
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| |
右側ROT 切換 |
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美商智霖公司行銷經理)