向 明 尚
(東北石油大學(xué) 計(jì)算機(jī)與信息技術(shù)學(xué)院, 黑龍江 大慶 163318)
計(jì)算機(jī)系統(tǒng)的核心是中央處理器(CPU),目前它的設(shè)計(jì)技術(shù)和產(chǎn)品生產(chǎn)仍被國(guó)外企業(yè)所壟斷。我國(guó)的企業(yè)和高校也在設(shè)計(jì)實(shí)現(xiàn)CPU,但使用的是國(guó)外企業(yè)授權(quán)的CPU架構(gòu)和指令集,不具備完全的自主知識(shí)產(chǎn)權(quán)。為突破貿(mào)易和技術(shù)壁壘,需要盡快設(shè)計(jì)實(shí)現(xiàn)具有完全自主知識(shí)產(chǎn)權(quán)的CPU等產(chǎn)品。
算術(shù)邏輯單元(ALU)是CPU的核心部件之一,它是一種能夠完成多種算術(shù)和邏輯運(yùn)算的單元電路,用來(lái)執(zhí)行CPU指令集中的算術(shù)和邏輯操作。因此,ALU的設(shè)計(jì)直接影響到CPU的性能,進(jìn)而影響整個(gè)計(jì)算機(jī)系統(tǒng)的工作?,F(xiàn)基于FPGA技術(shù)和微程序設(shè)計(jì)思想,提出一種ALU設(shè)計(jì)實(shí)現(xiàn)和仿真驗(yàn)證的方法。
ALU是一個(gè)組合邏輯電路,包括算術(shù)單元(AU)和邏輯單元(LU)。它通過(guò)數(shù)據(jù)總線從數(shù)據(jù)寄存器獲得數(shù)據(jù),通過(guò)控制總線接收CPU發(fā)出的算數(shù)和邏輯運(yùn)算指令,把指令分解為微指令對(duì)應(yīng)到具體的微操作,完成相應(yīng)的運(yùn)算,然后將計(jì)算結(jié)果保存到存儲(chǔ)器,并放到數(shù)據(jù)總線上。研究發(fā)現(xiàn),通用微處理器的ALU執(zhí)行的指令都可以使用加、減、與、或、非等基本運(yùn)算來(lái)完成[1]。為了突出ALU的設(shè)計(jì)實(shí)現(xiàn)方法,在此只給出簡(jiǎn)單的功能設(shè)計(jì)。其功能如表1所示。
表1 ALU的功能
ALU的設(shè)計(jì)主要有3類結(jié)構(gòu):復(fù)合結(jié)構(gòu)、加法器獨(dú)立結(jié)構(gòu)和鏈?zhǔn)浇Y(jié)構(gòu)。我們采用加法器獨(dú)立結(jié)構(gòu)[2-3]進(jìn)行設(shè)計(jì)。加法器和邏輯運(yùn)算部件分開設(shè)計(jì)。加法器是運(yùn)算電路的核心,通常處于ALU的關(guān)鍵路徑上。加法器的進(jìn)位關(guān)系包括串行進(jìn)位和并行進(jìn)位。串行進(jìn)位就是進(jìn)位信號(hào)由低位向高位逐級(jí)串行傳遞,進(jìn)位條件滿足式(1)。并行進(jìn)位就是加法器各級(jí)之間的進(jìn)位信號(hào)同時(shí)產(chǎn)生,可縮短進(jìn)位時(shí)間,其進(jìn)位條件滿足式(2)。
Ci=f(Ai,Bi,Ci-1)
(1)
Ci=AiBi+(Ai⊕Bi)Ci-1=Gi+PiCi-1
(2)
式中:Ci指第i位向高一位進(jìn)位產(chǎn)生的進(jìn)位信號(hào);Ai、Bi指本位的2個(gè)操作數(shù)據(jù);Ci-1指第i-1位向本位產(chǎn)生的進(jìn)位信號(hào);Gi指第i位的進(jìn)位產(chǎn)生信號(hào);Pi指第i位的進(jìn)位傳播信號(hào)。
按照串行進(jìn)位關(guān)系,將各級(jí)之間的進(jìn)位信號(hào)從低位到高位進(jìn)行串行連接,構(gòu)成串行進(jìn)位鏈。從最基礎(chǔ)的電路原件設(shè)計(jì)開始,由簡(jiǎn)到繁逐漸集成,按照自底向上的設(shè)計(jì)方法設(shè)計(jì)實(shí)現(xiàn)一個(gè)8位的串行進(jìn)位加法器。
加減運(yùn)算單元電路是完成2個(gè)1位二進(jìn)制數(shù)加減運(yùn)算的基本電路,它由邏輯與、邏輯或、邏輯異或等基本門電路和輸入、輸出控制電路組成,如圖1所示。
圖1 加減單元電路結(jié)構(gòu)及原理示意圖
圖1中,左右兩側(cè)分別為電路的輸入和輸出引腳。carryin是低位來(lái)的進(jìn)位或借位輸入信號(hào),carryin=0時(shí)表明低位沒(méi)有進(jìn)位或借位,carryin=1時(shí)表明低位有進(jìn)位或借位。a、b是參與加減運(yùn)算的2個(gè)1位二進(jìn)制數(shù)據(jù)輸入信號(hào)。add是做加法和減法運(yùn)算的控制信號(hào)輸入端,add=0時(shí)做加法運(yùn)算,add=1時(shí)做減法運(yùn)算。s是 1位的加減運(yùn)算結(jié)果的信號(hào)輸出端。carryout是本位向高位產(chǎn)生的進(jìn)位或借位信號(hào)輸出端,當(dāng)完成加減運(yùn)算時(shí),向高位的進(jìn)位或借位信號(hào)由此輸出。carryout=0時(shí)表明沒(méi)有進(jìn)位或借位產(chǎn)生,carryout=1時(shí)表明產(chǎn)生了向高位的進(jìn)位或借位信號(hào)。
將加減單元電路封裝,生成一個(gè)加減單元電路器件adderunit,同時(shí)連接4個(gè)加減單元電路器件,構(gòu)成四位串行進(jìn)位加減法器,如圖2所示。它可以完成2個(gè)4位二進(jìn)制數(shù)的加減法運(yùn)算。
圖2中,a[3..0]和b[3..0]是2個(gè)4位二進(jìn)制數(shù)據(jù)輸入端,分成4部分,分別送往4個(gè)adderunit的a、b數(shù)據(jù)輸入端;sum[3..0]是四位加減法器計(jì)算結(jié)果的信號(hào)輸出端。
將四位加減法器封裝,生成一個(gè)四位加減運(yùn)算單元電路器件adder4;同時(shí)連接2個(gè)adder4,構(gòu)成八位加減法器,如圖3所示。
圖2 四位加減法器電路結(jié)構(gòu)及原理示意圖
圖3 八位加減法器電路結(jié)構(gòu)及原理示意圖
數(shù)據(jù)寄存器(register)利用D觸發(fā)器具有存儲(chǔ)1位信息的工作特性作為存儲(chǔ)原件,輸出端和輸入端構(gòu)成一個(gè)數(shù)據(jù)回饋電路(見(jiàn)圖4),在脈沖信號(hào)的作用下,用來(lái)寄存運(yùn)算過(guò)程中產(chǎn)生的結(jié)果數(shù)據(jù)。
圖4 數(shù)據(jù)寄存器電路結(jié)構(gòu)及原理示意圖
圖4中,latch是數(shù)據(jù)輸入允許鎖信號(hào),d[7..0]是8位數(shù)據(jù)輸入信號(hào),q[7..0]是寄存器的數(shù)據(jù)輸出端。latch=1時(shí),高電平有效,圖中下面的與門打開,數(shù)據(jù)d[7..0]進(jìn)入D觸發(fā)器保存。latch=0時(shí),低電平有效,圖中下面的與門關(guān)閉,新的數(shù)據(jù)無(wú)法進(jìn)來(lái),而此時(shí)上面的與門打開,D觸發(fā)器的輸出反饋到輸入端,在時(shí)鐘脈沖信號(hào)clk作用下,維持原來(lái)的數(shù)據(jù)不變。clk是時(shí)鐘控制信號(hào),當(dāng)clk輸入正脈沖信號(hào)時(shí),D觸發(fā)器工作,鎖存數(shù)據(jù)。clr是異步清零信號(hào),不需要時(shí)鐘控制,可直接用于D觸發(fā)器清零操作。當(dāng)clr=0時(shí),低電平有效,D觸發(fā)器的輸出端清零,即Q=0。
將數(shù)據(jù)寄存器和八位加減法器分別封裝成電路元件,并添加邏輯與、邏輯或、邏輯非、三態(tài)門等邏輯門電路,構(gòu)成一個(gè)8位的算術(shù)邏輯單元ALU,其電路結(jié)構(gòu)如圖5所示。
圖5中,register為數(shù)據(jù)寄存器,用來(lái)保存參與運(yùn)算的2個(gè)數(shù)據(jù);adder8為加減法器,用來(lái)完成2個(gè)8位二進(jìn)制數(shù)的加減法運(yùn)算。4個(gè)三態(tài)門分時(shí)工作,分別將加法的和、減法的差和邏輯運(yùn)算的結(jié)果輸出到總線上。da、db是2個(gè)參與運(yùn)算的8位二進(jìn)制數(shù)據(jù)輸入端。alatch、blatch是數(shù)據(jù)輸入鎖存允許信號(hào),高電平有效,分別將數(shù)據(jù)鎖存到2個(gè)寄存器,準(zhǔn)備參與運(yùn)算。notenable是邏輯非運(yùn)算輸出允許信號(hào),當(dāng)notenable=1高電平有效時(shí),輸出信號(hào)sum=~da,即將輸入數(shù)據(jù)da按位取反后輸出,完成邏輯非運(yùn)算。addenable是加減法運(yùn)算輸出允許信號(hào),當(dāng)addenable=1高電平有效時(shí),電路輸出sum=da±db。add是加減法運(yùn)算控制信號(hào)輸入端,同時(shí)連接到adder8的carryin和add引腳。當(dāng)控制信號(hào)add=0低電平有效時(shí),做加法運(yùn)算,即sum=da+db+0;當(dāng)add=1高電平有效時(shí),做減法運(yùn)算,即sum=da[7..0]+(db[7..0]⊕11 11 11 11)+00 00 00 01,進(jìn)而完成da-db的運(yùn)算。sum[7..0]是8位ALU運(yùn)算結(jié)果的輸出信號(hào)。
設(shè)計(jì)控制器的目的是為驗(yàn)證ALU的設(shè)計(jì)在功能和結(jié)構(gòu)上是否正確、是否滿足設(shè)計(jì)要求??刂破骺梢圆捎糜膊季€或微程序控制方式產(chǎn)生控制信號(hào)。與硬布線方式相比,微程序控制方式是將操作控制信號(hào)以微指令方式編碼存放在控制存儲(chǔ)器中,在設(shè)計(jì)及硬件功能擴(kuò)充維護(hù)方面更加靈活方便[4]。
圖5 邏輯單元電路結(jié)構(gòu)及原理示意圖
利用微程序兼容性好、擴(kuò)充性強(qiáng)、設(shè)計(jì)自由度大、易于維護(hù)的優(yōu)點(diǎn)[5],針對(duì)ALU的功能要求,將其運(yùn)算過(guò)程分解成多個(gè)微操作,并轉(zhuǎn)化為多條微指令,采用Verilog語(yǔ)言,按照微指令的執(zhí)行過(guò)程進(jìn)行微程序設(shè)計(jì)。這里給出初始化、加、減、與、或、非運(yùn)算的部分微程序代碼。
initial
begin
addenable=0;andenable=0;
orenable=0;notenable=0;alatch=0;
blatch=0;clk=0;da=0;db=0;add=0;
end
always
begin
#100 add=0;alatch=1;blatch=1;addenable=1;
notenable=0;orenable=0;andenable=0;
#100 alatch=0;blatch=0;addenable=0;
notenable=1;orenable=0;andenable=0;
#100 alatch=0;blatch=0;addenable=0;
notenable=0;orenable=1;andenable=0;
#100 alatch=0;blatch=0;addenable=0;
notenable=0;orenable=0;andenable=1;
#100 add=1;alatch=1;blatch=1;addenable=1;
notenable=0;orenable=0;andenable=0;
end
always
begin
#100 clk=~clk;
end
always
begin
#100 da=da+1;
end
always
begin
#100 db=db+3;
end
將設(shè)計(jì)的微程序作為ALU的測(cè)試文件,加到項(xiàng)目的工程文件中進(jìn)行仿真,通過(guò)仿真波形驗(yàn)證ALU的功能和設(shè)計(jì)的正確性。得到的仿真波形如圖6所示。
圖6 ALU仿真波形圖
下面,按圖6中標(biāo)出的數(shù)字位置順序分析結(jié)果的正確性。
位置1: alatch=1和blatch=1,2個(gè)寄存器的鎖存信號(hào)同時(shí)有效。輸入數(shù)據(jù)da=00 00 00 01和db=00 00 00 11,鎖存到2個(gè)寄存器中保存,準(zhǔn)備參與算術(shù)和邏輯運(yùn)算。此時(shí),add=0,做加法運(yùn)算,即da+db=00 00 01 00。與此同時(shí),addenable=1,加法輸出控制信號(hào)有效,對(duì)應(yīng)的三態(tài)門打開,ALU輸出加法運(yùn)算的結(jié)果 sum=00 00 01 00。
位置2: alatch=0和blatch=0,寄存器鎖存信號(hào)無(wú)效,新的數(shù)據(jù)無(wú)法進(jìn)入數(shù)據(jù)寄存器,2個(gè)寄存器保存的是原來(lái)的數(shù)據(jù)。此時(shí),notenable=1,邏輯非運(yùn)算輸出允許信號(hào)有效,對(duì)應(yīng)的三態(tài)門打開,將數(shù)據(jù)da=00 00 00 01按位取反輸出,即 sum=11 11 11 10。
位置3: alatch=0和blatch=0,寄存器鎖存信號(hào)無(wú)效,新的數(shù)據(jù)無(wú)法進(jìn)入數(shù)據(jù)寄存器,2個(gè)寄存器保存原來(lái)的數(shù)據(jù)。此時(shí),orenable=1,邏輯或運(yùn)算輸出允許有效,對(duì)應(yīng)的三態(tài)門打開,將數(shù)據(jù)da=00 00 00 01和db=00 00 00 11進(jìn)行按位或運(yùn)算并輸出,即sum=00 00 00 11。
位置4: alatch=0和blatch=0,寄存器鎖存信號(hào)無(wú)效,新的數(shù)據(jù)無(wú)法進(jìn)入數(shù)據(jù)寄存器,2個(gè)寄存器保存原來(lái)的數(shù)據(jù)。此時(shí),andenable=1,邏輯與運(yùn)算輸出允許有效,對(duì)應(yīng)的三態(tài)門打開,將數(shù)據(jù)da=00 00 00 01和db=00 00 00 11進(jìn)行按位與運(yùn)算并輸出,即sum=00 00 00 01。
位置5: alatch=1和blatch=1,2個(gè)寄存器的鎖存信號(hào)再次同時(shí)有效,新的數(shù)據(jù)da=00 00 01 01和db=00 00 11 11,即2個(gè)十進(jìn)制數(shù)據(jù)5、10,保存到2個(gè)寄存器中,準(zhǔn)備參與算術(shù)和邏輯運(yùn)算。此時(shí),add=1,做減法運(yùn)算,輸出結(jié)果sum=11 11 01 10,即完成了2個(gè)操作數(shù)5、10的減法運(yùn)算。此時(shí)的輸出結(jié)果sum=11 11 01 10,即為-15的補(bǔ)碼表示。與此同時(shí),addenable=1,減法輸出控制信號(hào)有效,對(duì)應(yīng)的三態(tài)門打開,輸出減法運(yùn)算的結(jié)果,即總線上輸出sum=11 11 01 10。
位置6: alatch=0和blatch=0,寄存器鎖存信號(hào)無(wú)效,新的數(shù)據(jù)無(wú)法進(jìn)入數(shù)據(jù)寄存器,2個(gè)寄存器保存的是第二次鎖存的數(shù)據(jù),即da=00 00 01 01和db=00 00 11 11。此時(shí),notenable=1,邏輯非運(yùn)算輸出允許信號(hào)有效,對(duì)應(yīng)的三態(tài)門打開,將數(shù)據(jù)da=00 00 01 01按位取反輸出,即sum=11 11 10 10。
位置7: alatch=0和blatch=0,寄存器鎖存信號(hào)無(wú)效,新的數(shù)據(jù)無(wú)法進(jìn)入數(shù)據(jù)寄存器,2個(gè)寄存器保存的是第二次鎖存的數(shù)據(jù),即da=00 00 01 01和db=00 00 11 11。此時(shí),orenable=1,邏輯或運(yùn)算輸出允許有效,對(duì)應(yīng)的三態(tài)門打開,將數(shù)據(jù)da、db進(jìn)行按位或運(yùn)算并輸出,即sum=00 00 11 11。
位置8: alatch=0和blatch=0,寄存器鎖存信號(hào)無(wú)效,新的數(shù)據(jù)無(wú)法進(jìn)入數(shù)據(jù)寄存器,2個(gè)寄存器保存的是第二次鎖存的數(shù)據(jù),即da=00 00 01 01和db=00 00 11 11。此時(shí),andenable=1,邏輯與運(yùn)算輸出允許有效,對(duì)應(yīng)的三態(tài)門打開,將數(shù)據(jù)da、db進(jìn)行按位與運(yùn)算并輸出,即sum=00 00 01 01。
通過(guò)上述分析過(guò)程,結(jié)合ALU的設(shè)計(jì)原理圖,按照測(cè)試步驟對(duì)ALU的加法、減法、邏輯與、邏輯或、邏輯非等功能逐一驗(yàn)證,并結(jié)合波形圖對(duì)應(yīng)的各階段的仿真結(jié)果進(jìn)行分析,可以證明算術(shù)單元和邏輯單元設(shè)計(jì)的正確性。
ALU的作用是完成多種復(fù)雜的算術(shù)和邏輯運(yùn)算并執(zhí)行CPU的指令,它對(duì)CPU的性能和計(jì)算機(jī)系統(tǒng)的工作有直接影響。我們嘗試設(shè)計(jì)了一個(gè)8位串行ALU,以原理圖的形式給出了設(shè)計(jì)實(shí)現(xiàn)的全過(guò)程;并通過(guò)編寫微程序設(shè)計(jì)了一個(gè)控制器,作為ALU的控制部件發(fā)出測(cè)試命令,對(duì)其功能進(jìn)行測(cè)試。測(cè)試結(jié)果表明,以原理圖的形式設(shè)計(jì)單元電路,以微程序設(shè)計(jì)測(cè)試文件和控制單元,采用自底向上的方法,能夠保證ALU在結(jié)構(gòu)和功能上達(dá)到設(shè)計(jì)要求,這是一種簡(jiǎn)單而有效的實(shí)現(xiàn)方法。