黃淑玲
(韓山師范學院物理與電子工程系,潮州 521041)
軟件模擬實驗具有傳統(tǒng)實驗不可比擬的幾個優(yōu)勢[1]:①實現(xiàn)實驗組數(shù)無限擴展和實驗的“零”維護保障;②實現(xiàn)實驗教學的“一體化”;③突破傳統(tǒng)實驗對“時、空”的限制;④易于開設新型實驗項目;⑤有助于教育資源的共享和實現(xiàn)跨學科教學。微機原理是一門重要的專業(yè)課程。該課程比較抽象,實踐性較強。該課程按大綱要求只開設18學時的實驗,顯然要深入學好這門課程,18學時的實驗是遠遠不夠的。為此,微機原理軟件模擬實驗可以彌補現(xiàn)實情況的不足。
傳統(tǒng)的微機原理實驗設備包括計算機和其相連的專用實驗箱兩部分,“微機原理軟件模擬實驗”則采用以“軟”代“硬”的設計電路,強調(diào)實用性、效益性為主,以最大限度地仿真真實環(huán)境,主要實現(xiàn)了“專用實驗箱”的虛擬化,將它“搬”到了“計算機”的顯示器上。要實現(xiàn)實驗箱的虛擬化首先要完成實驗箱中具有獨立功能的所有部件的虛擬化,主要包括虛擬接口芯片的設計以及每個實驗如何調(diào)用所需用的硬件芯片、如何執(zhí)行程序、如何得出結(jié)果等。
虛擬接口芯片是用一個類來封裝和構(gòu)造的[2-3]。使得其具有獨立性、擴充性、可重用性和可維護性。根據(jù)芯片的功能、特性抽象出能體現(xiàn)這些功能和特性的屬性、方法、事件。芯片的內(nèi)部屬性與外部通信是通過虛擬芯片的行為來完成的。行為在類中表現(xiàn)為事件與方法。事件是被動行為,由某個內(nèi)部或外部條件的變化來觸發(fā);方法是主動行為,是組件對自身或外部環(huán)境的主動調(diào)用。例如對于并行接口8255芯片,用E8255Chip類來封裝8255虛擬接口芯片。E8255Chip類實現(xiàn)了8255可編程并行I/O接口芯片的邏輯功能,它所包含的主要方法和事件如下:
void setPortAdress(int num):設置芯片的端口地址
int getPortAdress():獲取芯片的端口地址
void setWR(short num):設置寫信號
short getWR():獲取寫信號
void setRD(short num):設置讀信號
short getRD():獲取讀信號
void setCS(short num):設置片選信號
short getCS():獲取片選信號
void setA1A0(short num):設置內(nèi)部地址信號
short getA1A0():獲取內(nèi)部地址信號
void setConSignal():設置5個控制信號A1 A0/RD/WR/CS
short getConSignal():獲取5個控制信號A1 A0/RD/WR/CS
void setReadConSignal():設置讀端口5個控制信號(A1 A0/RD/WR/CS)
void setWriteConSignal():設置寫端口5個控制信號(A1 A0/RD/WR/CS)
void setPortData(short num):設置端口數(shù)據(jù)(D0~D7引腳信號)
short getPortData():獲取端口數(shù)據(jù)(D0~D7引腳信號)
short getE8255Areg():獲取A口數(shù)據(jù)(PA0~PA7引腳信號)
void setE8255Areg(short num):設置A口數(shù)據(jù)(PA0~PA7引腳信號)
short getE8255Breg():獲取B口數(shù)據(jù)(PB0~PB7引腳信號)
void setE8255Breg(short num):設置B口數(shù)據(jù)(PB0~PB7引腳信號)
short getE8255Creg():獲取C口數(shù)據(jù)(PC0~PC7引腳信號)
void setE8255Creg(short num):設置C口數(shù)據(jù)(PC0~PC7引腳信號)
short getE8255Conreg():獲取控制口數(shù)據(jù)
void setE8255Conreg(short num):設置控制口數(shù)據(jù)
void setE8255work():設置工作方式
int getE8255AWork():獲取A口工作方式
int getE8255BWork():獲取B口工作方式
void PortReadWrite():進行端口讀寫
void addPropertyChangeListener(PropertyChange-Listener listener):
注冊屬性改變監(jiān)聽器。
void removePropertyChangeListener(PropertyChangeListener listener):
注銷屬性改變監(jiān)聽器。
E8255Chip類采用JavaBean組件形式封裝,該組件能產(chǎn)生屬性改變事件PropertyChangeEvent。因為E8255Chip對象能產(chǎn)生 PropertyChangeEvent,同時在 setE8255Areg()、setE8255Breg()和setE8255 Creg()三個方法中都利用firePropertyChange()進行點火操作,firePropertyChange()對所注冊的監(jiān)聽器發(fā)出一個PropertyChangeEvent,也就是說只要端口的數(shù)據(jù)改變就通知相應的屬性改變事件監(jiān)聽器PropertyChangeListener,在該監(jiān)聽器中的 property Change()方法作相應的處理。
每一個實驗對應一個模擬器。模擬器仿真執(zhí)行某一個實驗,它充當CPU的角色,負責調(diào)配實驗所需的軟、硬件。軟件是指解釋程序和用戶輸入的源程序,而硬件是指虛擬實驗平臺。模擬器根據(jù)用戶在虛擬實驗平臺上的連線,調(diào)用解釋程序?qū)R編源程序進行解釋來仿真運行結(jié)果。
模擬器的設計存在共性和個性的地方,模擬器共性的設計就是一些共享方法和共享類的設計。實現(xiàn)連線操作和源程序的編寫方法都屬于共性的部分,由一個獨立的邏輯類組成的虛擬芯片也屬于模擬器共性的部分。實驗數(shù)據(jù)的輸入和結(jié)果輸出部分屬于個性的東西。模擬器設計采用繼承的方法。共性的東西在基類中實現(xiàn),屬于個性的東西在擴展類中實現(xiàn)。這樣的設計既不會使得方法冗余又能滿足不同實驗的需求。
8255可編程并行I/O接口芯片作為輸出口實驗模擬器由基類Simulator.java和擴展類E8255Led Simulator.java 實現(xiàn)[4-5],這個實驗的接線原理圖如圖1所示。8255芯片的A口作為輸出口,在工作方式0。A口的輸出接到八個LED燈(L0~L7),片選信號CS接地址端口218H-21FH。
圖1 8255芯片輸出實驗接線原理圖
基類主要實現(xiàn)跟連線操作、源程序編寫有關(guān)的功能?;惐辉O計成一個抽象類,update()和propertyChange()方法被設計成抽象方法,它們在擴展類中必須被超越。Simulator類繼承Panel類,實現(xiàn)MouseListener,MouseMotionListener,ProtertyChange-Listener和Runnable四個接口:
abstract public class Simulator extends Panel implements MouseListener,MouseMotionListener,ProtertyChangeListener,Runnable
Simulator類方法如下:
private void Init PinArea():存儲引腳坐標信息
private void Init PinPoint():存儲引腳的屬性
public void InitImage():初始化本實驗所需圖像
public void paint(Graphics g):屏幕輸出
abstract public void update(Graphics g):更新輸出
public int DelLine(int x,int y):刪除一條連線
public void ClearLine():刪除所有連線
public void TwoPinConnection(int from,int to):連接兩個引腳
public void TwoPinCut(int from,int to):斷開兩個引腳
public void run():處理Socket連接
public void mouseClicked(MouseEvent me):處理鼠標點擊事件
public void mouseMoved(MouseEvent me):處理鼠標移動事件
abstract public void propertyChange(Property ChangeEvent pcevent):處理屬性改變事件
不同的實驗除了采用不同的虛擬硬件之外,它們的數(shù)據(jù)輸入和結(jié)果輸出也不同,有的實驗需要從鍵盤輸入數(shù)據(jù),有的實驗通過撥實驗平臺上的開關(guān)按鈕向?qū)嶒炋峁┹斎霐?shù)據(jù)。有些實驗的結(jié)果是輸出到屏幕上,而有些實驗是通過二極管燈顯示實驗的結(jié)果。所以對擴展類的設計主要是對這些方法進行編寫。
擴展類繼承了基類所定義的所有實例變量和方法。而且可以定義它自己特有的元素。那么在E8255LedSimulator類中除了對Simulator類的抽象方法update()和propertyChange()進行超越之外,還增加了檢查硬件連線是否正確的方法Check Line()。而數(shù)據(jù)成員必須增加該實驗所需的虛擬芯片對象。
E8255LedSimulator類通過超越propertyChanger()方法來完成當8255芯片的端口數(shù)據(jù)改變時所做的事情。因為這個實驗是把A口作為輸出口,所以在propertyChanger()方法中,根據(jù)8255芯片的工作方式把A口的輸出送給它的相連端,實現(xiàn)了A口的數(shù)據(jù)一改變,跟它相連的二極管的數(shù)據(jù)也相應改變,然后在paint()方法中根據(jù)二極管的值點亮或熄滅二極管燈,實現(xiàn)了這個實驗的功能。
模擬器調(diào)用解釋程序?qū)R編源程序進行解釋執(zhí)行,當執(zhí)行到out指令時會使端口數(shù)據(jù)發(fā)生改變,從前面介紹的8522虛擬芯片可以知道,端口數(shù)據(jù)改變就會執(zhí)行firePropertyChange()方法引發(fā)屬性改變事件,從而執(zhí)行E8255LedSimulator類中的propertyChanger()方法。所以在propertyChanger()方法中主要實現(xiàn)跟8255芯片的A、B、C口相連的端口數(shù)據(jù)的及時改變。也就是說數(shù)據(jù)端口改變跟它相連的端也要跟著改變,在這個實驗中,端口A跟L0~L7燈相連,若向A口送0FFH,則L0~L7燈全亮。
軟件模擬實驗的實現(xiàn)加上計算機和網(wǎng)絡資源的普及為虛擬實驗室的開設提供了必要的基礎(chǔ)條件。虛擬實驗室具有仿真性、實時交互性、共享性、可重用性等特點,能夠大大提高學生的動手和創(chuàng)新能力,節(jié)約大量的人力和物力,對軟件模擬實驗的研究有著深遠的意義。
[1]Jackson.Johns Hopkins University A VIRTUAL ENGINEERING/SCIENCE LABORATORY[EB/OL].www.jhu.edu/~ virtlab/logic/log_cir.htm.
[2]應時,康立山,陳毓屏,吳霞.基于Java的代碼組件重用技術(shù) JavaBeans[J].微電子學與計算機,2000,17(3):1-5.
[3]陸立巧,閔華松,陳奎生.基于組件技術(shù)的虛擬儀器開發(fā)方法[J].武漢科技大學學報(自然科學版),2002,25(2):240-245.
[4][美]Bruce Eckel.Java編程思想(第二版)[M].候捷,譯.北京:機械工業(yè)出版社,2002.
[5]Herbert Schildt.James Holmes.the ART of JAVA[M].USA:McGraw - Hill,2003.