基于微程序设计的嵌入式CISCCPU模型的实现.docx
《基于微程序设计的嵌入式CISCCPU模型的实现.docx》由会员分享,可在线阅读,更多相关《基于微程序设计的嵌入式CISCCPU模型的实现.docx(42页珍藏版)》请在冰豆网上搜索。
基于微程序设计的嵌入式CISCCPU模型的实现
计算机硬件实验报告
基于微程序设计的嵌入式CISCCPU模型的实现
学 院:
计算机科学与工程学院
专业:
计算机应用技术
学生姓名:
学号:
指导教师:
2012年3月15日
基于微程序设计的嵌入式CISCCPU模型的实现
一、实验题目
设计一台嵌入式CISC模型计算机(采用单数据总线结构的运算器、定长CPU周期、联合控制方式),并运行能完成一定功能的机器语言程序进行验证,程序功能如下:
连续输入5个有符号整数(8位二进制补码表示,用十六进制数输入),求最大的负数并输出显示。
说明:
①5个有符号数从外部输入,并依次存放在RAM的某一连续的存储区域内;
②一定要使用符号标志位(比如说SF),若涉及到大于、大于等于、小于、小于等于、为负或为正时跳转,等等之类的条件转移指令时,至少要判断符号标志位;
③算术运算类指令要求都采用有符号数的运算,并锁存标志位。
二、嵌入式CISC模型机数据通路框图
三、微程序控制器(CISC模型机)的逻辑结构框图
四、模型机的指令系统和指令格式
指令助记符
指令格式
功能
IN1Rd
1100
××
Rd
将数据存到Rd寄存器
OUT1Rs
1111
Rs
××
(RS)→LED
MOV1data,Rd
0010
××
Rd
DATA→RD
data
MOV2RS,[RD]
0011
RS
RD
RS→[RD]
MOV3[RS],RD
0100
RS
RD
[RS]→RD
MOV4RS,RD
0101
RS
RD
RS→RD
CMPRs,Rd
1001
RS
RD
RS-RD锁存CY和ZI
TESTdata,RD
1010
××
Rd
测试Rd寄存器中的值
data
锁存CY和ZI
INCRd
1011
××
Rd
Rd+1→Rd
JBaddr
1100
××
××
若小于,则addr→PC
data
JZaddr
1101
××
××
若全为零,则addr→PC
Data
五、机器指令的微程序流程图
六、CISC模型机的顶层电路图
七、汇编语言源程序
算法思想为:
R2寄存器初始化为0,R1寄存器初始化为5,R0寄存器存入输入的数据,然后将R0中的数存入以R2寄存器中的数为地址的RAM中,R2寄存器自增一,再和R1寄存器中的数进行比较,如果小于则再输入下一个数,如此循环五次,把输入的五个数存入RAM中。
当R2寄存器中数和R1中相等时,则进入负数判定和负数间的比较。
R2寄存器初始化为0,R0寄存器初始化为80H(即-128)。
把RAM中以R2中的数为地址的的数取出来放在R3中,然后R2自增一,为取下一个数做准备。
接下来测试R3中的数是否为负数,如果不是则跳到L3处,判断是否已经取完了五个数,若取完则输出R0,未取完则跳转到L2,从RAM中取下一个数。
如果是负数,则和R0中的数进行比较。
如果R3中的数比R0中的数小,则跳到L3处进行判断,从RAM中取下一个数或者输出R0,否则将R0中的数替换为R3中的数。
即,每次比较完后R0中都保存的是最大的负数。
接着比较R2与R1,判断是否已经取完了五个数,若R2小于R1则跳转到L2,直到RAM中的数取完为止。
如此循环五次,最后输出R0中的数,即最大的负数。
源程序功能
MOV100,R2将立即数00→R2,用于循环计数
MOV105,R1将立即数05→R1,用于设定最大循环次数
L1:
IN1R0从开关输入任意整数的补码给R0
MOV2R0,[R2]将外部输入数据存到RAM
INCR2
CMPR2,R1比较R2、R1,以确定是否输入5个数据,锁存FC,FZ
JBL1若FC=1且FZ=0,则跳转到L1
MOV100,R2将立即数00→R2,用于循环计数
MOV180H,R0将最小负数的补码给R0
L2:
MOV3[R2],R3取RAM中的数据给R3
INCR2
TEST80H,R3测试符号位,锁存FZ
JZL3若为R3内正数则跳转到L3
CMPR3,R0比较R3、R0,选取较大的负数
JBL3若FC=1且FZ=0,则跳转到L3
MOV4R3,R0将较大的负数送给R0
L3:
CMPR2,R1比较R2、R1,以确定是否输入5个数据,锁存FC,FZ
JBL2若FC=1且FZ=0,则跳转到L2
OUT1R0输出最大的负数
八、机器语言源程序
助记符地址机器代码功能
MOV100,R2000010001000→R2
0100000000
MOV105,R1020010000105→R2
0300000101
L1:
IN1R00410000000SW→R0
MOV2R0,[R2]0500110010R0→[R2]
INCR20610110010(R2)+1→R2
CMPR2,R10710011001(R2)-(R1),锁存FC,FZ
JBL10811000000若小于,则跳转到L1
0900000100
MOV100,R20A0010001000→R2
0B00000000
MOV180H,R00C0010000080H→R0
0D10000000
L2:
MOV3[R2],R30E01001011[R2]→R3
INCR20F10110010(R2)+1→R2
TEST80H,R31010100011测试符号位,锁存FZ
JZL31211010000若FZ为零,则跳转到L3
1300011000
CMPR3,R01410010011(R3)-(R0),锁存FC,FZ
JBL31511000000若小于,则跳转到L3
1600011000
MOV4R3,R01701011100(R3)→(R0)
L3:
CMPR2,R11810011001(R2)-(R1),锁存FC,FZ
JBL21911000000若小于,则跳转到L2
1A00001110
OUT1R01B11110000RO→LED
九、微命令格式和微指令代码表
(1)设计微指令格式和微指令代码表
CISC模型机系统使用的微指令采用全水平型微指令,字长为30位,其中微命令字段为24位,P字段为3位,后继微地址为6位,其格式如下:
29
28
27
26
25
24
23
22
21
20
19
18
17
RAM_B
RAM_CS
RAM_WR
PC_B
LOAD
LDPC
LDAR
LDIR
LDRi
RD_B
RS_B
S1
S0
16
15
14
13
12
11
10
09
08
07
06
ALU_B
LDAC
LDDR
WR
CS
SW_B
LED_B
LDFR
P1
P2
P3
由微指令格式和微程序流程图编写的微指令代码表如下所示:
地址微命令字段P字段后继微地址
000000110011100110010011110000000001
000001110010010110010010110100000000
000010110011100110010011110000010010
000011110110100010010011110000010011
000100110110100100010011110000010100
000101110010001100010011110000000000
001000110010001110011111010000000000
001001110010000100011011110000010110
001010110010000010011011110000010101
001011110010000010011011110000011000
001100110011100110010011110010100000
001101110011100110010011110001010001
001111110010000100010001100000000000
010010110010001110010010110000000000
010011100010000100010011110000000000
010100001010001010010011110000000000
010101110010000111110011111000000000
010110110010001010010111110000010111
010111110010000110110011111000000000
011000110010001111000011110000000000
010001110001000110010010110000000000
100000110001000110010010110000000000
110001110010000110010011110000000000
110000110010000110010011110000000000
(2)设计地址转移逻辑电路
地址转移逻辑电路是根据微程序流程图中的棱形框部分及多个分支微地址,利用微地址寄存器的异步置“1”端,实现微地址的多路转移。
由于微地址寄存器中的触发器异步置“1”端低电平有效,与µA5~µA0对应的异步置“1”控制信号SE6~SE1的逻辑表达式为:
SE6<=NOT((NOTFZ)ANDP3ANDT4);
SE5<=NOT((NOTFCORFZ)ANDP2ANDT4);
SE4<=NOT(I7ANDP1ANDT4);
SE3<=NOT(I6ANDP1ANDT4);
SE2<=NOT(I5ANDP1ANDT4);
SE1<=NOT(I4ANDP1ANDT4);
说明:
①上述逻辑表达式的含义:
在进行P
(1)测试时,根据指令操作码I7、I6、I5、I4进行16路分支;在进行P
(2)测试时,根据状态标志FC和FZ进行2路分支。
在进行P(3)测试时,根据状态标志FZ进行2路分支。
②地址转移逻辑电路中异步置“1”信号SE6~SE1表达式的确定与P字段测试时转移微地址的确定密切相关;
十、仿真波形图及其分析
执行MOV100,R2执行MOV105,R1IN1R0,将数据存入R0
程序计数器PC的初值为0,往后实现加1计数或实现程序转移MOV2R0,[R2],将数据存入RAM中
取址微指令的微地址
PC未在0A的基础上加一,而是被JBL1指令成功的修改成地址04(标号L1的地址)
INCR2CMPR2,R1,是否输入了5个数IN1R0,循环输入下一个数,共5个数
JBL1,循环输入5个数,存入RAM
执行MOV100,R2和MOV180H,R0初始化R0,R2
执行MOV3[R2],R3,取RAM中的数据给R3INCR2
执行TEST80H,R3,测试符号位执行JZL3,根据Z标志位判断是否跳转
执行CMPR3,R0,比较R3,R0的大小,锁存Z、C标志位
执行JBL3,根据Z、C标志位判断是否跳转
执行CMPR2,R1,是否输入了5个数
执行MOV4R3,R0,将较大的负数存入R0执行JBL2和MOV3[R2],R3,取RAM中下一个数
执行OUT1R0,输出最大的负数
通过这次实验课程,使我对计算机的工作原理和流程有了更加深刻的认识,同时也巩固了我以前所学的汇编语言。
这次实验课程让我真正理解硬件的工作原理,多了一种看待问题的角度;我也发现了我所学知识的许多漏洞,需要我在今后的学习中不断弥补。
在老师讲完理论后,我首先把书中的各章节通读了一遍,对各个器件的结构、及整个嵌入式CISC模型机的结构以及MAX+plusII有了个大概的了解,为实现更复杂的功能打下来了基础。
在调试书上的例子时对嵌入式CISC模型机的工作原理有了进一步的理解。
在接下来的一个星期里,在课本上的例子的基础上进行改动,增加了一个P(3)测试、一个寄存器和RAM。
首先写好汇编程序,在草稿纸上绘出系统结构。
然后根据汇编及系统基本结构画微程序流程图、设计微指令。
最后是进行仿真和调试。
在整个过程中,仿真和调试花了最多的时间。
根据波形图,找出出现错误的地方,最初调试时,由于对调试方法不太熟悉,不知道该从何处下手。
后来,通过跟同学讨论,慢慢掌握了调试的基本方法。
随着一个个错误的解决,自己也慢慢的积累了一套调试程序的方法:
1、检查一下电路图;2、检查汇编程序是否正确;3、汇编的机器代码是否与汇编程序对应;4、微命令的控制信号对不对。
按照这个顺序下来,基本上都能把问题解决。
这些错误大部分都是一些很低级的错误,比如将IR和DR寄存器控制信号接反了,直接导致PC加到01后就不再加一;做比较运算时由于粗心大意将源寄存器与目标寄存器写反,导致循环出错;将汇编语言转换成机器语言时又将寄存器代码搞混。
这些错误在设计时认真一些,多检查一遍,完全可以避免后期调试时大量时间的耗费。
最后,要多和老师和同学交流,也许让你焦头烂额的问题,在别人眼里其实是一个很简单的问题。
经过近近两周的努力,终于将此次设计成功完成,实现了题目所要求的所有功能。
在实践的过程中,我对计算机体系结构有了一定的理解,尤其是加深了我对计算机硬件的理解,但是也使得我更加深刻的发现了自己的不足,还要更加努力的学习。
本程序虽然完成了预期所要求的基本功能,但还有很多需要完善的地方,比如在标志位的选择上,本以为在比较时符号标志位与Z标志位可以共用,后来经过老师提示发现如果TEST与CMP共用Z标志位的话JB跳转只能与CMP合用,而JZ跳转只能与TEST指令合用,一旦混用就会出现错误。
这使我认识到了自己在软件设计、开发上的不足。
软件的前期设计不充分和顶层电路图不合理的布局让我在后期修改代码和扩展功能时遇到了意想不到的困难。
虽然本次课程设计还有如此种种的不足,但是我仍然受益匪浅。
1.运算器和状态条件寄存器单元
运算器由算术逻辑运算单元ALU、两个暂存寄存器和状态条件寄存器组成。
算术逻辑运算单元可执行满足题目要求的三种运算,如下面的表中所示;暂存寄存器由累加器AC和数据寄存器DR组成;状态条件寄存器用来在进行比较运算时锁存借位标志(FC/CY)和零标志(FZ/ZI)。
ALU单元的功能表
S1S0功能
01(AC)-(DR),锁存FC和FZ
10(AC)+1
1180H&&(AC),锁存FZ
(1)ALU单元
VHDL源程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYALUIS
PORT(
A:
INSTD_LOGIC_VECTOR(7DOWNTO0);
B:
INSTD_LOGIC_VECTOR(7DOWNTO0);
S1,S0:
INSTD_LOGIC;
BCDOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
CY,ZI:
OUTSTD_LOGIC
);
ENDALU;
ARCHITECTUREAOFALUIS
SIGNALAA,BB,TEMP0:
STD_LOGIC_VECTOR(8DOWNTO0);
SIGNALTEMP1:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
PROCESS(S1,S0)
BEGIN
IF(S1='0'ANDS0='1')THEN
BCDOUT<=A-B;
IF(A
CY<='1';
ZI<='0';
ELSIF(A=B)THEN
CY<='0';
ZI<='1';
ELSE
CY<='0';
ZI<='0';
ENDIF;
ELSIF(S1='1'ANDS0='0')THEN
BCDOUT<=A+1;
ELSIF(S1='1'ANDS0='1')THEN
TEMP1<="10000000"ANDA;
BCDOUT<=TEMP1(7DOWNTO0);
IF(TEMP1="0000000")THEN
ZI<='1';
ELSE
ZI<='0';
ENDIF;
ELSE
BCDOUT<="00000000";
CY<='0';
ZI<='0';
ENDIF;
ENDPROCESS;
ENDA;
(2)状态条件寄存单元LS74
VHDL源程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYLS74IS
PORT(
LDFR:
INSTD_LOGIC;
CY,ZI:
INSTD_LOGIC;
FC,FZ:
OUTSTD_LOGIC
);
ENDLS74;
ARCHITECTUREAOFLS74IS
BEGIN
PROCESS(LDFR)
BEGIN
IF(LDFR'EVENTANDLDFR='1')THEN
FC<=CY;
FZ<=ZI;
ENDIF;
ENDPROCESS;
ENDA;
(3)暂存寄存器单元LS273
VHDL源程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYLS273IS
PORT(
D:
INSTD_LOGIC_VECTOR(7DOWNTO0);
CLK:
INSTD_LOGIC;
O:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDLS273;
ARCHITECTUREAOFLS273IS
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
O<=D;
ENDIF;
ENDPROCESS;
ENDA;
2.通用寄存器单元LS273
4个通用寄存器(R0、R1、R2、R3)以及ALU输出的外部控制信号如下表中所示:
R0_BR1_BR2_BR3_BALU_B功能
01111输出(R0)
10111输出(R1)
11011输出(R2)
11101输出(R3)
11110输出ALU
VHDL源程序同暂存寄存器单元LS273
3.地址寄存器单元LS273
VHDL源程序同暂存寄存器单元LS273
4.指令寄存器单元LS273
VHDL源程序同暂存寄存器单元LS273
5.1:
2分配器FEN2
1:
2分配器用来将ALU的运算结果或通用寄存器的内容经4选1多路选择器送到数据总线,或者将ALU的运算结果或通用寄存器的内容送往输出设备显示。
功能如下表所示。
输入输出
WRLED_BX[7..0]W1[7..0]W2[7..0]
00×X[7..0]
其他取值×X[7..0]
VHDL源程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYFEN2IS
PORT(
WR,LED_B:
INSTD_LOGIC;
X:
INSTD_LOGIC_VECTOR(7DOWNTO0);
W1,W2:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDFEN2;
ARCHITECTUREAOFFEN2IS