嵌入式系統(tǒng)往往執(zhí)行比較單一的任務(wù),針對(duì)某種特定應(yīng)用而專門設(shè)計(jì),但目前在嵌入式系統(tǒng)中采用的微處理器絕大部分都是通用嵌入式微處理器,其通用的指令集面對(duì)千差萬(wàn)別的嵌入式應(yīng)用時(shí)暴露出專用性差,執(zhí)行效率低的弱點(diǎn)。另一個(gè)問(wèn)題是,目前應(yīng)用的嵌入式微處理器都是硬核,功能模塊和指令集都是固定的,當(dāng)應(yīng)用發(fā)生較大變化時(shí),很難通過(guò)對(duì)微處理器功能模塊和指令集進(jìn)行擴(kuò)展來(lái)適應(yīng)變化,往往只能換用一款新的微處理器,甚至重新設(shè)計(jì)整個(gè)嵌入式系統(tǒng)的硬件和軟件,浪費(fèi)了大量的時(shí)間和金錢。因此,如何提高指令集的針對(duì)性,提高指令的執(zhí)行效率以及如何增強(qiáng)嵌入式微處理器的擴(kuò)展能力成了困擾嵌入式系統(tǒng)開(kāi)發(fā)人員的兩個(gè)難題。
1.ASIP和FPGA
ASIP的提出是微處理器設(shè)計(jì)理念的一項(xiàng)重大創(chuàng)新。ASIP(Application-Specific Instruction set Processor)即專用指令集處理器,它相對(duì)傳統(tǒng)微處理器最大的特點(diǎn)就是其指令集針對(duì)特定應(yīng)用專門設(shè)計(jì),一條指令就可以完成該種應(yīng)用常做的一系列運(yùn)算,例如一些常用算法,這樣就極大的提高了指令的執(zhí)行效率,往往若干條普通指令幾十個(gè)時(shí)鐘周期完成的操作用一條專用指令幾個(gè)時(shí)鐘周期就完成了。
采用ASIP理念設(shè)計(jì)微處理器可以在很大程度上解決上一節(jié)提到的指令集專用性差,指令執(zhí)行效率低的問(wèn)題,但這是要付出代價(jià)的,因?yàn)檫@些專用指令一般需要專門硬件電路支持才能實(shí)現(xiàn)。
ASIP用傳統(tǒng)的集成電路技術(shù)實(shí)現(xiàn)是不現(xiàn)實(shí)的,集成電路設(shè)計(jì)復(fù)雜,開(kāi)發(fā)周期長(zhǎng),定型后無(wú)法進(jìn)行擴(kuò)充,這樣每遇到一種新應(yīng)用,就得重新設(shè)計(jì)一款專用芯片,成本是不可接受的,這在一個(gè)時(shí)期內(nèi)限制了ASIP的發(fā)展,直到FPGA(Field Programmable Gate Array,現(xiàn)場(chǎng)可編程門陣列)的出現(xiàn),才為ASIP的實(shí)現(xiàn)提供了可能。
FPGA內(nèi)部包含可配置邏輯模塊CLB(Configurable Logic Block),可以方便的用硬件描述語(yǔ)言進(jìn)行開(kāi)發(fā)。硬件描述語(yǔ)言描述要實(shí)現(xiàn)的電路的功能,經(jīng)過(guò)編譯、綜合形成配置FPGA芯片的字節(jié)碼文件,經(jīng)下載后就可以在CLB內(nèi)部形成一塊模擬的專用電路,功能與實(shí)際電路完全一樣,這樣就可以實(shí)現(xiàn)對(duì)ASIP中專用指令的支持。用FPGA實(shí)現(xiàn)ASIP,相對(duì)傳統(tǒng)的集成電路來(lái)說(shuō),最大的優(yōu)點(diǎn)是擴(kuò)展性好,遇到新應(yīng)用時(shí),完全可以對(duì)一個(gè)較小的軟核原型進(jìn)行擴(kuò)充,通過(guò)添加新模塊,實(shí)現(xiàn)對(duì)針對(duì)該應(yīng)用設(shè)計(jì)的專用指令的支持,迅速完成新的設(shè)計(jì)。此外,F(xiàn)PGA還有設(shè)計(jì)方便,開(kāi)發(fā)周期短,可重復(fù)編程等優(yōu)點(diǎn)。
基于以上討論,可以看出ASIP+FPGA設(shè)計(jì)模式可以從很大程度上解決引言中提到的兩個(gè)難題。為了進(jìn)行更深入的研究,我們對(duì)該設(shè)計(jì)模式進(jìn)行了嘗試,用VHDL硬件描述語(yǔ)言在FPGA上實(shí)現(xiàn)了一個(gè)8位微處理器軟核(以下稱為WolfMCU),并為該微處理器實(shí)現(xiàn)了6條專用指令,每一條專用指令都由FPGA芯片中的專用電路支持。
2.WolfMCU體系結(jié)構(gòu)設(shè)計(jì)
微處理器常用的體系結(jié)構(gòu)有兩種――馮氏結(jié)構(gòu)和哈佛結(jié)構(gòu)。在馮氏結(jié)構(gòu)中,指令和數(shù)據(jù)使用同一個(gè)存儲(chǔ)器,經(jīng)由同一個(gè)總線傳輸,而在哈佛結(jié)構(gòu)中,使用兩個(gè)獨(dú)立的存儲(chǔ)器,分別存儲(chǔ)指令和數(shù)據(jù),并且使用兩條獨(dú)立的總線,分別作為CPU與每個(gè)存儲(chǔ)器之間的專用通信路徑,這樣就保證了系統(tǒng)具有較高的可靠性,嵌入式系統(tǒng)追求的就是高可靠性,因此哈佛結(jié)構(gòu)的嵌入式微處理器在嵌入式系統(tǒng)中被廣泛應(yīng)用,本文介紹的WolfMCU也采用了哈佛結(jié)構(gòu)。
2.1 WolfMCU的體系結(jié)構(gòu)
WolfMCU由6個(gè)模塊組成,包括控制器、運(yùn)算器、定時(shí)器/計(jì)數(shù)器、存儲(chǔ)器、串口通信控制器和并行通訊接口,如圖1所示。
控制器是WolfMCU的大腦,在它的控制下,各模塊協(xié)調(diào)有序的工作??刂破靼ㄋ膫€(gè)模塊――譯碼模塊、有限狀態(tài)機(jī)模塊、存儲(chǔ)器控制模塊和中斷處理模塊。譯碼模塊對(duì)指令進(jìn)行譯碼,產(chǎn)生相應(yīng)的控制信號(hào)。有限狀態(tài)機(jī)模塊控制WolfMCU在不同工作狀態(tài)之間進(jìn)行轉(zhuǎn)換。WolfMCU共有四種工作狀態(tài):STARTUP、FETCH、EXEC1和EXEC2。STARTUP是WolfMCU加電后的初始狀態(tài),WolfMCU復(fù)位后也回到這個(gè)狀態(tài);FETCH是取指令狀態(tài),EXEC1和EXEC2是指令執(zhí)行狀態(tài),處理器根據(jù)譯碼結(jié)果在這兩個(gè)狀態(tài)下取操作數(shù)進(jìn)行計(jì)算。存儲(chǔ)器控制模塊在譯碼模塊產(chǎn)生的控制信號(hào)的作用下取指令和操作數(shù),并送往正確的地方。中斷處理模塊接收外部中斷并進(jìn)行處理,WolfMCU共有兩個(gè)中斷源:Int0和Int0。
運(yùn)算器在控制器的控制下完成指定的運(yùn)算。WolfMCU的運(yùn)算器支持8位數(shù)據(jù)的加、減、乘、與、或、非等基本運(yùn)算,還支持十進(jìn)制調(diào)整、乘加、乘減、平方后加、平方后減、取絕對(duì)值等特殊運(yùn)算,這些特殊運(yùn)算由專用指令實(shí)現(xiàn),由專用電路支持。
系統(tǒng)內(nèi)不同部件的工作時(shí)鐘可能與系統(tǒng)時(shí)鐘不一致,比如串口控制器,它的工作時(shí)鐘根據(jù)不同波特率而不同,這就要求系統(tǒng)提供相應(yīng)的時(shí)鐘,以保證其正常工作,定時(shí)器/計(jì)數(shù)器可以實(shí)現(xiàn)對(duì)系統(tǒng)時(shí)鐘進(jìn)行分頻以遍提供給相應(yīng)的部件使用。
存儲(chǔ)器包括100字節(jié)的ROM、和100字節(jié)RAM(ROM和RAM都可以擴(kuò)充容量)。ROM里存放要執(zhí)行的程序,RAM中存放運(yùn)算過(guò)程中產(chǎn)生的數(shù)據(jù)。ROM中的程序可由上位PC機(jī)通過(guò)串口寫(xiě)入。
2.2 實(shí)驗(yàn)驗(yàn)證
2.1節(jié)介紹了WolfMCU的體系結(jié)構(gòu),接下來(lái)以一個(gè)小程序?yàn)槔治鯳olfMCU工作的具體過(guò)程。
該程序?qū)崿F(xiàn)加法的操作,圖2所示是該程序的三條指令及其在軟核ROM中的存儲(chǔ)狀態(tài),第一條指令NOP是空操作指令,第二條指令把立即數(shù)56H送到累加器Acc中去,第三條指令給累加器Acc加上立即數(shù)5FH,結(jié)果保存在累加器Acc中,最后Acc中的結(jié)果是56H+5FH=B5H。
第一條空操作指令比較簡(jiǎn)單,系統(tǒng)不進(jìn)行任何操作,只是狀態(tài)由初始狀態(tài)(STARTUP),變?yōu)槿≈噶顮顟B(tài)(FETCH),PC指針加1,指向下一條指令MOV。
在第二個(gè)指令周期里,系統(tǒng)處于FETCH狀態(tài),存儲(chǔ)器控制模塊從ROM的001地址處讀出8位數(shù)據(jù)(01110100),把它送往譯碼模塊譯碼,譯碼模塊根據(jù)指令碼(01110100)識(shí)別出這是MOV_Acc_imm指令(把立即數(shù)送往累加器Acc),知道該指令需要有一個(gè)操作數(shù),所以把PC指針加1,并把系統(tǒng)下一個(gè)狀態(tài)置為EXEC1,為下一個(gè)周期取該指令的操作數(shù)做好準(zhǔn)備。
第三個(gè)指令周期開(kāi)始,存儲(chǔ)器控制模塊取出操作數(shù)56H(01010110),同時(shí)譯碼模塊發(fā)出控制信號(hào),指出這是從ROM輸入的數(shù)據(jù)(因?yàn)橄到y(tǒng)處在EXEC1狀態(tài)),目標(biāo)寄存器是累加器Acc,然后PC指針加1,置系統(tǒng)下一個(gè)狀態(tài)為FETCH,為取下一條指令做好準(zhǔn)備。在這個(gè)時(shí)鐘周期內(nèi),存儲(chǔ)器控制模塊已經(jīng)把56H送到累加器Acc中了。
ADD指令的執(zhí)行過(guò)程和MOV指令類似,這里就不做詳述,唯一不同的是ADD指令執(zhí)行過(guò)程中經(jīng)過(guò)了兩次譯碼,第一次和MOV相同,第二次是在控制器把加法控制信號(hào)發(fā)送到ALU之后,ALU還要識(shí)別出這條加法指令是要把立即數(shù)和累加器中的操作數(shù)相加,這樣才能最終完成操作。
至此,這段程序執(zhí)行完畢,正確輸出結(jié)果B5H。下載到Memec V2mb1000 FPGA開(kāi)發(fā)板上的運(yùn)行,通過(guò)七段數(shù)碼管顯示的結(jié)果,如圖3所示:
3.WolfMCU指令集設(shè)計(jì)
對(duì)于桌面計(jì)算機(jī)系統(tǒng)來(lái)說(shuō),因?yàn)橐鎸?duì)不同的應(yīng)用,指令集功能越強(qiáng)大越好,通用性越強(qiáng)越好。但對(duì)于嵌入式系統(tǒng)來(lái)說(shuō),由于只面對(duì)某種特定的應(yīng)用,所以在滿足應(yīng)用需求的前提之下指令集越小越好,指令越專用,效率越高越好。
綜合考慮了指令集尺寸和專用性,WolfMCU的指令集共有22條指令,包括16條通用指令和6條專用指令。16條通用指令都是最常用的指令,以后再設(shè)計(jì)其他專用指令集微處理器時(shí)可以在此基礎(chǔ)上進(jìn)行擴(kuò)充,通用指令包括數(shù)據(jù)傳送指令,算術(shù)運(yùn)算指令,邏輯運(yùn)算指令,控制轉(zhuǎn)移指令等四類,在這不再詳述。6條專用指令,如表1所列,增強(qiáng)了WolfMCU的運(yùn)算能力。
除了指令的功能之外,指令的尋址方式也是指令集設(shè)計(jì)的一個(gè)重要方面, WolfMCU共支持4種尋址方式:立即尋址、寄存器尋址、直接尋址、寄存器間接尋址。
ASIP的設(shè)計(jì),重點(diǎn)和難點(diǎn)是專用指令的實(shí)現(xiàn),下面以DA指令(十進(jìn)制調(diào)整)為例介紹一下專用指令的實(shí)現(xiàn)。這條指令跟在加法指令后,對(duì)累加器Acc中8位結(jié)果進(jìn)行調(diào)整,使它調(diào)整為壓縮得BCD碼的數(shù),以完成十進(jìn)制加法運(yùn)算功能。DA指令執(zhí)行的流程圖如圖4所示,具體代碼不再詳細(xì)介紹,這段代碼編譯后形成一個(gè)模塊連接在WolfMCU的控制器上,下載到FPGA芯片之后,相當(dāng)于有一塊專用電路支持DA指令,控制器只要把ACC中的內(nèi)容發(fā)送到這個(gè)模塊,就可以返回調(diào)整后的結(jié)果,大大提高了該指令的執(zhí)行效率。用下面的程序測(cè)試DA指令的執(zhí)行效果:
程序執(zhí)行十進(jìn)制的8和9相加,在WolfMCU軟核上執(zhí)行后,輸出0107(圖5所示為通過(guò)七段數(shù)碼管顯示結(jié)果),說(shuō)明DA指令執(zhí)行正確。
其他專用指令的實(shí)現(xiàn)方式和DA指令類似,也是作為一個(gè)模塊連接在WolfMCU軟核之上,調(diào)用這些指令時(shí),只需把操作數(shù)傳送給這些模塊。
4.專用指令實(shí)現(xiàn)與普通指令實(shí)現(xiàn)的性能對(duì)比
上表中列出的乘加、乘減等指令也像十進(jìn)制調(diào)整指令一樣,因?yàn)橛袑iT的電路支持這些指令,因此可以在幾個(gè)時(shí)鐘周期內(nèi)迅速輸出結(jié)果。
上面提到的十進(jìn)制調(diào)整指令,首先需要判斷累加器的低四位是否大于9,輔助進(jìn)位標(biāo)志位是否為1,二者滿足其一就給低四位加上06H,然后判斷高四位,若高四位或進(jìn)位標(biāo)志為1,則給高四位加上60H,如果使用普通指令編程實(shí)現(xiàn),至少需要上百個(gè)時(shí)鐘周期,而采用專用指令之后,只需要12個(gè)時(shí)鐘周期,表2列出了采用專用指令和普通指令時(shí)需要的時(shí)鐘周期的對(duì)比。
由表2可以看出,采用專用指令后,所需時(shí)鐘周期數(shù)至少降低了40%,為實(shí)現(xiàn)這些專用指令付出的硬件代價(jià)還是值得的。
5.總結(jié)
本文介紹了一種提高嵌入式微處理器指令執(zhí)行效率和擴(kuò)展性的設(shè)計(jì)思路--ASIP+FPGA,并對(duì)這種思路進(jìn)行了嘗試,實(shí)現(xiàn)了一個(gè)8位的微處理器軟核,為這個(gè)軟核設(shè)計(jì)了16條通用指令和6條專用指令,通過(guò)與普通指令的實(shí)現(xiàn)開(kāi)銷進(jìn)行對(duì)比,驗(yàn)證了ASIP+FPGA設(shè)計(jì)模式的優(yōu)勢(shì),這個(gè)簡(jiǎn)單的8位微處理器軟核可以作為設(shè)計(jì)復(fù)雜ASIP的原型,可以很容易的擴(kuò)展成16位、32位,也可以很方便的添加新的專用指令,滿足新應(yīng)用的需要。
本文作者創(chuàng)新點(diǎn):1.提出了一種嵌入式微處理器設(shè)計(jì)模式--ASIP+FPGA模式,從體系結(jié)構(gòu)和專指令集設(shè)計(jì)兩方面對(duì)該設(shè)計(jì)模式進(jìn)行了分析。2.采用該設(shè)計(jì)模式,在Xilinx V2MB1000
FPGA開(kāi)發(fā)板上設(shè)計(jì)并實(shí)現(xiàn)了一款嵌入式微處理器軟核(WolfMCU),驗(yàn)證了該設(shè)設(shè)計(jì)模式的優(yōu)勢(shì)。3.WolfMCU采用模塊化設(shè)計(jì),可以方便的擴(kuò)展到16位或添加新的功能模塊。
責(zé)任編輯:gt
評(píng)論
查看更多