VC++数字逻辑电子仿真器设计
这是我毕业设计时做的,主要参考的是:Electronics Workbench这个软件。(图标都是偷他的☺ )时间有限,我只做了逻辑门,触发器没做。其它储如线性电路,非线性电路。由于我电子学得巨菜,且从小就深恶痛绝中。没办法做。还有,元件的移动,删除,新建,保存,都没时间做了,现在正考研复习中。
本程序用VC++6.0开发,界面如图1: 图1
其输出结果真值表如图2:
图2
程序由几个大模块组成:元件数据结构模块,电路图编辑模块,元件库模块,计算结果(仿真)模块。
元件数据结构模块
统一的元件数据结构可以提高程序运行速度,方便程序编制。不足是由于元件的不同存储空间上可能会有少许浪费。
所有的元件种类共有8种,如图3
图3 定义数据结构如下:
typedef struct tagMyNode
{
Mytype type; //元件类型
MySubtype Subtype; //元件子类型
tagMyNode* input1; //输入端1
tagMyNode* input2; //输入端1
tagMyNode* output1; //输出端1
UINT input1value; //输入端input1的值
UINT input2value; //输入端input2的值
UINT output1value; //输出端output1的值
int inputs; //当前已经有几个输入端有值
int number; //对于输入结点的序号
CPoint Orgpoint; //记录元件左上角位置
int width; //记录元件宽度
int height; //记录元件高度
}MyNode; 元件类型:元件类型Mytype type中Mytype是一个枚举类型定义如下:
enum Mytype
{
Node, //结点
Gate, //门
};
分为两种类型:Node结点和Gate门。
元件子类型:元件子类型MySubtype Subtype中MySubtype也是一个枚举类
型,定义如下:
enum MySubtype
{
Input, //输入端
Output, //输出端
ANDGate, //与门
ORGate, //或门
NOTGate, //非门
NORGate, //或非门
NANDGate, //与非门
XORGate, //异或门
}; 指针连接: tagMyNode* input1;
tagMyNode* input2;
tagMyNode* output1
是指向此结点的指针。由于元件之间是要相互连接的,于是设置这几个指针用于元件之间的连接。其中特殊情况有:
非门:由于非门只有一个输入端,所以非门不用tagMyNode* input2;
输入结点:输入结点只有一个链接端(这里称之为触点),采用tagMyNode* output1
输出结点:同输入结点,只有一个触点,采用tagMyNode* input1;
保存触点值:由于要进行仿真计算,所以还需保存各个触点的值:
UINT input1value;
UINT input2value;
UINT output1value;
同指针连接,有3种特殊情况:
非门:不用UINT input2value;
输入结点:采用UINT output1value;
输出结点:采用UINT input1value;
进位标志:int inputs;
在进行仿真计算时,要用进位标志辅助计算。如与门只有在两个输入端都有值时,即inputs==2时,才能进位。
输入结点序号:int number;
每个输入结点都有不同的序号,从1开始递增。
元件位置和大小:
CPoint Orgpoint;
int width;
int height;
Orgpoint用于记录元件在视图中左上角的坐标
width用于记录元件宽度
height用于记录元件高度
电路图编辑模块
电路图编辑模块又分为两个子模块:鼠标放置元件模块,鼠标连接元件模块
首先在工具栏中可以选择这两种状态,如图4
图4在按钮上单击可以切换状态。
定义一个枚举类型MyStatus来记录当前状态:
enum MyStatus
{
NONE, //鼠标连接元件状态
ANDGATE,
ORGATE,
NOTGATE,
NORGATE,
NANDGATE,
XORGATE,
NODEINPUT,
NODEOUTPUT};
MyStatus Status;
其中:NONE为鼠标连接状态,其他为鼠标放置状态。
鼠标放置元件模块
其算法如图5:1216
[1] [2] [3] [4] [5] [6] [7] [8] 下一页