李 翰 姜彥吉
遼寧工程技術(shù)大學(xué)軟件學(xué)院
本文對(duì)基于FPGA 的CPU 設(shè)計(jì)進(jìn)行了分析,主要包括CPU 指令代碼的設(shè)計(jì)以及電路的設(shè)計(jì),對(duì)嵌入式CPU 設(shè)計(jì)工作的相關(guān)研究具有一定的參考價(jià)值。
FPGA 是以GAL、PAL、PLD 等可編程器件為基礎(chǔ)發(fā)展起來的一種現(xiàn)場可編程門陣列。相對(duì)于GAL、PAL和PLD,F(xiàn)PGA 具有較大的規(guī)模,它能夠替代幾十甚至幾千塊通用的IC 芯片,具有處理速度快、存儲(chǔ)容量高、I/O 功能強(qiáng)大、功耗低等多種特點(diǎn)。通過FPGA 技術(shù),可以更方便快捷的設(shè)計(jì)出較為簡單的完整CPU 模型機(jī)。FPGA 的應(yīng)用可以有效解決定置電路的缺陷,同時(shí)還能突破原有可編程器件對(duì)門電路的限制。FPGA 突出的特點(diǎn)使得其可以很好的應(yīng)用在各類PLD、應(yīng)用門陣列和中小規(guī)模的通用數(shù)字集成電路設(shè)計(jì)工作中。
基于FPGA 的CPU 主要包括指令系統(tǒng)的設(shè)計(jì)、電路的設(shè)計(jì)兩個(gè)方面的內(nèi)容。本CPU 采用RISC(精簡指令集)架構(gòu)的指令系統(tǒng),按照功能可以將本CPU 的指令分為計(jì)算指令、數(shù)據(jù)傳送指令、位操作指令以及轉(zhuǎn)移指令;電路的設(shè)計(jì)則主要包括基本電路和主要電路模塊的設(shè)計(jì)兩部分內(nèi)容。
(1)ALU 運(yùn)算指令
表1 ALU 立即數(shù)指令
表2 數(shù)據(jù)傳送指令
ALU 運(yùn)算指令的操作數(shù)來源有兩個(gè),其中一個(gè)操作數(shù)由累加器A 提供,另一個(gè)操作數(shù)則是指令字中立即尋址方式所提供的8 位操作數(shù)或者RAM,然后在累加器或者RAM 中存入操作數(shù)。ALU 運(yùn)算指令分為兩類:立即數(shù)指令和雙操作數(shù)指令。其中立即數(shù)指令的操作數(shù)分別來自累加器A 以及指令立即尋址方式所提供的8 位操作數(shù),并將指令結(jié)果存入累加器A,其中,累加器A 中的操作數(shù)屬于非運(yùn)算操作數(shù)。ALU 立即數(shù)指令如表1 所示。
(2)數(shù)據(jù)傳送指令
數(shù)據(jù)傳送是CPU 所需要基本的數(shù)據(jù)處理功能,數(shù)據(jù)傳送的主要目的是拷貝指定的源操作數(shù)字節(jié)內(nèi)容到目的操作數(shù)單元。表2 對(duì)本CPU 的數(shù)據(jù)傳送指令代碼和作用進(jìn)行了說明,表中的“z”表示該位代碼無效,其取值不會(huì)對(duì)指令的具體功能產(chǎn)生任何影響,而“x”則表示該位中的數(shù)據(jù)可以任意取值,其取值結(jié)果代表當(dāng)前指令的操作數(shù)。
(3)位操作指令
位操作指令主要是對(duì)二進(jìn)制數(shù)據(jù)的某一位進(jìn)行左右移操作,內(nèi)存單元的自增、自減以及工作寄存器組的自增、自減。從總體分,可以將其分為移位和自增自減兩類指令。
(4)轉(zhuǎn)移指令
轉(zhuǎn)移指令可以分為條件轉(zhuǎn)移和無條件跳轉(zhuǎn)兩大類,具體又可分為條件轉(zhuǎn)移、跳轉(zhuǎn)、過程調(diào)用以及返回指令。在設(shè)計(jì)條件轉(zhuǎn)移指令時(shí),固定其轉(zhuǎn)移條件使其跳過當(dāng)前條件直接執(zhí)行下一條指令。要想實(shí)現(xiàn)真正的跳轉(zhuǎn),需要利用強(qiáng)制跳轉(zhuǎn)指令代碼,使其進(jìn)行強(qiáng)制跳轉(zhuǎn),具體實(shí)現(xiàn)代碼如下:
JC
JMP MAIN_LOOP
MOV A,#00H
MAIN_LOOP:MOV R0,#0FFH;
只有CY 為1 時(shí),JC 語句后執(zhí)行MOV A,#00H(跳過了JMP MAIN_LOOP 指令);而當(dāng)CY 為0 時(shí),則JC 語句之后按照正常順序執(zhí)行指令。
(1)基本電路
在CPU 設(shè)計(jì)的過程中,CPU 的基本電路由邏輯門電路、觸發(fā)器、譯碼器等構(gòu)成。與、或、非是最基本的三種邏輯關(guān)系,在CPU 電路設(shè)計(jì)中,分別以與門、或門以及非門表示。邏輯與的操作是兩個(gè)操作數(shù)的按位與,可以用Z=A.B 表示;邏輯或操作則是兩個(gè)操作數(shù)的按位或,可以用Z=A+B 來表示;邏輯非操作是將操作數(shù)按位取反,可以用Z=!A。
譯碼器的主要功能是對(duì)通過譯碼操作將二進(jìn)制數(shù)值轉(zhuǎn)換成特定編碼形式的輸出信號(hào)。當(dāng)譯碼器中所輸入的二進(jìn)制數(shù)值位數(shù)為n 時(shí),則輸出數(shù)據(jù)的個(gè)數(shù)則為2 的n 次冪。所有輸出數(shù)據(jù)都對(duì)應(yīng)一個(gè)二進(jìn)制數(shù)值。
數(shù)據(jù)選擇器的邏輯功能是利用地址選擇信號(hào)對(duì)輸出的數(shù)據(jù)進(jìn)行控制,然后從多個(gè)數(shù)據(jù)中選擇一個(gè)輸出。
(2)CPU 各模塊電路的設(shè)計(jì)
CPU 的硬件電路可以分為多個(gè)模塊,主要包括算術(shù)邏輯單元、移位模塊、譯碼模塊等。下面列舉了其中幾個(gè)模塊的設(shè)計(jì)。
1)算術(shù)邏輯單元設(shè)計(jì)。CPU 的算術(shù)邏輯單元共包括3 個(gè)數(shù)據(jù)輸入端和4 個(gè)數(shù)據(jù)輸出端。其中,3 個(gè)數(shù)據(jù)輸入端中的一個(gè)固定由累加器輸入,另外兩個(gè)數(shù)據(jù)則分別由8 位立即數(shù)、RAM 或者特定的工作寄存器以及CY 輸入。數(shù)據(jù)輸出端中的3 個(gè)1 位輸出分別為算術(shù)邏輯單元運(yùn)算的進(jìn)位輸出端CY_ALU、標(biāo)志算術(shù)邏輯單元運(yùn)算結(jié)果是否為0 的輸出端Z_ALU 以及標(biāo)志算術(shù)邏輯單元運(yùn)算是否發(fā)生溢出的輸出端V_ALU;另外一個(gè)則是算術(shù)邏輯單元運(yùn)算數(shù)據(jù)輸出端。
2)移位模塊的設(shè)計(jì)。CPU 的移位指令有循環(huán)移位、帶進(jìn)位循環(huán)移位、邏輯移位和算術(shù)移位4 種操作。這4種移位操作均可以分為左移和右移兩種操作。其中,循環(huán)移位是按照固定的方向?qū)Σ僮鲾?shù)進(jìn)行移位循環(huán)移位,移出移至移入位;帶進(jìn)位循環(huán)移位則是將操作數(shù)移出位移至進(jìn)位位,進(jìn)位位移至移入位;邏輯移位是將操作數(shù)看作沒有符號(hào)位的邏輯數(shù),在每次進(jìn)行移位時(shí),其移入位的值均為0;算術(shù)移位將操作數(shù)看作有符號(hào)位的數(shù)據(jù),而符號(hào)位中的值可以決定操作數(shù)的移入位。
利用Quartus Ⅱ軟件進(jìn)行電路仿真,每次構(gòu)建好一個(gè)電路模塊便進(jìn)行一次仿真,保證在構(gòu)建整個(gè)電路前,各個(gè)電路模塊的功能均正常。在構(gòu)建完整的CPU 電路之后,在對(duì)整個(gè)電路進(jìn)行仿真,在每次仿真之后,發(fā)現(xiàn)錯(cuò)誤,需要立即進(jìn)行改正,并再次進(jìn)行仿真。
在仿真工作完成后,對(duì)整個(gè)CPU 的功能進(jìn)行測試,主要包括各項(xiàng)基本功能的測試以及物理測試兩個(gè)方面的內(nèi)容。將CPU 寫入FPGA 新片中,并在FPGA 中構(gòu)建RMA 模擬指令存儲(chǔ)器用來放入CPU 的各項(xiàng)操作指令,同時(shí)還需要設(shè)計(jì)一個(gè)完整的外圍測試系統(tǒng),實(shí)現(xiàn)對(duì)CPU全部功能的測試工作。
雖然目前的CPU 種類較多,結(jié)構(gòu)也存在較大差異,但是目前的主流CPU 幾乎都采用硬核結(jié)構(gòu),本文設(shè)計(jì)了一款基于FPGA(軟核)的嵌入式CPU,對(duì)促進(jìn)嵌入式CPU 設(shè)計(jì)工作的發(fā)展具有重要的作用。