CPU模型机的设计Proteus仿真附件包含DSN电路图和各部分单元的文档说明
首先打开NEWest.DSN。在AT89C51器件上双击,在Program File: 路径选中该文件夹中的new.hex文件。然后可以按仿真开始按钮。大概经过5~10秒程序写入完毕。然后将一些开关拨回。即将SW15,SW18,SW10,SW9拨至右边。SW14拨至上边。和U41连接的LOGICSTATE拨为0,和U45连接的LOGICSTATE拨至1。然后可以按动START上的LOGICSTATE。整个系统开始运行。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
此文档为模型计算机的电路说明文档。共分为四个部分。具体如下:
第一部分:ALU,PC及I/O部分
1.PC(74LS161) 图 X-1 图X-2
2.存储器(6116)
3.寄存器(74LS374)
4.ALU(74LS181)
5.I/O部分
第二部分:微控制部分
1.控制台转移
2.地址转移
3.微地址输入
4.微命令输入 5.微控制输出 U38,U39,U40为3个3-8译码器,E1,E2,E3为1,0,0。输入端为A,B,C字段,译码的情况如下:
第三部分:自动输入 本系统若使用开关拨代码及微程序,则由于数据量较多且容易拨错,致使调试效率低下。因此用一个AT89C51来自动写入代码及微程序,省却拨动开关的时间。下面是具体电路及写入51的代码,经验证可正确写入及读出。
2.微程序存储写入部分
3.存储器写入部分
4.代码部分 具体代码如下: - #include "reg51.h"
-
- sbit OE =P2^7; //控制微控器里三个6116(RAM)的输出
- sbit WE =P2^6; //控制微控器里三个6116(RAM)的写入
- sbit CS2=P2^5; //控制微控器里三个6116(RAM)的片选
- sbit CS1=P2^4;
- sbit CS0=P2^3;
- sbit t=P2^2; //给微地址寄存器写入地址提供时序信号
- sbit WE_RAM=P2^1; //为主存储器提供写允许信号
- sbit LDRAM=P2^0; //给主存储器写入地址或数据的74LS245的允许信号
- sbit tr=P1^7; //为主存储器提供地址的74LS273的时序信号
-
- #define n 100 //用于提供延时的变量
- void delay(void) //延时功能函数
- {
- char i,j;
- for(i=0;i<n;i++)
- for(j=0;j<n;j++)
- {}
- }
- void init(void) //初始化函数
- {
- OE=1;
- WE=1;
- CS2=1;
- CS1=1;
- CS0=1;
- WE_RAM=1;
- LDRAM=1;
- t=0;
- }
- void main(void)
- {
- char c2[25]= {0x01,0x01,0x00,0x00,0x00,0x01,0x95,0x00,0x00,0x01,0x01,
- 0x01,0x01,0x02,0x00,0x00,0x01,0x01,0x00,0x01,0x00,0x07,0x00,0x07,0x06};
- //微程序的高八位数据
- char c1[25]= {0x81,0xed,0xc0,0xe0,0xb0,0xa2,0x9a,0xe0,0x10,0xed,0xed,
- 0xed,0xed,0x82,0xe0,0xa0,0xed,0xed,0xa0,0x80,0x20,0x0a,0xd1,0x0a,0x8a};
- //微程序的中八位数据
- char c0[25]= {0x10,0x82,0x48,0x04,0x05,0x06,0x01,0x0d,0x01,0x83,0x87,
- 0x8e,0x96,0x01,0x0f,0x15,0x92,0x94,0x17,0x01,0x18,0x01,0x81,0x10,0x11};
- //微程序的低八位数据
-
- char ram[11]={0x00,0x10,0x0a,0x20,0x0b,0x30,0x0b,0x40,0x00,0x00,0x01};
- //主存储器里的数据及指令
- char i;
-
- init();
- WE=0;
- for(i=0;i<=24;i++)
- {
- P1=i; //P1口用来提供微程序地址
- t=!t; //微地址寄存器的时序信号
-
- P0=c2[i]; //P0口用来提供微程序,先提供高八位程序
- CS2=0; //选中高八位的存储器
- delay(); //延时
- CS2=1; //片选无效
-
- P0=c1[i];
- CS1=0; //选中中八位存储器
- delay();
- CS1=1; //片选无效
-
- P0=c0[i];
- CS0=0; //选中低八位存储器
- delay();
- CS0=1; //片选无效
- t=!t;
- }
-
- WE=1;
- CS2=0;
- CS1=0;
- CS0=0;
- OE=0;
-
- P0=0x00; //置微地址为0x00
-
- for(i=0;i<25;i++) //显示微程序数据,用来检查是否输入有误
- {
- P1=i;
- t=!t;
-
- t=!t;
- delay();
- }
-
- P1=0x01;
- t=!t;
- t=!t;
- delay();
-
- LDRAM=0;
- tr=0;
- for(i=0;i<11;i++)
- {
- P3=i; //提供主存储器地址
-
- tr=!tr;
- tr=!tr; //将地址写入地址寄存器
- P3=ram[i]; //提供主存储器数据或指令
-
- WE_RAM=0; //主存储器写有效
- delay();
- WE_RAM=1;
-
- }
- P3=0x00;
- tr=!tr;
- tr=!tr;
-
- LDRAM=1;
- while(1){}
- }
复制代码
此代码在Keil μVersion2中编译为*.hex文件,然后加载到Proteus中的AT89C51,便可运行。
第四部分:时序及控制
下图为时序的部分控制电路:
单步执行与连续执行的开关定义,如图
全部资料51hei下载地址: 参考设计:http://www.51hei.com/bbs/dpj-181762-1.html
|