1 引 言
微型計算機原理幾乎是所有理工科類大學(xué)生的必修課目之一,, 其重要性不言而喻,。然而大多數(shù)教學(xué)側(cè)重于應(yīng)用方面, 對計算機的結(jié)構(gòu)及工作原理涉之不深,, 因為無法做一個CPU 來演示,。這樣學(xué)生不能真正了解其性能特點, 掌握內(nèi)部結(jié)構(gòu),, 在學(xué)習匯編語言的時候增加了難度,, 影響學(xué)習興趣。隨著可編程邏輯器件的廣泛應(yīng)用,, 給數(shù)字系統(tǒng)的設(shè)計帶來了極大的靈活性,, 用戶可以利用現(xiàn)場可編程門陣列FPGA 來開發(fā)出一個適合自己的專用CPU, 對微型計算機的原理及結(jié)構(gòu)進行充分理解與研究,, 便于將來從事相關(guān)ASIC設(shè)計,, 開發(fā)出創(chuàng)新型的產(chǎn)品, 為我國計算機發(fā)展做貢獻,。
現(xiàn)場可編程門陣列FPGA 門數(shù)眾多,, 人們可以將合適的IP軟核或其他形式的核作為嵌入式模塊裝在自己的設(shè)計中。但通常IP軟核需要門數(shù)較多的FPGA 器件支持,, 作為學(xué)習來說的FPGA 芯片往往資源有限, 需要節(jié)約FPGA 的成本與面積; 并且沒必要實現(xiàn)所有功能,, 只要做出關(guān)鍵部分及重要結(jié)構(gòu),,明白其運行機理, 又能與真實的CPU 緊密相聯(lián)即可,。實驗箱上采用的FPGA 芯片為A ltera 公司的EPF10K20TC144- 4,。這里以Inte l的8085A 為例來說明8位計算機的工作原理。
2 8085A CPU 設(shè)計及實現(xiàn)
2. 1 FPGA 芯片及外圍電路簡介
A ltera的FLEX10K 器件是工業(yè)界首例嵌入式PLD,, 基于可重配置CMOS SRAM 元件,。EPF10K20帶有144個LAB (邏輯陣列塊) 和1152 個邏輯單元, 最大I/O數(shù)目為189,。另外,, 芯片中嵌入式陳列塊( EAB)有6個, 其RAM 總位數(shù)為12288,。
實驗涉及到FPGA 芯片的外圍部分包括控制開關(guān),、2* 8鍵盤輸入、6個數(shù)碼管輸出,、8個輸入端口,、8個輸出端口及2個中斷開關(guān)等,。主要用來增添程序設(shè)計的靈活性及形象性, 使其可現(xiàn)場調(diào)試,, 驗證結(jié)果,, 避免單純用軟件仿真的不足。外圍電路控制模塊及結(jié)構(gòu)可參見文獻[ 1] ,。
現(xiàn)場調(diào)試時可以通過控制開關(guān),, 手動從鍵盤輸入相應(yīng)的地址及數(shù)據(jù)(通過數(shù)碼管顯示), 輸錯可以修改; 用寫使能開關(guān)給RAM 寫入相應(yīng)程序,。當輸入完所有程序后,, 按下運行開關(guān)即可執(zhí)行程序, 在數(shù)碼管上顯示地址,、數(shù)據(jù)及最終結(jié)果,。控制開關(guān)用于配合鍵盤通過手動方式輸入程序,, 可以形象化的現(xiàn)場編程,。在軟件下載后不使用計算機, 通過按鈕,、鍵盤就能將程序輸入到RAM 中,, 然后運行, 顯示出結(jié)果,。
2. 2 CPU模塊
2. 2. 1 內(nèi)部結(jié)構(gòu)
CPU 模塊的內(nèi)部結(jié)構(gòu)如圖1所示,。微型計算機由下面幾個部分組成: 8位通用寄存器H、L,, 16位程序計數(shù)器( PC ) ,, 16位堆棧指示器( SP), 一個加1 /減1 地址鎖存器( ADD /ADR ),, 8 位NL 寄存器( NL) ,, 8位中斷時間寄存器( T IMER ) ; 算術(shù)邏輯單元(ALU ), 累加器(A ),, 標志寄存器( FR ),, 數(shù)據(jù)選擇器( SEL) ; 指令寄存器( IR) , 控制器( CON ) ,, 4選1多路選擇器(MUX) ,, 存儲地址寄存器(MAR ) , 8 位數(shù)據(jù)寄存器(MDR) ; 輸入數(shù)據(jù)寄存器( INDT ),, 輸出數(shù)據(jù)寄存器( OUTDT )等部分組成,。其中標志寄存器有4位, 分別是: 進位位( Cy),、零位( Z),、符號位( S),、奇偶位( P) , 微機通過檢測這些標志位的1位或多位來判斷程序是否需要轉(zhuǎn)移,。
微型計算機CPU 結(jié)構(gòu)圖
圖1 微型計算機CPU 結(jié)構(gòu)圖
圖中字母L為數(shù)據(jù)載入控制信號,, E 為三態(tài)輸出選通信號, clk為時鐘信號,, c lr為清零信號,, W 為數(shù)據(jù)載入PC信號, Cpc為控制PC 加1信號,, S3- S0為控制ALU 進行加減,、邏輯運算或移位運算的選擇信號, Iadr,、Dadr為加1 /減1地址鎖存器加1減1控制信號,, Isp、Dsp為堆棧指示器的加1減1 控制信號,, E ram,、W ram 為讀寫RAM 控制信號。另外,, 累加器(A ) ,, 標志寄存器( FR )增加了專用的清零信號。
所有的控制,、時鐘及清零信號由控制器( CON)模塊給出,, 而CON 模塊由外部時鐘clkin、清零信號rst及使能信號enable 控制,。存儲地址寄存器(MAR )用來給RAM輸送地址,, 從RAM 讀指令和數(shù)據(jù), 也可以給RAM寫數(shù)據(jù),。
A ltera公司的EPF10K20TC144 - 4 芯片中有6個嵌入式陳列塊, 其RAM 總位數(shù)為12288,。這里RAM 可配置為1024 * 8( 1024個地址,, 8位數(shù)據(jù)) ,直接調(diào)用參數(shù)可設(shè)置模塊庫中LPM _RAM _ IO 的LPM_FILE 文件,, 用文本編輯器編輯m if文件來初始化數(shù)據(jù),。如果不用FPGA 的內(nèi)部RAM, 可外接64K的8位RAM,, 即尋址空間為64K,。
2. 2. 2 指令系統(tǒng)
內(nèi)部工作原理和指令系統(tǒng)緊密相聯(lián)。本微機共有54條指令,, 可分為8類,, 即數(shù)據(jù)傳送指令,、算術(shù)與邏輯運算指令、移位指令,、增量與減量指令,、堆棧操作及中斷指令、轉(zhuǎn)移指令,、子程序調(diào)用及返回指令,、其它指令等。指令系統(tǒng)與8080 /8085的指令系統(tǒng)表基本一致,, 標志位的變化(無輔助進位位) 與其相同,, 可參見文獻。
由于資源所限,, 沒有使用8085A 所有的寄存器及某些功能,, 如B、C,、D,、E 寄存器等, 但是這并不妨礙本微機能夠?qū)崿F(xiàn)其絕大多數(shù)功能,。從時鐘周期數(shù)(狀態(tài)數(shù))來說,, 比8085A 更少, 也就是說速度更快,。
數(shù)據(jù)傳送指令有14條(一個n表示一個8位二進制數(shù)據(jù)): 3個狀態(tài)數(shù)的movah (將H 的內(nèi)容存入A ),、movha、mov la(將A 的內(nèi)容存入L),、mova;l 4狀態(tài)的mvian(將數(shù)據(jù)n存入A),、mv ihn、mv iln,、mvitn(將數(shù)據(jù)n 存入t ime寄存器,, 此指令為新增) ; 5 狀態(tài)的movma(將A 的內(nèi)容裝入HL所指的地址)、movam; 4狀態(tài)數(shù)的sphl(將HL寄存器的內(nèi)容裝入SP); 6狀態(tài)的inn( n所指地址的內(nèi)容給A ),、outn; 4狀態(tài)的cd _out(A內(nèi)容給PC+ 1,, 停機, 此指令為新增)等,。
算術(shù)與邏輯運算指令有13 條: 3 狀態(tài)的cmc( Cy符號取反),、stc( Cy置1) 、cma(寄存器A 內(nèi)容取反); 4狀態(tài)的addh(將A 與H 相加后給A ),、adin(將A 與n相加后給A),、subh、su in,、cmph(將A 與H相比較(只影響符號) ),、adch(將A 與H 及符號Cy相加后給A ),、sbbh、anah(將A 與H 寄存器的內(nèi)容相與后給A ),、orah,、xrah(將A 與H 異或后給A )等。
移位指令有4條,, 同8085A,。增量與減量指令有4條, 只針對H,、L寄存器,。堆棧操作及中斷指令有8條: 7 狀態(tài)的pushh( HL 壓入堆棧)、pushp( AF壓入堆棧); 6狀態(tài)的poph,、popp; 8狀態(tài)的rsta(重新啟動); 3狀態(tài)的etim e( T 寄存器使能,, 此指令為新增)、eint(中斷使能),、d int等,。轉(zhuǎn)移指令有5條: 7狀態(tài)的jmpn(無條件轉(zhuǎn)移至程序nn, 低位在前); 不跳轉(zhuǎn)時5狀態(tài),, 跳轉(zhuǎn)時7狀態(tài)的jnn( Z= 1時轉(zhuǎn)移至程序nn),、jcn、jmn,、jpen等,。子程序調(diào)用及返回指令有2條: 11狀態(tài)的calln (保留當前PC, 轉(zhuǎn)移至程序nn,, 低位在前),、7狀態(tài)的ret(返回)。其它指令有4條: 3狀態(tài)的nop,、c lrF(標志寄存器清零,, 此指令為新增)、clrA (A 清零,, 此指令為新增),、hlt等。
狀態(tài)數(shù)的計算,, 若本次指令的前面一指令為3狀態(tài)數(shù)時,, 本指令將會減少1 狀態(tài),。如: movha,,adin; 若第1指令movha前沒有其它3 狀態(tài)指令時,它是3個狀態(tài),, 而adin會減少1狀態(tài),, 由原來的4狀態(tài)變?yōu)?狀態(tài),。再如: mov la, movha; 則后一狀態(tài)由3狀態(tài)變成2狀態(tài),。其余類似(但不包括rsta),。
2. 2. 3 工作原理
由圖1可知, 不同的子模塊一共有20個,, 每個模塊用VHDL程序來實現(xiàn),, 最后用元件例化語句構(gòu)成總模塊。下面以設(shè)計算術(shù)邏輯部件模塊c_alu及控制模塊c_con為例簡要介紹一下思路,。
( 1)算術(shù)邏輯部件c_alu,。
算術(shù)邏輯部件c_a lu非常占用FPGA的邏輯單元log ic cells, 需要盡量優(yōu)化,。S3- S0為控制ALU 進行加減,、邏輯或移位運算的選擇信號, 一共可得到16種運算,, 這里用了13種: 6種算術(shù),、3種邏輯運算和4種移位指令。如加法,、減法,、加1、減1,、帶符號位加法,、帶符號位減法; A 或B、A 與B,、A 異或B; A 左移,、A右移、A 帶Cy 左移,、A 帶Cy右移等,。另外, ALU 的運算直接影響到符號位的變化,, 運算結(jié)果存入標志寄存器( FR),。有關(guān)alu的運算多為4個狀態(tài)。
( 2)控制模塊c_con,。
占用FPGA 的邏輯單元log ic ce lls最多的是控制模塊c_con,。在參考文獻[ 3] 中的思路不再適合于稍大型的CPU 設(shè)計, 但它是理解如何控制CPU 信號的一個起點,。對于一條指令應(yīng)該細化到每一個步驟及每一位,, 而不再是以一個控制字的方式去實現(xiàn)。以指令movah為例, 首先把PC 值送入MAR 寄存器,, 此為狀態(tài)s0,, 這時起作用的是Lmar; 然后在狀態(tài)s1時, PC值加1,, 將存儲器單元中的內(nèi)容讀入到IR,, 這時Cpc、E ram,、Lir起作用,, Lmar不再起作用, 需要置0; 接著在狀態(tài)s2時,, 對IR 寄存器中的指令進行譯碼,, 所有的操作指令都是在此狀態(tài)譯碼(不包括rsta)。對于3狀態(tài)指令,, 不保存指令,, 直接執(zhí)行, 然后跳轉(zhuǎn)到狀態(tài)s1,。因此對于下一條指令來說,, 其狀態(tài)數(shù)減1。
指令中狀態(tài)數(shù)最多的是子程序調(diào)用ca lln指令,。
C alln指令要保存PC 值到SP- 1及SP- 2中,, 然后跳轉(zhuǎn)到子程序??紤]到返回指令ret執(zhí)行后,, PC 要重新在原位置執(zhí)行, 那么存入SP中的PC 值應(yīng)該是在得到其指令后加3,。對PC 進行單獨加3是一種思路,, 但需要另外耗費資源, 并且增加狀態(tài),。這里采用了先把ca lln后的nn存入16位的加1 /減1 地址鎖存器,, 然后保存PC 到SP, 再將nn 賦值給PC,, 跳轉(zhuǎn)到子程序的方法,。返回指令ret不僅可以用作子程序調(diào)用后的返回, 還可用于中斷的返回,。
2. 3.. FPGA 實現(xiàn)及編程思路
由于使用內(nèi)部RAM,, 其地址空間為0000 -03FFH。通常在00H 中放入28 (即jmpn,, 跳轉(zhuǎn)指令) ,, 將程序跳轉(zhuǎn)到從40H 開始,。把03- 0EH 作為放常用變量的空間, 用inn及outn指令來調(diào)用,, 以解決寄存器不足的缺陷。這也是一種編程思路,, 可參見文獻[ 4] ,。0FH、1FH,、2FH 分別為外部中斷0( int0) ,, 外部中斷1( int1), 定時器中斷( time) 的起始位置,。Int0優(yōu)先級最高,, int1次之, time最低,。中斷信號高電平有效,。中斷功能的實現(xiàn)是為了學(xué)習其工作原理, 只做了一個定時器中斷,。計時為減1方式,, 當計時為0時, 發(fā)出中斷信號,。T ime中斷的使用方法: 首先關(guān)中斷( dint),, 給T賦值(mv itn) , 再開中斷( e int),, T寄存器使能( et ime),。此后, T 寄存器正常工作,。若要再次使用,, 首先給T 賦值, 然后T寄存器使能,。
初始時的PC 為0000H,, SP為03FFH。SP的更改可通過指令sph l來執(zhí)行,。針對實驗箱,, 將8000-0FFFFH 作為輸出口地址, 4000 - 7FFFH 作為輸入口地址,。而實際實驗箱上只定義了1個8位輸入,, 1個8位輸出。IO 口的操作可通過movam 及movma指令去實現(xiàn),。
由于鍵盤輸入時,, 要進行去抖動處理, 使用了兩種不同的時鐘頻率。鍵盤處理采用1KH z的頻率,,而CPU 的工作時鐘可選擇實驗箱上的不同頻率,, 從1H z到10MH z皆可, 甚至可以外接其它更高頻率,。
如果采用1H z的clk in 頻率,, 可以清楚地看到CPU工作的每一過程。
將本微機下載到實驗箱上,, 已成功實現(xiàn)了乘法(用減1或右移的方法),, 調(diào)用子程序, IO 口的使用,,中斷的使用等多項實驗,, 驗證了CPU 設(shè)計的正確性。
3 結(jié)束語
QuartusII對微機進行編譯,, 其邏輯單元LE 用到1151,, 占100% 。用FPGA 來實現(xiàn)CPU 的功能,, 研究其工作原理,, 然后用Synp lify pro軟件對其進行門級研究, 對CPU 的面紗將不再感到神秘,, 有利于做成專用集成電路ASIC,, 控制其規(guī)模, 節(jié)約芯片成本與面積,。同時,, 也會增加對FPGA 的學(xué)習興趣和使用技巧, 開發(fā)出更多新的產(chǎn)品,。