1、8位模型计算机的设计计算机组成原理课程设计报告计算机组成原理课程设计报告题 目 8位模型计算机的设计姓 名 学 号 班 号 指导老师 成 绩 目 录1. 课程设计目的 32. 开发工具选择 33. 方案选择 34指令系统设计 45. 模型机框图设计 56. 指令流程图 67. 微指令格式(微程序控制器)设计 78. 微程序(微程序控制器)设计 79. VHDL实现 910. 调试仿真 1611. 课程设计回顾总结 19参 考 文 献 19附录 191. 课程设计目的 (1)、计算机组成原理课程设计的主要任务是让学生通过动脑和动手解决计算机设计中的实际问题。综合运用所学计算机组成原理知识,在掌握
2、部件单元电路实验的基础上,进一步将其组成系统构造一台基本的模型计算机,掌握整机概念,并设计机器指令系统,编写程序,在所设计的模型计算机上调试运行。(2)、通过一台模型机的设计过程,明确计算机的控制原理与控制过程,巩固和灵活应用所学的理论知识,掌握计算机组成的一般设计方法,提高学生设计能力和实践操作技能,为从事计算机研制与设计打下基础。2. 开发工具选择 以TEC-CA教学实验系统为平台,采用硬件描述语言 VHDL为设计工具,应用QUARTUS5.1环境进行大规模集成电路的功能设计仿真。3. 方案选择 实习的内容为八位模型计算机的设计,为单总线,微程序控制方式,设置两种寻址方式:直接寻址(“0”
3、)和寄存器寻址(“1”)。 微程序控制方式由微指令译码产生。微程序中一条机器指令往往分成几步执行,将每一步操作所需的若干为命令以代码编写在一条微指令中,若干条微指令组成一段微程序,对应一条机器指令。然后根据系统的需要,事先编制各段微程序,将它存入控制存储器(CM)中。微程序执行过程:(1)从控存中逐条取出“取指令操作”,执行取指令公共操作。(2)根据指令的操作码,经过微地址形成部件,得到这条指令的入口地址,并送入微地址寄存器中。(3)从控存中逐条的取出对应的微指令并执行。(4)执行完一条机器指令对应的微程序后又回到取指微程序的入口地址,继续第(1)步,以完成取下一条机器指令的公共操作。 微程序
4、控制基本框图:4. 指令系统设计所要设计的微程序控制器是由七条指令来完成的,即:sta, add, sub, and1, jmp, shl, nop。实现功能分别如下:sta 指令实现存操作;add 指令实现加法操作;sub 指令实现减法操作;and1指令实现与操作; jmp 指令实现无条件跳转操作;shl 指令实现逻辑左移操作;nop 指令实现空操作。 7 5 4 1 0 操作码 寻址方式标志位 模拟机采用了定长的指令格式,每条指令字长为8位。采用的寻址方式为直接寻址和寄存器寻址,标志位为“0”时为直接寻址,为“1”时为寄存器寻址。操作码类型及编码方式如下: 操作码 staaddsuband
5、1jmpshlnop编码方式 000001010011100101110含义 传送加减与跳转逻辑左移空5. 模型机框图设计 模拟机数据通路如下图所示,模型机采用单总线结构,主要包括运部件ALU,以及程序计数器PC、累加器ACC、指令寄存器IR、数据寄存器MDR、地址寄存器MAR和通用寄存器R,RAM为内存。 控制信号 ALU 图2 模拟机数据通路 (1)寄存器的位数 所有的寄存器都均为8位:1通用寄存器R。该模拟机有1个通用寄存器,用于寄存器寻址时存放结果,提供操作数。2指令寄存器IR。为了提高取指令的速度,将指令从内存中读出,经数据总线直接置入IR。3数据寄存器MDR、地址寄存器MAR。地址
6、寄存器MAR提供访问主存的地址;数据寄存器MDR,把从内存取出的数据暂存于MDR中,在用到该数据进行运算时,再从MDR中取出数据进行运算。4程序计数器PC。用于存放下一条指令的内存地址。 (2)总线宽度:该模拟机只有一条总线,且总线宽度为8位。 (3)ALU位数及运算功能 ALU可以实现8位操作数的运算,即ALU的位数为8位。ALU运算功能为: 加(001:add)、减(010:sub)、逻辑与(011:and)、左移(101:shl)、跳转(100:jmp)、 空(110:nop)。 (4)微命令的设置(各标识的含义)6. 指令流程图 指令的流程图如图 3所示,共有 8 条指令,每条指令都要
7、经过取指令、分析指令和执行指令3个步骤。 在取指令阶段,8 条指令是一样的,首先程序计数器PC的内容通过总线送入地址寄存器MAR,存储信息,PC+1传送给PC,把读出的内容传送给指令寄存器IR 。再接下来的操作中,根据不同的指令,执行顺序也不同。7.微指令格式(微程序控制器)设计 微指令格式设计如表1:控 制 信 号描 述ACC_bus用ACC的内容驱动总线load_ACC将总线上的数据载入ACCPC_bus用PC的内容驱动总线load_IR将总线上的数据装载至IRload_MAR将总线上的数据装载至MARMDR_bus用MDR的内容驱动总线ALU_ACC用ALU的结果装载ACCINC_PCP
8、C+1并将结果存至PC中Addr_bus用IR指令中的地址部分驱动总线CS片选。用MAR的内容设置存储器地址R_NW读取,不可写。当R_NW无效且CS有效时,MBR的内容存储于存储器中Reg_bus用寄存器R的内容驱动总线load_Reg将总线上的数据装载至RALU_ADD在ALU中执行逻辑加操作ALU_SUB在ALU中执行减操作ALU_AND在ALU中执行与操作ALU_SHL在ALU中执行左移操作 表2 微指令格式8. 微程序(微程序控制器)设计 根据微处理器的数据通路和指令系统,可得出微程序的流程图如图4所示。微程序的编码采用直接编码方法,每一个控制信号对应一位,共有17个控制信号,根据微
9、指令格式把相关的控制信号整合到一起进行编码。 微程序流程图的下地址,可知共有25条微指令,表2给出了该模拟机微程序的编码。地址3的下地址,应该根据指令操作码来和寻址方式形成,所以将其下地址设为11111,表示如果下地址为11111时,且寻址方式标志位为0(即立即寻址),则下地址应为01 & 指令的操作码,若寻址方式标志位为1(即寄存器寻址),则下地址应为10 & 指令的操作码。该模拟机微程序的编码如下0= 0000010100010000000001 1= 0000000000000110000010 2= 0000001010000000000011 3= 00000001000010000
10、11111 4= 0000000000000110000110 5= 0000000000000110000111 6= 0000100010000000000000 7= 0001000010000000000000 8= 0000000000000000011011 9= 0000000000000000011100 10= 0000000000000000010010 11= 0000000000000000010100 12= 0000000000000000010110 13= 0000000000000000011001 14= 0000000000000110000000 15=
11、 0000000000000110010001 16= 0000000010100001000000 010* 18= 0000000000000110010011 19= 0000000010100000100000 20= 0000000000000110010101 21= 0000000011100000000000 22= 0000000000000110011101 23= 0010000010000000000000 24= 0000000000000000000000 25= 10000000001000000000009. VHDL实现头文件cpu_defs.vhd如下:LI
12、BRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;PACKAGE cpu_defs IS TYPE opcode IS (sta, add, sub, and1, jmp, shl, nop); CONSTANT word_w: NATURAL :=8; CONSTANT op_w: NATURAL :=3; CONSTANT rfill: STD_LOGIC_VECTOR(op_w-1 downto 0):=(others =0); -FUNCTIOn slv2op(slv:IN STD_LOGIC_VECTOR) RETURN opcode; FUNCTION
13、op2slv(op:in opcode) RETURN STD_LOGIC_VECTOR;END PACKAGE cpu_defs;PACKAGE BODY cpu_defs IS TYPE optable IS ARRAY(opcode) OF STD_LOGIC_VECTOR(op_w-1 DOWNTO 0); CONSTANT trans_table:optable :=(000, 001, 010, 011, 100, 101, 110); FUNCTION op2slv(op:IN opcode) RETURN STD_LOGIC_VECTOR IS BEGIN RETURN tra
14、ns_table(op); END FUNCTION op2slv; -function slv2op(slv:in std_logic_vector) return opcode is - variable transop:opcode; - begin - for i in opcode loop - if slv=trans_table(i) then - transop:=i; - end if; - end loop; - return transop; -end function slv2op;END PACKAGE BODY cpu_defs;源程序cpu.vhd如下:LIBRA
15、RY IEEE;USE IEEE.STD_LOGIC_1164.ALL,IEEE.NUMERIC_STD.ALL;USE WORK.CPU_DEFS.ALL;ENTITY CPU ISPORT( clock : IN STD_LOGIC; reset : IN STD_LOGIC; mode : IN STD_LOGIC_VECTOR(2 DOWNTO 0); mem_addr : IN UNSIGNED(word_w-op_w-1 DOWNTO 0); output : OUT STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); data_r_out : OUT STD
16、_LOGIC_VECTOR(21 DOWNTO 0); op_out : OUT STD_LOGIC_VECTOR(op_w-1 DOWNTO 0); add_r_out : OUT UNSIGNED(4 DOWNTO 0) ); END ENTITY;ARCHITECTURE rtl OF CPU IS TYPE mem_array IS ARRAY (0 TO 2*(word_w-op_w)-1) OF STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); SIGNAL mem : mem_array; CONSTANT prog : mem_array:=( 0=op
17、2slv(sta) & STD_LOGIC_VECTOR(TO_UNSIGNED(9,word_w-op_w-1) & 0, 1= op2slv(sta) & STD_LOGIC_VECTOR(TO_UNSIGNED(10,word_w-op_w-1) & 1, 2= op2slv(add) & STD_LOGIC_VECTOR(TO_UNSIGNED(9,word_w-op_w-1) & 1, 3= op2slv(sub) & STD_LOGIC_VECTOR(TO_UNSIGNED(10,word_w-op_w-1) & 0, 4= op2slv(and1) & STD_LOGIC_VEC
18、TOR(TO_UNSIGNED(10,word_w-op_w-1) & 0, 5= op2slv(shl) & STD_LOGIC_VECTOR(TO_UNSIGNED(10,word_w-op_w-1) & 0, 6= op2slv(nop) & STD_LOGIC_VECTOR(TO_UNSIGNED(9,word_w-op_w-1) & 0,7= op2slv(sta) & STD_LOGIC_VECTOR(TO_UNSIGNED(11,word_w-op_w-1) & 0, 8= op2slv(jmp) & STD_LOGIC_VECTOR(TO_UNSIGNED(12,word_w-
19、op_w-1) & 0, 9= STD_LOGIC_VECTOR(TO_UNSIGNED(2,word_w), 10= STD_LOGIC_VECTOR(TO_UNSIGNED(3,word_w), OTHERS = (OTHERS =0); TYPE microcode_array IS ARRAY (0 TO 25) OF STD_LOGIC_VECTOR(21 DOWNTO 0); CONSTANT code : microcode_array:=( 0= 0000010100010000000001, 1= 0000000000000110000010, 2= 000000101000
20、0000000011, 3= 0000000100001000011111, 4= 0000000000000110000110, 5= 0000000000000110000111, 6= 0000100010000000000000, 7= 0001000010000000000000, 8= 0000000000000000011011, 9= 0000000000000000011100, 10= 0000000000000000010010, 11= 0000000000000000010100, 12= 0000000000000000010110, 13= 00000000000
21、00000011001, 14= 0000000000000110000000, 15= 0000000000000110010001, 16= 0000000010100001000000, 17= 0100000000100001000000, 18= 0000000000000110010011, 19= 0000000010100000100000, 20= 0000000000000110010101, 21= 0000000011100000000000, 22= 0000000000000110011101, 23= 0010000010000000000000, 24= 000
22、0000000000000000000, 25= 1000000000100000000000); SIGNAL count : UNSIGNED(word_w-op_w-1 DOWNTO 0); SIGNAL op : STD_LOGIC_VECTOR(op_w-1 DOWNTO 0); SIGNAL z_flag : STD_LOGIC; SIGNAL mdr_out : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); SIGNAL mar_out : UNSIGNED(word_w-op_w-1 DOWNTO 0); SIGNAL IR_out : STD_LO
23、GIC_VECTOR(word_w-1 DOWNTO 0); SIGNAL acc_out : UNSIGNED(word_w-1 DOWNTO 0); SIGNAL sysbus_out : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); BEGIN PROCESS(reset,clock) VARIABLE instr_reg : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); VARIABLE acc : UNSIGNED(word_w-1 DOWNTO 0); CONSTANT zero : UNSIGNED(word_w-1 DOW
24、NTO 0):=(OTHERS =0); VARIABLE mdr : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); VARIABLE reg : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); VARIABLE mar : UNSIGNED(word_w-op_w-1 DOWNTO 0); VARIABLE sysbus : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); VARIABLE microcode : microcode_array; VARIABLE add_r : UNSIGNED(4 DOWNT
25、O 0); VARIABLE data_r : STD_LOGIC_VECTOR(21 DOWNTO 0); VARIABLE temp : STD_LOGIC_VECTOR(4 DOWNTO 0);BEGIN IF reset=0 THEN add_r :=(OTHERS =0); count 0); instr_reg := (OTHERS =0); acc := (OTHERS =0); mdr := (OTHERS =0); reg := (OTHERS =0); mar := (OTHERS =0); z_flag =0; mem 0); ELSIF RISING_EDGE(cloc
26、k) THEN -microprogram controller data_r := code(TO_INTEGER(add_r); IF data_r(4 DOWNTO 0)=11111 THEN -判断下地址 temp:=01 & op(2 DOWNTO 0); add_r := UNSIGNED(temp); ELSIF data_r(4 DOWNTO 0)=11011 THEN IF IR_out(0)=1 THEN add_r :=00101; ELSE add_r :=00100; END IF; ELSIF data_r(4 DOWNTO 0)=11100 THEN IF IR_
27、out(0)=1 THEN add_r :=10001; ELSE add_r :=01111; END IF; ELSIF data_r(4 DOWNTO 0)=11101 THEN IF z_flag=1 THEN add_r:=10111; ELSE add_r :=11000; END IF; ELSE add_r := UNSIGNED(data_r(4 DOWNTO 0); END IF; data_r_out =data_r; add_r_out = add_r; -PC IF data_r(16)=1 THEN -PC_bus=1 sysbus := rfill & STD_L
28、OGIC_VECTOR(count); END IF; IF data_r(19)=1 THEN -load_PC=1 count = UNSIGNED(mdr(word_w-op_w-1 DOWNTO 0); ELSIF data_r(10)=1 THEN -INC_PC=1 count = count+1; ELSE count = count; END IF; -IR IF data_r(15)=1 THEN -load_IR instr_reg := mdr; END IF; IF data_r(9)=1 THEN -Addr_bus=1 sysbus :=0 & rfill & instr_reg(word_w-op_w-1 DOWNTO 1); END IF;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1