1、基于微程序设计的嵌入式CISCCPU模型的实现计算机硬件实验报告基于微程序设计的嵌入式CISC CPU模型的实现学院: 计算机科学与工程学院 专 业: 计算机应用技术 学生姓名: 学 号: 指导教师: 2012年3 月15 日基于微程序设计的嵌入式CISC CPU模型的实现一、实验题目 设计一台嵌入式CISC模型计算机(采用单数据总线结构的运算器、定长CPU周期、联合控制方式),并运行能完成一定功能的机器语言程序进行验证,程序功能如下: 连续输入5个有符号整数(8位二进制补码表示,用十六进制数输入),求最大的负数并输出显示。 说明:5个有符号数从外部输入,并依次存放在RAM的某一连续的存储区域
2、内; 一定要使用符号标志位(比如说SF),若涉及到大于、大于等于、小于、小于等于、为负或为正时跳转,等等之类的条件转移指令时,至少要判断符号标志位; 算术运算类指令要求都采用有符号数的运算,并锁存标志位。二、嵌入式CISC模型机数据通路框图三、微程序控制器(CISC模型机)的逻辑结构框图四、模型机的指令系统和指令格式指令助记符指令格式功能IN1 Rd1100Rd将数据存到Rd寄存器OUT1 Rs1111Rs(RS)LEDMOV1 data,Rd0010RdDATARDdataMOV2 RS,RD0011RSRDRSRDMOV3 RS,RD0100RSRDRSRDMOV4 RS,RD0101RS
3、RDRSRDCMP Rs,Rd1001RSRDRS-RD 锁存CY和ZITEST data,RD1010Rd测试Rd寄存器中的值data锁存CY和ZIINC Rd1011RdRd+1RdJB addr1100若小于,则addrPCdataJZ addr1101若全为零,则addrPCData五、机器指令的微程序流程图六、CISC模型机的顶层电路图七、汇编语言源程序算法思想为:R2寄存器初始化为0,R1寄存器初始化为5,R0寄存器存入输入的数据,然后将R0中的数存入以R2寄存器中的数为地址的RAM中,R2寄存器自增一,再和R1寄存器中的数进行比较,如果小于则再输入下一个数,如此循环五次,把输入的
4、五个数存入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,判断是
5、否已经取完了五个数,若R2小于R1则跳转到L2,直到RAM中的数取完为止。如此循环五次,最后输出R0中的数,即最大的负数。源程序 功能MOV1 00,R2 将立即数00R2,用于循环计数MOV1 05,R1 将立即数05R1,用于设定最大循环次数L1: IN1 R0 从开关输入任意整数的补码给R0 MOV2 R0,R2 将外部输入数据存到RAM INC R2 CMP R2,R1 比较R2、R1,以确定是否输入5个数据,锁存FC,FZ JB L1 若FC=1且FZ=0,则跳转到L1 MOV1 00,R2 将立即数00R2,用于循环计数MOV1 80H,R0 将最小负数的补码给R0L2: MOV3
6、 R2,R3 取RAM中的数据给R3 INC R2 TEST 80H,R3 测试符号位,锁存FZ JZ L3 若为R3内正数则跳转到L3 CMP R3,R0 比较R3、R0,选取较大的负数 JB L3 若FC=1且FZ=0,则跳转到L3 MOV4 R3,R0 将较大的负数送给R0L3: CMP R2,R1 比较R2、R1,以确定是否输入5个数据,锁存FC,FZ JB L2 若FC=1且FZ=0,则跳转到L2 OUT1 R0 输出最大的负数八、机器语言源程序助记符 地址 机器代码 功能MOV1 00,R2 00 00100010 00R2 01 00000000 MOV1 05,R1 02 00
7、100001 05R2 03 00000101L1: IN1 R0 04 10000000 SWR0 MOV2 R0,R2 05 00110010 R0R2 INC R2 06 10110010 (R2)+1R2 CMP R2,R1 07 10011001 (R2)-(R1),锁存FC,FZ JB L1 08 11000000 若小于,则跳转到L1 09 00000100 MOV1 00,R2 0A 00100010 00R2 0B 00000000 MOV1 80H,R0 0C 00100000 80HR0 0D 10000000L2: MOV3 R2,R3 0E 01001011 R2 R
8、3 INC R2 0F 10110010 (R2)+1R2 TEST 80H,R3 10 10100011 测试符号位,锁存FZ JZ L3 12 11010000 若FZ为零,则跳转到L3 13 00011000 CMP R3,R0 14 10010011 (R3)-(R0),锁存FC,FZ JB L3 15 11000000 若小于,则跳转到L3 16 00011000 MOV4 R3,R0 17 01011100 (R3)(R0)L3: CMP R2,R1 18 10011001 (R2)-(R1),锁存FC,FZ JB L2 19 11000000 若小于,则跳转到L2 1A 0000
9、1110 OUT1 R0 1B 11110000 ROLED九、微命令格式和微指令代码表(1)设计微指令格式和微指令代码表CISC模型机系统使用的微指令采用全水平型微指令,字长为30位,其中微命令字段为24位,P字段为3位,后继微地址为6位,其格式如下:29282726252423222120191817RAM_BRAM_CSRAM_WRPC_BLOADLDPCLDARLDIRLDRiRD_BRS_BS1S01615141312111009080706ALU_BLDACLDDRWRCSSW_BLED_BLDFRP1P2P3由微指令格式和微程序流程图编写的微指令代码表如下所示:地址 微命令字段
10、P字段 后继微地址 000000 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 000001 000001 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 0 000000 000010 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 010010 000011 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 0 0 010011 000100 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1
11、 1 1 0 0 0 0 010100 000101 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 000000 001000 1 1 0 0 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 1 0 0 0 0 000000 001001 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 010110 001010 1 1 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 1 1 1 0 0 0 0 010101 001011 1 1 0 0 1 0 0 0 0 0 1 0 0
12、 1 1 0 1 1 1 1 0 0 0 0 011000001100 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 1 0 100000 001101 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 010001 001111 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 000000 010010 1 1 0 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 000000 010011 1 0 0 0 1 0 0 0
13、0 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 000000 010100 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 1 1 0 0 0 0 000000 010101 1 1 0 0 1 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 000000 010110 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 0 0 010111 010111 1 1 0 0 1 0 0 0 0 1 1 0 1 1 0 0 1 1 1 1 1 0 0 0 000000 011000 1 1 0
14、0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 000000 010001 1 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 000000 100000 1 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 000000 110001 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 000000 110000 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 000000 (2)
15、设计地址转移逻辑电路地址转移逻辑电路是根据微程序流程图中的棱形框部分及多个分支微地址,利用微地址寄存器的异步置“1”端,实现微地址的多路转移。由于微地址寄存器中的触发器异步置“1”端低电平有效,与A5A0对应的异步置“1”控制信号SE6SE1的逻辑表达式为: SE6=NOT(NOT FZ) AND P3 AND T4);SE5=NOT(NOT FC OR FZ)AND P2 AND T4);SE4=NOT(I7 AND P1 AND T4);SE3=NOT(I6 AND P1 AND T4);SE2=NOT(I5 AND P1 AND T4);SE1=NOT(I4 AND P1 AND T4)
16、;说明:上述逻辑表达式的含义:在进行P(1)测试时,根据指令操作码I7、I6、I5、I4进行16路分支;在进行P(2)测试时,根据状态标志FC和FZ进行2路分支。在进行P(3)测试时,根据状态标志FZ进行2路分支。地址转移逻辑电路中异步置“1”信号SE6SE1表达式的确定与P字段测试时转移微地址的确定密切相关;十、仿真波形图及其分析 执行MOV1 00,R2 执行MOV1 05,R1 IN1 R0,将数据存入R0 程序计数器PC的初值为0,往后实现加1计数或实现程序转移 MOV2 R0,R2,将数据存入RAM中取址微指令的微地址 PC未在0A的基础上加一,而是被JB L1指令成功的修改成地址0
17、4(标号L1的地址) INC R2 CMP R2,R1,是否输入了5个数 IN1 R0,循环输入下一个数,共5个数 JB L1,循环输入5个数,存入RAM 执行MOV1 00,R2和MOV1 80H,R0 初始化R0,R2 执行MOV3 R2,R3,取RAM中的数据给R3 INC R2执行TEST 80H,R3,测试符号位 执行JZ L3,根据Z标志位判断是否跳转 执行CMP R3,R0,比较R3,R0的大小,锁存Z、C标志位执行JB L3,根据Z、C标志位判断是否跳转执行CMP R2,R1,是否输入了5个数执行MOV4 R3,R0,将较大的负数存入R0 执行JB L2和MOV3 R2,R3,
18、取RAM中下一个数 执行OUT1 R0,输出最大的负数通过这次实验课程,使我对计算机的工作原理和流程有了更加深刻的认识,同时也巩固了我以前所学的汇编语言。这次实验课程让我真正理解硬件的工作原理,多了一种看待问题的角度;我也发现了我所学知识的许多漏洞,需要我在今后的学习中不断弥补。在老师讲完理论后,我首先把书中的各章节通读了一遍,对各个器件的结构、及整个嵌入式CISC模型机的结构以及MAX+plus II有了个大概的了解,为实现更复杂的功能打下来了基础。在调试书上的例子时对嵌入式CISC模型机的工作原理有了进一步的理解。在接下来的一个星期里,在课本上的例子的基础上进行改动,增加了一个P(3)测试
19、、一个寄存器和RAM。首先写好汇编程序,在草稿纸上绘出系统结构。然后根据汇编及系统基本结构画微程序流程图、设计微指令。最后是进行仿真和调试。在整个过程中,仿真和调试花了最多的时间。根据波形图,找出出现错误的地方,最初调试时,由于对调试方法不太熟悉,不知道该从何处下手。后来,通过跟同学讨论,慢慢掌握了调试的基本方法。随着一个个错误的解决,自己也慢慢的积累了一套调试程序的方法:1、检查一下电路图;2、检查汇编程序是否正确;3、汇编的机器代码是否与汇编程序对应;4、微命令的控制信号对不对。按照这个顺序下来,基本上都能把问题解决。这些错误大部分都是一些很低级的错误,比如将IR和DR寄存器控制信号接反了
20、,直接导致PC加到01后就不再加一;做比较运算时由于粗心大意将源寄存器与目标寄存器写反,导致循环出错;将汇编语言转换成机器语言时又将寄存器代码搞混。这些错误在设计时认真一些,多检查一遍,完全可以避免后期调试时大量时间的耗费。最后,要多和老师和同学交流,也许让你焦头烂额的问题,在别人眼里其实是一个很简单的问题。经过近近两周的努力,终于将此次设计成功完成,实现了题目所要求的所有功能。 在实践的过程中,我对计算机体系结构有了一定的理解,尤其是加深了我对计算机硬件的理解,但是也使得我更加深刻的发现了自己的不足,还要更加努力的学习。本程序虽然完成了预期所要求的基本功能,但还有很多需要完善的地方,比如在标
21、志位的选择上,本以为在比较时符号标志位与Z标志位可以共用,后来经过老师提示发现如果TEST与CMP共用Z标志位的话JB跳转只能与CMP合用,而JZ跳转只能与TEST指令合用,一旦混用就会出现错误。这使我认识到了自己在软件设计、开发上的不足。软件的前期设计不充分和顶层电路图不合理的布局让我在后期修改代码和扩展功能时遇到了意想不到的困难。虽然本次课程设计还有如此种种的不足,但是我仍然受益匪浅。1.运算器和状态条件寄存器单元运算器由算术逻辑运算单元ALU、两个暂存寄存器和状态条件寄存器组成。算术逻辑运算单元可执行满足题目要求的三种运算,如下面的表中所示;暂存寄存器由累加器AC和数据寄存器DR组成;状
22、态条件寄存器用来在进行比较运算时锁存借位标志(FC/CY)和零标志(FZ/ZI)。ALU单元的功能表 S1 S0 功能 0 1 (AC)-(DR),锁存FC和FZ 1 0 (AC)+11 1 80H&(AC), 锁存FZ(1)ALU单元VHDL源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ALU ISPORT( A:IN STD_LOGIC_VECTOR(7 DOWNTO 0); B:IN STD_LOGIC_V
23、ECTOR(7 DOWNTO 0); S1,S0:IN STD_LOGIC; BCDOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); CY,ZI:OUT STD_LOGIC );END ALU;ARCHITECTURE A OF ALU ISSIGNAL AA,BB,TEMP0:STD_LOGIC_VECTOR(8 DOWNTO 0);SIGNAL TEMP1:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN PROCESS(S1,S0) BEGIN IF(S1=0 AND S0=1)THEN BCDOUT=A-B; IF(AB)THEN CY=1
24、; ZI=0; ELSIF(A=B)THEN CY=0; ZI=1; ELSE CY=0; ZI=0; END IF; ELSIF(S1=1AND S0=0)THEN BCDOUT=A+1; ELSIF(S1=1AND S0=1)THEN TEMP1=10000000AND A; BCDOUT=TEMP1(7 DOWNTO 0); IF(TEMP1=0000000)THEN ZI=1; ELSE ZI=0; END IF; ELSE BCDOUT=00000000; CY=0; ZI=0; END IF; END PROCESS;END A;(2)状态条件寄存单元LS74VHDL源程序如下:L
25、IBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LS74 ISPORT( LDFR:IN STD_LOGIC; CY,ZI:IN STD_LOGIC; FC,FZ:OUT STD_LOGIC );END LS74;ARCHITECTURE A OF LS74 ISBEGIN PROCESS(LDFR) BEGIN IF(LDFREVENT AND LDFR=1)THEN FC=CY; FZ=ZI; END IF; END PROCESS;END A;(3)暂存寄存器单元LS273VHDL源程序如下:LIBRARY IEEE;USE IEEE.STD
26、_LOGIC_1164.ALL;ENTITY LS273 ISPORT( D:IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLK:IN STD_LOGIC; O:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END LS273;ARCHITECTURE A OF LS273 ISBEGIN PROCESS(CLK) BEGIN IF(CLKEVENT AND CLK=1)THEN O=D; END IF; END PROCESS;END A;2.通用寄存器单元LS2734个通用寄存器(R0、R1、R2、R3)以及ALU输出的外部控制信号如下表中所示
27、:R0_B R1_B R2_B R3_B ALU_B 功能 0 1 1 1 1 输出(R0) 1 0 1 1 1 输出(R1) 1 1 0 1 1 输出(R2) 1 1 1 0 1 输出(R3) 1 1 1 1 0 输出ALUVHDL源程序同暂存寄存器单元LS2733.地址寄存器单元LS273VHDL源程序同暂存寄存器单元LS2734.指令寄存器单元LS273VHDL源程序同暂存寄存器单元LS2735.1:2分配器FEN21:2分配器用来将ALU的运算结果或通用寄存器的内容经4选1多路选择器送到数据总线,或者将ALU的运算结果或通用寄存器的内容送往输出设备显示。功能如下表所示。 输入 输出 WR LED_B X7.0 W17.0 W27.0 0 0 X7.0 其他取值 X7.0 VHDL源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FEN2 ISPORT( WR,LED_B:IN STD_LOGIC; X:IN STD_LOGIC_VECTOR(7 DOWNTO 0); W1,W2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END FEN2;ARCHITECTURE A OF FEN2 IS
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1