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