本文介紹了一種採用PLD和數(shù)據(jù)通路(datapath)來解放微控制器系統(tǒng)中CPU任務(wù)的方案。在大多數(shù)微控制器結(jié)構(gòu)中,智慧的CPU身邊總會環(huán)繞著一系列不可程式的週邊設(shè)備。週邊設(shè)備的功能有限,通常它們只負(fù)責(zé)數(shù)據(jù)形式的轉(zhuǎn)換。例如,I2C週邊設(shè)備只是實(shí)現(xiàn)串列和平行數(shù)據(jù)格式之間的轉(zhuǎn)換,而ADC則實(shí)現(xiàn)類比到數(shù)位訊號的轉(zhuǎn)換。CPU因此不得不完成所有的數(shù)據(jù)處理工作,實(shí)際上它還能做些更有用的事情。此外,管理週邊設(shè)備將會導(dǎo)致CPU韌體異常復(fù)雜,并可能需要一個(gè)快速高效的CPU在即時(shí)的時(shí)序限制下執(zhí)行這些韌體。這又會導(dǎo)致更多的潛在程式漏洞,因而需要使用更復(fù)雜和昂貴的除錯(cuò)設(shè)備等。
但是如果週邊設(shè)備具備足夠的復(fù)雜度、靈活度與智慧,是否能有效地減輕CPU的許多任務(wù)呢?復(fù)雜的設(shè)計(jì)可以透過結(jié)構(gòu)重建,變?yōu)橐唤M分佈在CPU和週邊設(shè)備中間的簡單設(shè)計(jì)。CPU將可以執(zhí)行更少的任務(wù),或進(jìn)行更少的中斷處理,因而使程式漏洞更容易被發(fā)現(xiàn)和修正。整體設(shè)計(jì)將使系統(tǒng)具有更好的穩(wěn)定性,并且便于再使用部份設(shè)計(jì)。CPU處理任務(wù)減少就可以執(zhí)行在較低的速度,因而降低功耗,或者這些額外可用頻寬可用來實(shí)現(xiàn)市場部規(guī)劃的下一代產(chǎn)品。然而,週邊設(shè)備設(shè)計(jì)仍需具成本效益,否則整個(gè)微控制器可能變得太貴。本文將展示如何把智慧、靈活、低成本、可定製的數(shù)位週邊設(shè)備設(shè)計(jì)到微控制器并配置,以幫助實(shí)現(xiàn)穩(wěn)定的分佈式系統(tǒng)設(shè)計(jì)。
智慧邏輯選擇─PLD還是數(shù)據(jù)通路?
通常有兩種方法建構(gòu)一個(gè)智慧的可配置週邊設(shè)備。首先是使用PLD。如圖1所示,PLD有一個(gè)驅(qū)動若干巨集單元的積和(sum of products)邏輯閘陣列?!甌’和‘C’符號表示每一個(gè)乘積項(xiàng)都能產(chǎn)生一個(gè)真值或補(bǔ)數(shù)(反向)輸出,這樣無論是正、負(fù)邏輯都可以支援。

圖1:一個(gè)PLD實(shí)例(包括12個(gè)輸出項(xiàng)、8個(gè)乘積項(xiàng)、4個(gè)巨集單元)。
圖1顯示了一個(gè)簡單的PLD例子。PLD可以有成百上千的巨集單元,每個(gè)巨集單元最高由16個(gè)乘積項(xiàng)驅(qū)動。乘積項(xiàng)裡的與閘和或閘可以互聯(lián)形成高度靈活的定製邏輯功能。巨集單元是典型的時(shí)脈架構(gòu),它們的輸出可以反饋到乘積項(xiàng)陣列,因此允許製作狀態(tài)機(jī)。
大規(guī)模PLD可以用來形成復(fù)雜的邏輯功能,甚至是完全的CPU,因此PLD當(dāng)然可以用來實(shí)現(xiàn)智慧數(shù)位週邊設(shè)備。然而,很多閘可能只是實(shí)現(xiàn)諸如計(jì)數(shù)器或加法器等簡單的邏輯功能,但對于更復(fù)雜功能的實(shí)現(xiàn),基于PLD的方案就會變得很貴。從某種程度上說,使用真正的CPU會更合理。
CPU的一個(gè)非常簡單的形式是基于算術(shù)邏輯單元(ALU)的數(shù)據(jù)通路,也稱為奈米處理器(nano-processor)。數(shù)據(jù)通路只是實(shí)現(xiàn)幾個(gè)常用函數(shù),但會比使用PLD實(shí)現(xiàn)的效率更高。圖2:顯示了一個(gè)基于ALU的簡單的數(shù)據(jù)通路。典型的ALU可以進(jìn)行各種作業(yè),通常是8位元作業(yè):向上計(jì)數(shù)(遞增)、向下計(jì)數(shù)(遞減)、加、減、邏輯與、邏輯或、邏輯異或,左位移、右位移。這裡有兩個(gè)8位元累加器,它們能夠?yàn)锳LU輸出充當(dāng)輸入數(shù)據(jù)暫存器或記憶體。一個(gè)輸入時(shí)脈訊號沿產(chǎn)生一次作業(yè)。函數(shù)選擇暫存器用來控制:

圖2:基于ALU的數(shù)據(jù)通路。
* 產(chǎn)生什么作業(yè)。
* 該作業(yè)的源暫存器。
* 輸出的目的暫存器。
根據(jù)數(shù)據(jù)通路的具體設(shè)計(jì),其可能會做一系列復(fù)雜作業(yè),如表1顯示。

表1:數(shù)據(jù)通路函數(shù)的實(shí)現(xiàn)舉例。
這個(gè)函數(shù)選擇模組實(shí)際上可以是一個(gè)小容量的SRAM,預(yù)加載所需的函數(shù)選擇位元,SRAM的地址線可以用來選擇執(zhí)行哪個(gè)作業(yè)。最后,多數(shù)據(jù)通路可以用進(jìn)位和移位訊號鏈在一起,以便可以進(jìn)行多位元組作業(yè)數(shù)。
由于數(shù)據(jù)通路只有少數(shù)特定功能函數(shù),很容易最佳化設(shè)計(jì),因此其製作成本較低。然而,對于實(shí)現(xiàn)復(fù)雜的邏輯,數(shù)據(jù)通路遠(yuǎn)遠(yuǎn)沒有PLD那么靈活。那么,對于製作智慧、靈活、低成本的數(shù)位週邊設(shè)備來說,哪一種方法是更好的呢?是PLD還是數(shù)據(jù)通路?答案是,將兩者相結(jié)合。下面是一個(gè)實(shí)例,來看看是如何實(shí)現(xiàn)的。
通用數(shù)位模組
同時(shí)使用PLD和數(shù)據(jù)通路的系統(tǒng)實(shí)例是Cypress半導(dǎo)體的PSoC3和PSoC5晶片。每個(gè)系統(tǒng)包含最高24個(gè)通用數(shù)位邏輯子系統(tǒng),稱為通用數(shù)位模組(UDB),其結(jié)構(gòu)如圖3所示。一個(gè)UDB包含兩個(gè)圖1所示的PLD,一個(gè)數(shù)據(jù)通路以及狀態(tài)機(jī)和控制暫存器。有兩個(gè)鏈路路徑,一個(gè)用于PLD,一個(gè)用于數(shù)據(jù)通路。由一個(gè)路由通道來連接各UDB子區(qū)塊之間以及UDB之間的訊號。PLD配置、數(shù)據(jù)通路和路由透過寫入U(xiǎn)DB配置暫存器來實(shí)現(xiàn)(圖中未顯示)。

圖3:通用數(shù)位模組(UDB)結(jié)構(gòu)圖。
UDB的PLD設(shè)計(jì)在圖1中進(jìn)行了描述。如圖4,UDB數(shù)據(jù)通路類似于圖2所示的基本的數(shù)據(jù)通路,但是它更精密復(fù)雜,因?yàn)閾碛懈鄷捍嫫骱透嗟墓δ堋?/p>

圖4:UDB數(shù)據(jù)通路結(jié)構(gòu)圖。
* 8位元ALU可以實(shí)現(xiàn)所有的七個(gè)基本函數(shù)─遞增、遞減、加、減、與、或以及異或,并且它有單獨(dú)的位移和位元遮罩模組來進(jìn)行ALU結(jié)果后處理(8位元ALU傳輸功能只需透過ALU傳送一個(gè)值完整移和位元遮罩模組)。位移模組可以做左位移、右位移、半位元組交換和傳輸。遮罩模組可以和單獨(dú)的遮罩暫存器裡的內(nèi)容逐位元相與(圖中未顯示)。
* 作業(yè)可以使用兩個(gè)累加器(A0,A1)和兩個(gè)數(shù)據(jù)暫存器(D0,D1)來完成。兩個(gè)FIFO暫存器(F0、F1)可用來在數(shù)據(jù)通路和CPU之間傳輸數(shù)據(jù)。FIFO深度可達(dá)4位元組。這一結(jié)構(gòu)可以使多任務(wù)處理變得簡單;在不同的時(shí)間,獨(dú)立作業(yè)可以在暫存器子集完成。例如,A0、D0、F0可以用于一個(gè)任務(wù),而A1、D1、F1則適用于不同的任務(wù)。
* 廣泛的狀態(tài)條件(例如:比較、零檢測、所有個(gè)體檢測、溢出檢測)可以應(yīng)用到累加器,數(shù)據(jù)暫存器,以及路由到元件其它地方。
靈活的路由
雖然UDB在PLD和數(shù)據(jù)通路兩個(gè)子系統(tǒng)都有很多特色,但廣泛的數(shù)位路由讓它們?nèi)缁⑻硪?。訊號可以在PLD和數(shù)據(jù)通路之間路由,遍及整個(gè)UDB和元件的其它地方,形成了復(fù)雜的數(shù)位系統(tǒng)互連(DSI)結(jié)構(gòu)。
實(shí)例
本例中,用一個(gè)UDB數(shù)據(jù)通路來製作一個(gè)帶重載(reload)功能的8位元數(shù)位計(jì)數(shù)器。為了實(shí)現(xiàn)這點(diǎn),連接一個(gè)狀態(tài)條件回到控制存貯SRAM地址線,如圖5所示。

圖5:用UDB數(shù)據(jù)通路製作帶重載功能的計(jì)數(shù)器。
在這個(gè)設(shè)計(jì)中,A0是計(jì)數(shù)暫存器,D0是重載暫存器。需要兩個(gè)函數(shù),一個(gè)用來遞減計(jì)數(shù),一個(gè)從週期暫存器重載計(jì)數(shù)器;這些函數(shù)在控制儲存RAM裡預(yù)載了。
邏輯如下:當(dāng)A0不為0時(shí),狀態(tài)輸出將會變低,在地址0會執(zhí)行遞減作業(yè)。當(dāng)A0為0時(shí),狀態(tài)輸出將為高,在地址1會執(zhí)行重載作業(yè)。
所有作業(yè)都產(chǎn)生在時(shí)脈輸入的上升沿,可以記錄時(shí)脈沿?cái)?shù)量。時(shí)脈輸入可以來自各種時(shí)脈源。狀態(tài)輸出可以透過DSI路由,包括到DMA和中斷請求輸入。使用數(shù)據(jù)通路鏈和遮罩模組,該計(jì)數(shù)器的大小可以是任何位數(shù),不受限于8的倍數(shù)。
圖5所示為減法計(jì)數(shù)器。它可以很容易的轉(zhuǎn)換成加法計(jì)數(shù)器,可以透過使用不同的狀態(tài)輸出(A0= =D0)和控制儲存SRAM裡的不同函數(shù):A0=A0+1和A0=A0A0。異或任何值的結(jié)果永遠(yuǎn)為0。
透過使用PLD這個(gè)簡單的設(shè)計(jì)可以創(chuàng)造更復(fù)雜的應(yīng)用。以一個(gè)紅綠燈控制器為例,紅綠燈控制器週期由綠、黃、紅叁種狀態(tài)構(gòu)成,因此需要一個(gè)狀態(tài)機(jī)。每個(gè)狀態(tài)變化到下一個(gè)狀態(tài)之前會持續(xù)一定時(shí)間,所以必須有一個(gè)計(jì)數(shù)器。為了簡單起見,假設(shè)‘綠燈’時(shí)間和‘紅燈’是相同,但‘黃燈’時(shí)間不同。
只需要使用3個(gè)數(shù)據(jù)通路暫存器(假設(shè)為8位元計(jì)數(shù)值)就可以實(shí)現(xiàn)這個(gè)時(shí)序結(jié)構(gòu)。A0為計(jì)數(shù)暫存器,D0為‘綠’和‘紅’狀態(tài)保持計(jì)數(shù)器重載值,D1為‘黃’狀態(tài)保持計(jì)數(shù)器重載值。模組結(jié)構(gòu)圖如圖6顯示。

圖6:採用UDB PLD和數(shù)據(jù)通路建構(gòu)的紅綠燈控制器結(jié)構(gòu)圖。
要保存在控制儲存RAM裡的作業(yè)是:
A0 = A0 - 1 // 計(jì)數(shù)
A0 = D0 // 重載‘綠’或‘紅’
// 計(jì)數(shù)值
A0 = D1 //重載‘黃’值
狀態(tài)機(jī)在PLD裡實(shí)現(xiàn)。數(shù)據(jù)通路條件輸出反饋到PLD,以顯示需要改變狀態(tài)了。PLD也有這樣的邏輯,根據(jù)目前的狀態(tài)和從數(shù)據(jù)通路反饋的訊號,控制執(zhí)行哪個(gè)數(shù)據(jù)通路作業(yè)和哪個(gè)燈要點(diǎn)亮。
超越基礎(chǔ)
紅綠燈控制器是一種簡單的應(yīng)用類型,通常使用CPU編程。然而,我們已經(jīng)看到,除了初始化程式碼,這個(gè)功能可以完全和CPU沒關(guān)係而可以由智慧的可配置週邊設(shè)備完成。這個(gè)功能可以很容易地?cái)U(kuò)展以支援附加需求,例如轉(zhuǎn)換訊號、行人行走訊號、車輛檢測感測器、流量/緊急事件轉(zhuǎn)發(fā)器。
CPU需要做什么
透過使用PLD和數(shù)據(jù)通路的有效組合,可以製作智慧的、靈活的、低成本的週邊設(shè)備,以減輕CPU的負(fù)擔(dān)。然而,如果這么多的功能都由週邊設(shè)備處理了,那還留著CPU做什么呢?在許多情況下,CPU不需要做很多事,在某些情況下系統(tǒng)初始化后,CPU就可以關(guān)掉了。不過,更實(shí)用的方案是使用CPU做CPU能做得最好的事情,例如:
* 復(fù)雜的運(yùn)算
* 字符串和文本處理
* 資料庫管理
* 通訊管理
* 系統(tǒng)管理
例如,在我們的紅綠燈應(yīng)用中,CPU可以用于以下幾個(gè)方面:
* 檢測車輛闖紅燈
* 使用相機(jī)拍攝牌照
* 從照片上擷取車牌文字資訊
從國家資料庫中查閱車主資訊,以及* 向車主發(fā)送罰單
透過由智慧週邊設(shè)備完成很多任務(wù),CPU可以輕鬆地去做更有價(jià)值的任務(wù)。
電子發(fā)燒友App
















評論