各模块说明文档.docx
《各模块说明文档.docx》由会员分享,可在线阅读,更多相关《各模块说明文档.docx(18页珍藏版)》请在冰豆网上搜索。
各模块说明文档
此文档为模型计算机的电路说明文档。
共分为四个部分。
具体如下:
第一部分:
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的代码,经验证可正确写入及读出。
1.AT89C51部分
2.微程序存储写入部分
3.存储器写入部分
4.代码部分
具体代码如下:
#include"reg51.h"
sbitOE=P2^7;//控制微控器里三个6116(RAM)的输出
sbitWE=P2^6;//控制微控器里三个6116(RAM)的写入
sbitCS2=P2^5;//控制微控器里三个6116(RAM)的片选
sbitCS1=P2^4;
sbitCS0=P2^3;
sbitt=P2^2;//给微地址寄存器写入地址提供时序信号
sbitWE_RAM=P2^1;//为主存储器提供写允许信号
sbitLDRAM=P2^0;//给主存储器写入地址或数据的74LS245的允许信号
sbittr=P1^7;//为主存储器提供地址的74LS273的时序信号
#definen100//用于提供延时的变量
voiddelay(void)//延时功能函数
{
chari,j;
for(i=0;ifor(j=0;j{}
}
voidinit(void)//初始化函数
{
OE=1;
WE=1;
CS2=1;
CS1=1;
CS0=1;
WE_RAM=1;
LDRAM=1;
t=0;
}
voidmain(void)
{
charc2[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};
//微程序的高八位数据
charc1[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};
//微程序的中八位数据
charc0[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};
//微程序的低八位数据
charram[11]={0x00,0x10,0x0a,0x20,0x0b,0x30,0x0b,0x40,0x00,0x00,0x01};
//主存储器里的数据及指令
chari;
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,便可运行。
第四部分:
时序及控制
下图为时序的部分控制电路:
单步执行与连续执行的开关定义,如图