微机原理软件模拟实验的设计与实现
2012-09-11黄淑玲
黄淑玲
(韩山师范学院物理与电子工程系,潮州 521041)
1 引言
软件模拟实验具有传统实验不可比拟的几个优势[1]:①实现实验组数无限扩展和实验的“零”维护保障;②实现实验教学的“一体化”;③突破传统实验对“时、空”的限制;④易于开设新型实验项目;⑤有助于教育资源的共享和实现跨学科教学。微机原理是一门重要的专业课程。该课程比较抽象,实践性较强。该课程按大纲要求只开设18学时的实验,显然要深入学好这门课程,18学时的实验是远远不够的。为此,微机原理软件模拟实验可以弥补现实情况的不足。
2 微机原理软件模拟实验的设计
传统的微机原理实验设备包括计算机和其相连的专用实验箱两部分,“微机原理软件模拟实验”则采用以“软”代“硬”的设计电路,强调实用性、效益性为主,以最大限度地仿真真实环境,主要实现了“专用实验箱”的虚拟化,将它“搬”到了“计算机”的显示器上。要实现实验箱的虚拟化首先要完成实验箱中具有独立功能的所有部件的虚拟化,主要包括虚拟接口芯片的设计以及每个实验如何调用所需用的硬件芯片、如何执行程序、如何得出结果等。
2.1 虚拟接口芯片的设计
虚拟接口芯片是用一个类来封装和构造的[2-3]。使得其具有独立性、扩充性、可重用性和可维护性。根据芯片的功能、特性抽象出能体现这些功能和特性的属性、方法、事件。芯片的内部属性与外部通信是通过虚拟芯片的行为来完成的。行为在类中表现为事件与方法。事件是被动行为,由某个内部或外部条件的变化来触发;方法是主动行为,是组件对自身或外部环境的主动调用。例如对于并行接口8255芯片,用E8255Chip类来封装8255虚拟接口芯片。E8255Chip类实现了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):设置内部地址信号
short getA1A0():获取内部地址信号
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):设置端口数据(D0~D7引脚信号)
short getPortData():获取端口数据(D0~D7引脚信号)
short getE8255Areg():获取A口数据(PA0~PA7引脚信号)
void setE8255Areg(short num):设置A口数据(PA0~PA7引脚信号)
short getE8255Breg():获取B口数据(PB0~PB7引脚信号)
void setE8255Breg(short num):设置B口数据(PB0~PB7引脚信号)
short getE8255Creg():获取C口数据(PC0~PC7引脚信号)
void setE8255Creg(short num):设置C口数据(PC0~PC7引脚信号)
short getE8255Conreg():获取控制口数据
void setE8255Conreg(short num):设置控制口数据
void setE8255work():设置工作方式
int getE8255AWork():获取A口工作方式
int getE8255BWork():获取B口工作方式
void PortReadWrite():进行端口读写
void addPropertyChangeListener(PropertyChange-Listener listener):
注册属性改变监听器。
void removePropertyChangeListener(PropertyChangeListener listener):
注销属性改变监听器。
E8255Chip类采用JavaBean组件形式封装,该组件能产生属性改变事件PropertyChangeEvent。因为E8255Chip对象能产生 PropertyChangeEvent,同时在 setE8255Areg()、setE8255Breg()和setE8255 Creg()三个方法中都利用firePropertyChange()进行点火操作,firePropertyChange()对所注册的监听器发出一个PropertyChangeEvent,也就是说只要端口的数据改变就通知相应的属性改变事件监听器PropertyChangeListener,在该监听器中的 property Change()方法作相应的处理。
2.2 模拟器设计
每一个实验对应一个模拟器。模拟器仿真执行某一个实验,它充当CPU的角色,负责调配实验所需的软、硬件。软件是指解释程序和用户输入的源程序,而硬件是指虚拟实验平台。模拟器根据用户在虚拟实验平台上的连线,调用解释程序对汇编源程序进行解释来仿真运行结果。
模拟器的设计存在共性和个性的地方,模拟器共性的设计就是一些共享方法和共享类的设计。实现连线操作和源程序的编写方法都属于共性的部分,由一个独立的逻辑类组成的虚拟芯片也属于模拟器共性的部分。实验数据的输入和结果输出部分属于个性的东西。模拟器设计采用继承的方法。共性的东西在基类中实现,属于个性的东西在扩展类中实现。这样的设计既不会使得方法冗余又能满足不同实验的需求。
3 8255输出实验模拟器的实现
8255可编程并行I/O接口芯片作为输出口实验模拟器由基类Simulator.java和扩展类E8255Led Simulator.java 实现[4-5],这个实验的接线原理图如图1所示。8255芯片的A口作为输出口,在工作方式0。A口的输出接到八个LED灯(L0~L7),片选信号CS接地址端口218H-21FH。
图1 8255芯片输出实验接线原理图
3.1 基类(Simulator.java)
基类主要实现跟连线操作、源程序编写有关的功能。基类被设计成一个抽象类,update()和propertyChange()方法被设计成抽象方法,它们在扩展类中必须被超越。Simulator类继承Panel类,实现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):处理属性改变事件
3.2 扩展类(E8255LedSimulator.java)
不同的实验除了采用不同的虚拟硬件之外,它们的数据输入和结果输出也不同,有的实验需要从键盘输入数据,有的实验通过拨实验平台上的开关按钮向实验提供输入数据。有些实验的结果是输出到屏幕上,而有些实验是通过二极管灯显示实验的结果。所以对扩展类的设计主要是对这些方法进行编写。
扩展类继承了基类所定义的所有实例变量和方法。而且可以定义它自己特有的元素。那么在E8255LedSimulator类中除了对Simulator类的抽象方法update()和propertyChange()进行超越之外,还增加了检查硬件连线是否正确的方法Check Line()。而数据成员必须增加该实验所需的虚拟芯片对象。
E8255LedSimulator类通过超越propertyChanger()方法来完成当8255芯片的端口数据改变时所做的事情。因为这个实验是把A口作为输出口,所以在propertyChanger()方法中,根据8255芯片的工作方式把A口的输出送给它的相连端,实现了A口的数据一改变,跟它相连的二极管的数据也相应改变,然后在paint()方法中根据二极管的值点亮或熄灭二极管灯,实现了这个实验的功能。
模拟器调用解释程序对汇编源程序进行解释执行,当执行到out指令时会使端口数据发生改变,从前面介绍的8522虚拟芯片可以知道,端口数据改变就会执行firePropertyChange()方法引发属性改变事件,从而执行E8255LedSimulator类中的propertyChanger()方法。所以在propertyChanger()方法中主要实现跟8255芯片的A、B、C口相连的端口数据的及时改变。也就是说数据端口改变跟它相连的端也要跟着改变,在这个实验中,端口A跟L0~L7灯相连,若向A口送0FFH,则L0~L7灯全亮。
4 结束语
软件模拟实验的实现加上计算机和网络资源的普及为虚拟实验室的开设提供了必要的基础条件。虚拟实验室具有仿真性、实时交互性、共享性、可重用性等特点,能够大大提高学生的动手和创新能力,节约大量的人力和物力,对软件模拟实验的研究有着深远的意义。
[1]Jackson.Johns Hopkins University A VIRTUAL ENGINEERING/SCIENCE LABORATORY[EB/OL].www.jhu.edu/~ virtlab/logic/log_cir.htm.
[2]应时,康立山,陈毓屏,吴霞.基于Java的代码组件重用技术 JavaBeans[J].微电子学与计算机,2000,17(3):1-5.
[3]陆立巧,闵华松,陈奎生.基于组件技术的虚拟仪器开发方法[J].武汉科技大学学报(自然科学版),2002,25(2):240-245.
[4][美]Bruce Eckel.Java编程思想(第二版)[M].候捷,译.北京:机械工业出版社,2002.
[5]Herbert Schildt.James Holmes.the ART of JAVA[M].USA:McGraw - Hill,2003.