向明尚 張 強(qiáng)
(東北石油大學(xué)計(jì)算機(jī)與信息技術(shù)學(xué)院, 黑龍江 大慶 163318)
傳統(tǒng)的計(jì)算機(jī)體系結(jié)構(gòu)是指計(jì)算機(jī)的概念性結(jié)構(gòu),其作用是針對(duì)不同的層次分配軟硬件功能和確定軟硬件界面[1]。從存儲(chǔ)程序和數(shù)據(jù)的角度,可將其分為馮·諾依曼結(jié)構(gòu)和哈佛結(jié)構(gòu)。馮·諾依曼結(jié)構(gòu)也稱(chēng)普林斯頓結(jié)構(gòu),是將指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器合并在一起。哈佛結(jié)構(gòu)是將指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器分開(kāi)的一種并行存儲(chǔ)器結(jié)構(gòu)(見(jiàn)圖1),其中程序和數(shù)據(jù)存儲(chǔ)在不同的存儲(chǔ)器中,可分別編址獨(dú)立訪問(wèn)。
圖1 哈佛結(jié)構(gòu)示意圖
模型機(jī)采用的是哈佛結(jié)構(gòu)設(shè)計(jì)指令和數(shù)據(jù)存儲(chǔ)器,指令存儲(chǔ)器用于保存系統(tǒng)和用戶(hù)程序,數(shù)據(jù)存儲(chǔ)器用于保存操作數(shù)據(jù)、計(jì)算結(jié)果以及作為數(shù)據(jù)的交換空間。計(jì)算機(jī)系統(tǒng)通常由運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備、輸出設(shè)備五大功能部件組成[2]。其中,運(yùn)算器用于算術(shù)邏輯運(yùn)算;控制器用于控制程序和數(shù)據(jù)的輸入、運(yùn)行以及計(jì)算結(jié)果的輸出;存儲(chǔ)器用于保存程序和數(shù)據(jù);輸入設(shè)備用于輸入程序和數(shù)據(jù);輸出設(shè)備用于輸出計(jì)算機(jī)系統(tǒng)的計(jì)算結(jié)果及運(yùn)行狀態(tài),通過(guò)顯示器等設(shè)備予以顯示。
計(jì)算機(jī)系統(tǒng)中采用數(shù)字化信息來(lái)表示數(shù)值與其他各種類(lèi)型的信息,采用邏輯代數(shù)作為硬件設(shè)計(jì)的基本數(shù)學(xué)工具[3]。硬件電路的實(shí)現(xiàn),可以通過(guò)現(xiàn)場(chǎng)可編程邏輯陣列(field-programmable gate array,F(xiàn)PGA)[4]和專(zhuān)用集成電路(application specific integrated circuit,ASIC)來(lái)完成[5]。ASIC通用性較差[6-8],因此本次研究采用FPGA實(shí)現(xiàn)哈佛結(jié)構(gòu)模型機(jī)的設(shè)計(jì)。
針對(duì)計(jì)算機(jī)系統(tǒng)中各功能模塊進(jìn)行層次設(shè)計(jì)[9],設(shè)計(jì)的首要原則是簡(jiǎn)化原則。Dijkstra認(rèn)為,系統(tǒng)的層次結(jié)構(gòu)設(shè)計(jì)可以對(duì)系統(tǒng)驗(yàn)證和測(cè)試的簡(jiǎn)化帶來(lái)巨大幫助[10]。完成各功能模塊設(shè)計(jì)后,將其按照邏輯關(guān)系分層組織集成,構(gòu)成模型機(jī)。采用自底向上的設(shè)計(jì)方法,依次設(shè)計(jì)ALU、程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器、譯碼器、累加器(Acc)、通用計(jì)數(shù)器(Ucnt)、程序計(jì)數(shù)器(PC)、堆棧計(jì)數(shù)器(SP)、時(shí)鐘系統(tǒng)、指令系統(tǒng)等功能模塊。驗(yàn)證后將各部件加入總線并予以測(cè)試,分層次組成不同的小系統(tǒng)。對(duì)小系統(tǒng)進(jìn)行全面測(cè)試,通過(guò)測(cè)試后依次封裝制作成系統(tǒng)模塊,即集成單元電路芯片。
運(yùn)算器小系統(tǒng)包括ALU、程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器等模塊。一般情況下,能用數(shù)字化形式表示的信息,就可以歸結(jié)為算術(shù)運(yùn)算或邏輯運(yùn)算類(lèi)數(shù)據(jù)[11]。ALU是完成算術(shù)邏輯運(yùn)算的單元電路,其功能結(jié)構(gòu)如圖2所示。ALU是一個(gè)多輸入、多輸出函數(shù),表示為F=f(A,B,S)。其中,選擇碼用來(lái)確定2個(gè)運(yùn)算數(shù)應(yīng)該完成的運(yùn)算類(lèi)型,總運(yùn)算數(shù)共有2k種。
圖2 ALU功能結(jié)構(gòu)示意圖
對(duì)于程序和數(shù)據(jù)存儲(chǔ)器,則應(yīng)用FPGA中的存儲(chǔ)器IP核進(jìn)行設(shè)計(jì),并配以相應(yīng)的寄存器和存儲(chǔ)器配置文件。驗(yàn)證通過(guò)后,加入總線構(gòu)成一個(gè)運(yùn)算器小系統(tǒng)(見(jiàn)圖3),封裝成Arithmetic_system模塊。
圖3 運(yùn)算器小系統(tǒng)原理圖
計(jì)數(shù)器小系統(tǒng)包括累加器、通用計(jì)數(shù)器、程序計(jì)數(shù)器、堆棧計(jì)數(shù)器等模塊,以及添加封裝后的Arithmetic_system模塊和系統(tǒng)總線構(gòu)成Counter_System模塊,其工作原理如圖4所示。累加器是計(jì)算機(jī)系統(tǒng)中工作比較頻繁的功能部件,參與加減法、乘法、除法等多種運(yùn)算以及數(shù)據(jù)傳送,并具有判斷數(shù)據(jù)正負(fù)和是否為零的功能。
圖4 計(jì)數(shù)器小系統(tǒng)工作原理圖
程序計(jì)數(shù)器PC,作為地址計(jì)數(shù)器指向程序存儲(chǔ)器的一個(gè)存儲(chǔ)單元,用來(lái)保存下一條將要執(zhí)行的指令地址,并且具有計(jì)數(shù)值自動(dòng)加1的功能。當(dāng)指令執(zhí)行時(shí),首先根據(jù)PC中的地址,將一條指令由程序存儲(chǔ)器中取出并放入到指令寄存器中,完成“取指令”的操作,即完成計(jì)算機(jī)系統(tǒng)的“取指”、“譯碼”、“執(zhí)行”的第一個(gè)階段。第一條指令執(zhí)行完畢,PC計(jì)數(shù)值自動(dòng)加1,然后準(zhǔn)備取出下一條指令,最后完成所有指令的執(zhí)行過(guò)程。
堆棧計(jì)數(shù)器,作為堆棧指針指向數(shù)據(jù)存儲(chǔ)器的堆??臻g,采用后進(jìn)先出的棧結(jié)構(gòu),由堆棧指針指向棧頂,可完成數(shù)據(jù)的進(jìn)棧和出棧的操作。
堆棧計(jì)數(shù)器,其初值即棧頂?shù)闹担c計(jì)算機(jī)系統(tǒng)堆棧存儲(chǔ)區(qū)的大小有關(guān)。本系統(tǒng)的堆棧存儲(chǔ)器為8位數(shù)據(jù)存儲(chǔ)器,其數(shù)據(jù)線、地址線都是8位,共有256個(gè)字節(jié)存儲(chǔ)單元,存儲(chǔ)單元地址從 0 到 255。因此,堆棧計(jì)數(shù)器采用的是 8 位計(jì)數(shù)器,可尋址 256 個(gè)存儲(chǔ)單元。
寄存器是系統(tǒng)中的核心資源。為了節(jié)約芯片面積以降低成本,在保證功能和性能的基礎(chǔ)上減少了芯片數(shù)量,并從結(jié)構(gòu)上予以?xún)?yōu)化。在封裝后的Counter_System模塊基礎(chǔ)上,分別添加指令寄存器、操作數(shù)寄存器、輸出結(jié)果寄存器和系統(tǒng)總線等,從而構(gòu)成寄存器小系統(tǒng)。寄存器小系統(tǒng)的工作原理如圖5所示。指令寄存器用于保存由PC作為地址取出來(lái)的指令,以備送往指令譯碼器進(jìn)行譯碼操作。其中,有2個(gè)操作數(shù)寄存器,用于保存參加算數(shù)邏輯運(yùn)算的2個(gè)操作數(shù);有1個(gè)輸出結(jié)果寄存器,用于保存算數(shù)邏輯運(yùn)算的結(jié)果。寄存器小系統(tǒng)封裝成Register_system模塊。
圖5 寄存器小系統(tǒng)原理圖
控制系統(tǒng)是模型機(jī)系統(tǒng)的核心,通過(guò)它才能使各個(gè)功能模塊組織起完整的計(jì)算機(jī)系統(tǒng),并根據(jù)指令系統(tǒng)的指令發(fā)出各種微操作指令,控制和完成各項(xiàng)系統(tǒng)工作。以Register_system模塊為基礎(chǔ),添加譯碼器、節(jié)拍發(fā)生器、控制矩陣等構(gòu)成一個(gè)控制系統(tǒng)。譯碼器在計(jì)算機(jī)中的系統(tǒng)應(yīng)用較多:指令譯碼器,用于區(qū)分指令的功能,根據(jù)指令編碼進(jìn)行譯碼,執(zhí)行指令相應(yīng)的功能;地址譯碼器,用來(lái)區(qū)分存儲(chǔ)器地址,尋找存儲(chǔ)單元;狀態(tài)譯碼器,用來(lái)區(qū)分設(shè)備的運(yùn)行狀態(tài)。譯碼器的設(shè)計(jì)與模型機(jī)的系統(tǒng)總線等有關(guān),如作為存儲(chǔ)器地址譯碼器,其輸入、輸出總線應(yīng)與存儲(chǔ)器地址相匹配。
節(jié)拍發(fā)生器由環(huán)形計(jì)數(shù)器和控制電路組成。模型機(jī)中的各種功能部件,都是在時(shí)鐘信號(hào)的統(tǒng)一控制下按照設(shè)定順序進(jìn)行工作。為了協(xié)調(diào)各部件的工作,將時(shí)鐘信號(hào)轉(zhuǎn)換成機(jī)器節(jié)拍,使各部件按照節(jié)拍的順序有條不紊地工作。
對(duì)于控制矩陣,需要根據(jù)計(jì)算機(jī)系統(tǒng)的體系結(jié)構(gòu)、指令系統(tǒng)、譯碼系統(tǒng)、節(jié)拍發(fā)生器以及各種功能部件的特性進(jìn)行綜合設(shè)計(jì),通過(guò)原理圖和硬件描述語(yǔ)言相結(jié)合的方法來(lái)實(shí)現(xiàn)設(shè)計(jì)。
輸入輸出系統(tǒng),其功能是控制模型機(jī)與外部數(shù)據(jù)的交換。輸入系統(tǒng)由輸入緩沖區(qū)計(jì)數(shù)器、緩沖區(qū)數(shù)據(jù)存儲(chǔ)器、緩沖區(qū)控制單元、頻率協(xié)調(diào)器等單元電路組成;輸出系統(tǒng)由液晶顯示器、七段數(shù)碼管、LED二極管、蜂鳴器等單元電路組成。在上述小系統(tǒng)和控制系統(tǒng)的基礎(chǔ)上,添加輸入輸出系統(tǒng)構(gòu)成模型機(jī)系統(tǒng)模塊Model_TOP,并以Alter DE0實(shí)驗(yàn)板為例添加I/O引腳配置和鎖相環(huán)單元電路,構(gòu)成完整的模型機(jī)系統(tǒng)。模型機(jī)的工作原理如圖6所示。
圖6 模型機(jī)原理圖
計(jì)算機(jī)系統(tǒng)是時(shí)鐘驅(qū)動(dòng)的數(shù)字系統(tǒng),必須具備可靠穩(wěn)定的同步時(shí)鐘系統(tǒng)。對(duì)于同步時(shí)鐘系統(tǒng),一般采用壓控晶振(VCO) 頻率鎖相同步技術(shù)[12]和高精度晶振結(jié)合軟件修正分頻數(shù)同步技術(shù)[13]。本系統(tǒng)采用壓控晶振頻率鎖相同步技術(shù)進(jìn)行設(shè)計(jì),系統(tǒng)的時(shí)鐘周期設(shè)計(jì)為50 ns。DEO開(kāi)發(fā)板上帶有50 MHz的時(shí)鐘源,可產(chǎn)生的時(shí)鐘信號(hào)周期為20 ns,小于模型機(jī)的時(shí)鐘周期,無(wú)法滿足模型機(jī)的時(shí)鐘要求。因此,采用FPGA內(nèi)部的鎖相環(huán)PLL來(lái)處理時(shí)鐘信號(hào),產(chǎn)生模型機(jī)所需的50 ns時(shí)鐘信號(hào)周期。
指令系統(tǒng)是全部機(jī)器指令的集合,機(jī)器指令對(duì)應(yīng)的是機(jī)器語(yǔ)言,而機(jī)器語(yǔ)言是由一條條語(yǔ)句構(gòu)成,每一條語(yǔ)句又能準(zhǔn)確表達(dá)某種語(yǔ)義[2]。在指令系統(tǒng)的設(shè)計(jì)中,既要考慮到功能性和實(shí)用性,又要考慮到實(shí)現(xiàn)的可能性和可靠性。模型機(jī)指令系統(tǒng)基于RISC理論采用單地址格式設(shè)計(jì),指令由操作碼和地址碼組成。表1所示為模型機(jī)部分指令。
管理程序?qū)儆谧鳂I(yè)調(diào)度程序,采用指令系統(tǒng)的指令來(lái)編寫(xiě)。它能通過(guò)指令存儲(chǔ)器配置文件直接提供給指令存儲(chǔ)器,在系統(tǒng)開(kāi)機(jī)后自動(dòng)執(zhí)行。管理系統(tǒng)可根據(jù)輸入緩存區(qū)的情況讀取用戶(hù)程序和數(shù)據(jù),將其分別保存到指令和數(shù)據(jù)存儲(chǔ)器中。當(dāng)用戶(hù)程序和數(shù)據(jù)輸入完畢后,自動(dòng)調(diào)用并執(zhí)行用戶(hù)程序。管理程序清單如表2所示。指令存儲(chǔ)器配置文件如圖7所示。
管理程序可通過(guò)JEMP指令判斷輸入緩沖區(qū)是否為空:如果為空,則循環(huán)等待;如果不空,則調(diào)用輸入子程序Input,將輸入緩沖區(qū)的用戶(hù)程序輸入到模型機(jī)的指令存儲(chǔ)器40號(hào)單元開(kāi)始的存儲(chǔ)單元中,將用戶(hù)的數(shù)據(jù)輸入到模型機(jī)的數(shù)據(jù)存儲(chǔ)器中。JEND指令判斷用戶(hù)程序輸入完畢則調(diào)用用戶(hù)程序開(kāi)始執(zhí)行。
表1 模型機(jī)指令系統(tǒng)
表2 管理程序清單
圖7 指令存儲(chǔ)器配置文件結(jié)構(gòu)示意圖
用戶(hù)程序按照指令系統(tǒng)中的指令編寫(xiě)。簡(jiǎn)單的用戶(hù)程序,可以完成2個(gè)數(shù)的加法運(yùn)算。如,3+5=8,計(jì)算結(jié)果8被送到7段數(shù)碼管上顯示。程序中指令的含義是,數(shù)據(jù)3送到Acc,Acc送到數(shù)據(jù)RAM的1號(hào)單元,即第一個(gè)加數(shù)保存在數(shù)據(jù)RAM的1號(hào)單元;接下來(lái)數(shù)據(jù)5送到Acc,Add指令將Acc的內(nèi)容加上數(shù)據(jù)RAM的1號(hào)單元的內(nèi)容3,得到的和是8,再將數(shù)據(jù)8保存到數(shù)據(jù)RAM的2號(hào)單元,最后輸出數(shù)據(jù)RAM的2號(hào)單元的內(nèi)容,即輸出加法運(yùn)算的和。
采用Verilog 語(yǔ)言編寫(xiě)微程序進(jìn)行仿真測(cè)試。Verilog是硬件描述語(yǔ)言的一種,用于數(shù)字系統(tǒng)設(shè)計(jì)??捎盟M(jìn)行各種級(jí)別的邏輯設(shè)計(jì),也可用它進(jìn)行數(shù)字邏輯系統(tǒng)的仿真驗(yàn)證、時(shí)序分析、邏輯綜合[14]。以運(yùn)算器小系統(tǒng)為例介紹仿真測(cè)試過(guò)程。
首先,建立測(cè)試工程,其測(cè)試原理如圖8所示。
圖8 運(yùn)算器小系統(tǒng)仿真測(cè)試原理圖
其次,編寫(xiě)微程序測(cè)試文件并執(zhí)行仿真,仿真波形如圖9所示,部分測(cè)試文件代碼如下。
第一段代碼:
#100 d=0;dataMAL=1;clk=1;
#100 dataMAL=0;clk=0;
#100 d=9;dataMDL=1;clk=1;
#100 dataMDL=0;clk=0;
#100 dataMW=1;clk=1;
#100 dataMW=0;clk=0;
#100 dataME=1; clk=1;
#100 dataME=0; clk=0;
……
在上述代碼段中,將數(shù)據(jù)9 寫(xiě)入數(shù)據(jù)RAM的0號(hào)單元,對(duì)應(yīng)圖9中的1、2、3處。
第二段代碼:
#100 d=1;dataMAL=1; clk=1;
#100 dataMAL=0;clk=0;
#100 d=6;dataMDL=1; clk=1;
#100 dataMDL=0;clk=0;
#100 dataMW=1; clk=1;
#100 dataMW=0;clk=0;
#100 dataME=1; clk=1;
#100 dataME=0; clk=0;
……
上述代碼段,將數(shù)據(jù)6寫(xiě)入數(shù)據(jù) RAM的1號(hào)單元,其執(zhí)行結(jié)果對(duì)應(yīng)于圖9中的4、5、6處。
第三段代碼:
#100 add=0;clk=1;#100 clk=0; add =0
#100 d=0;dataMAL=1; clk=1;
#100 dataMAL=0;clk=0;
#100 dataME=1;clk=1;#100 clk=0;
#100 aL=1;clk=1;
#100 aL=0;dataME=0;clk=0;
……
上述代碼段,將數(shù)據(jù)RAM的0號(hào)單元數(shù)據(jù)9輸出到總線,同時(shí),ALU的數(shù)據(jù)寄存器鎖存數(shù)據(jù)9,其執(zhí)行結(jié)果對(duì)應(yīng)于圖9中的7、8處。
第四段代碼:
#100 d=1;dataMAL=1;clk=1;
#100 dataMAL=0;clk=0;
#100 dataME=1;clk=1;#100 clk=0;
#100 bL=1;clk=1;
#100 bL=0;dataME=0;clk=0;
……
上述代碼段,將數(shù)據(jù)RAM的1號(hào)單元數(shù)據(jù)6輸出到總線,同時(shí),ALU的數(shù)據(jù)寄存器鎖存數(shù)據(jù)6,其執(zhí)行結(jié)果對(duì)應(yīng)于圖9中的9、10的處。
第五段代碼:
#100 clk=1;addE=1;notE=0;orE=0;andE=0;
#100 clk=0;addE=0;
#100 clk=1;addE=0;notE=0;orE=0;andE=1;
#100 clk=0;andE=0;
#100 clk=1;addE=0;notE=0;orE=1;andE=0;
#100 clk=0;orE=0;
#100 clk=1;addE=0;notE=1;orE=0;andE=0;
#100 clk=0;notE=0;
……
上述代碼段輸出運(yùn)算器小系統(tǒng)的算數(shù)邏輯運(yùn)算和、與、或、非的結(jié)果:0f、00、0f、f6,其執(zhí)行結(jié)果對(duì)應(yīng)于圖9中的11、12、13、14處。
圖9 運(yùn)算器小系統(tǒng)仿真波形圖
按照?qǐng)D6配置輸入輸出引腳,將工程與開(kāi)發(fā)板聯(lián)系起來(lái),編譯工程生成開(kāi)發(fā)板編程文件Model_TOP.pof,利用開(kāi)發(fā)板的JTAG接口下載到開(kāi)發(fā)板的Flash 中保存,開(kāi)機(jī)后即可自動(dòng)執(zhí)行模型機(jī)系統(tǒng)。通過(guò)開(kāi)發(fā)板上的按鍵,依次輸入用戶(hù)程序代碼:06,03,05,01,06,05,01,01,05,02,02,02,F(xiàn)1。錄入完畢按下復(fù)位鍵開(kāi)始執(zhí)行用戶(hù)程序,即可在開(kāi)發(fā)板的數(shù)碼管上顯示2個(gè)加數(shù)(數(shù)字3和5),以及求得的和(數(shù)字8)。用戶(hù)程序執(zhí)行結(jié)果正確,表明模型機(jī)系統(tǒng)設(shè)計(jì)正確。
模型機(jī)采用哈佛結(jié)構(gòu)利用自底向上的方法進(jìn)行設(shè)計(jì)。首先設(shè)計(jì)所需要的各種功能單元電路,依次分層封裝成小系統(tǒng),再生成電路元件并添加總線及控制電路,最后構(gòu)成完整的模型機(jī)系統(tǒng)。單元電路的設(shè)計(jì)采用IP核、原理圖和Verilog語(yǔ)言編程相結(jié)合的形式進(jìn)行。原理圖設(shè)計(jì)簡(jiǎn)潔直觀,適合于邏輯邊界清晰明確、功能相對(duì)簡(jiǎn)單的單元電路設(shè)計(jì)。對(duì)于邏輯邊界不夠清晰、功能比較復(fù)雜的單元電路,采用語(yǔ)言編程的方法更方便有效。系統(tǒng)設(shè)計(jì)的難點(diǎn)在于指令系統(tǒng)、時(shí)鐘、節(jié)拍系統(tǒng)、控制矩陣等。對(duì)于系統(tǒng)設(shè)計(jì)的正確性,采用仿真波形分析和開(kāi)發(fā)板下載相結(jié)合的方法進(jìn)行驗(yàn)證。通過(guò)仿真分析對(duì)各個(gè)功能模塊逐一驗(yàn)證,能夠及時(shí)發(fā)現(xiàn)并糾正設(shè)計(jì)中存在的問(wèn)題,加快設(shè)計(jì)進(jìn)度。通過(guò)開(kāi)發(fā)板下載運(yùn)行所設(shè)計(jì)的工程文件,測(cè)試了模型機(jī)的功能和系統(tǒng)性能。測(cè)試驗(yàn)證結(jié)果表明,模型機(jī)的設(shè)計(jì)合理有效,其各項(xiàng)功能及性能符合要求。