1、计算机组成原理课程设计报告题 目 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” )和寄存器寻址(“1” ) 。微程
3、序控制方式由微指令译码产生。微程序中一条机器指令往往分成几步执行,将每一步操作所需的若干为命令以代码编写在一条微指令中,若干条微指令组成一段微程序,对应一条机器指令。然后根据系统的需要,事先编制各段微程序,将它存入控制存储器(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”时为寄存器寻址。操作码类型及编码方式如下:操作码 寻址方式 标志位操作码 sta add sub and1 jmp shl no
5、p编码方式 000 001 010 011 100 101 110含义 传送 加 减 与 跳转 逻辑左移 空IRPSWPC微地址形成电路微地址寄存器 MAR微指令寄存器 MIR译码器控制存储器 CM指令代码运行状态微命令字段 微地址字段微命令序列图 1 微程序控制基本框图 2 指令格式表 1 指令列表图 2 模拟机数据通路5. 模型机框图设计模拟机数据通路如下图所示,模型机采用单总线结构,主要包括运部件 ALU,以及程序计数器 PC、累加器 ACC、指令寄存器 IR、数据寄存器 MDR、地址寄存器 MAR 和通用寄存器R,RAM 为内存。控制信号 ALU(1)寄存器的位数所有的寄存器都均为 8
6、 位:1 通用寄存器 R。该模拟机有 1 个通用寄存器,用于寄存器寻址时存放结果,提供操作数。2 指令寄存器 IR。为了提高取指令的速度,将指令从内存中读出,经数据总线直接置入 IR。3 数据寄存器 MDR、地址寄存器 MAR。地址寄存器 MAR 提供访问主存的地址;数据寄存器 MDR,把从内存取出的数据暂存于 MDR 中,在用到该数据进行运算时,再从 MDR 中取出数据进行运算。4 程序计数器 PC。用于存放下一条指令的内存地址。(2)总线宽度:该模拟机只有一条总线,且总线宽度为 8 位。(3)ALU 位数及运算功能ALU 可以实现 8 位操作数的运算,即 ALU 的位数为 8 位。PC R
7、 IR 微程序控制器ACCMDRRAMMARFlags微地址21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4-0alu_ srlreg_ busload_pcacc_busload_accpc_busload_irload_marmdr_busalu_andalu_accinc_pcaddr_buscs r_nwalu_addalu_sub下址字段ALU 运算功能为:加(001:add) 、减(010:sub) 、逻辑与(011:and) 、左移(101:shl) 、跳转(100:jmp ) 、空(110:nop) 。(4)微命令的设置(各标识的含
8、义)6. 指令流程图指令的流程图如图 3 所示,共有 8 条指令,每条指令都要经过取指令、分析指令和执行指令 3 个步骤。在取指令阶段,8 条指令是一样的,首先程序计数器 PC 的内容通过总线送入地址寄存器MAR,存储信息,PC+1 传送给 PC,把读出的内容传送给指令寄存器 IR 。再接下来的操作中,根据不同的指令,执行顺序也不同。MIR,PC+1PCPCMAR开始PCMARPC+1PCMACCRACCstaM PCjmpPCMARPC+1PCRDACCD ACCM DPCMARPC+1PCRDACC+DACCM DPCMARPC+1PCRDACC AND DACCM DPCMARPC+1P
9、CACC 左移ACCMACCRACC无sub and shl nopadd结束图 3 指令流程图7.微指令格式(微程序控制器)设计微指令格式设计如表 1:控 制 信 号 描 述ACC_bus 用 ACC 的内容驱动总线load_ACC 将总线上的数据载入 ACCPC_bus 用 PC 的内容驱动总线load_IR 将总线上的数据装载至 IRload_MAR 将总线上的数据装载至 MARMDR_bus 用 MDR 的内容驱动总线ALU_ACC 用 ALU 的结果装载 ACCINC_PC PC+1 并将结果存至 PC 中Addr_bus 用 IR 指令中的地址部分驱动总线CS 片选。用 MAR 的
10、内容设置存储器地址R_NW 读取,不可写。当 R_NW 无效且 CS 有效时,MBR 的内容存储于存储器中Reg_bus 用寄存器 R 的内容驱动总线load_Reg 将总线上的数据装载至 RALU_ADD 在 ALU 中执行逻辑加操作ALU_SUB 在 ALU 中执行减操作ALU_AND 在 ALU 中执行与操作ALU_SHL 在 ALU 中执行左移操作8. 微程序(微程序控制器)设计根据微处理器的数据通路和指令系统,可得出微程序的流程图如图 4 所示。微程序的编码采用直接编码方法,每一个控制信号对应一位,共有 17 个控制信号,根据微指令格式把相关的控制信号整合到一起进行编码。微程序流程图
11、的下地址,可知共有 25 条微指令,表 2 给出了该模拟机微程序的编码。地址 3的下地址,应该根据指令操作码来和寻址方式形成,所以将其下地址设为 11111,表示如果下地址为 11111 时,且寻址方式标志位为 0(即立即寻址) ,则下地址应为 01 USE IEEE.STD_LOGIC_1164.ALL;PACKAGE cpu_defs ISTYPE opcode IS (sta, add, sub, and1, jmp, shl, nop);CONSTANT word_w: NATURAL :=8;CONSTANT op_w: NATURAL :=3;CONSTANT rfill: STD
12、_LOGIC_VECTOR(op_w-1 downto 0):=(others =0);-FUNCTIOn slv2op(slv:IN STD_LOGIC_VECTOR) RETURN opcode;FUNCTION op2slv(op:in opcode) RETURN STD_LOGIC_VECTOR;END PACKAGE cpu_defs;PACKAGE BODY cpu_defs ISTYPE optable IS ARRAY(opcode) OF STD_LOGIC_VECTOR(op_w-1 DOWNTO 0);CONSTANT trans_table:optable :=(“0
13、00“, “001“, “010“, “011“, “100“, “101“, “110“);FUNCTION op2slv(op:IN opcode) RETURN STD_LOGIC_VECTOR ISBEGINRETURN trans_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- transo
14、p:=i;- end if;- end loop;- return transop;-end function slv2op;END PACKAGE BODY cpu_defs;源程序 cpu.vhd 如下:LIBRARY 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 :
15、IN UNSIGNED(word_w-op_w-1 DOWNTO 0); output : OUT STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); data_r_out : OUT STD_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 ISTYPE mem_array IS ARRAY (0 TO 2*(word_w-op
16、_w)-1) OF STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNAL mem : mem_array;CONSTANT prog : mem_array:=(0=op2slv(sta) TYPE microcode_array IS ARRAY (0 TO 25) OF STD_LOGIC_VECTOR(21 DOWNTO 0);CONSTANT code : microcode_array:=(0= “0000010100010000000001“,1= “0000000000000110000010“,2= “0000001010000000000011
17、“,3= “0000000100001000011111“,4= “0000000000000110000110“,5= “0000000000000110000111“,6= “0000100010000000000000“,7= “0001000010000000000000“,8= “0000000000000000011011“,9= “0000000000000000011100“,10= “0000000000000000010010“,11= “0000000000000000010100“,12= “0000000000000000010110“,13= “0000000000
18、000000011001“,14= “0000000000000110000000“,15= “0000000000000110010001“, 16= “0000000010100001000000“,17= “0100000000100001000000“,18= “0000000000000110010011“,19= “0000000010100000100000“,20= “0000000000000110010101“,21= “0000000011100000000000“,22= “0000000000000110011101“,23= “0010000010000000000
19、000“,24= “0000000000000000000000“,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_
20、out : STD_LOGIC_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); BEGINPROCESS(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
21、_w-1 DOWNTO 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 DOW
22、NTO 0);VARIABLE data_r : STD_LOGIC_VECTOR(21 DOWNTO 0);VARIABLE temp : STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINIF reset=0 THENadd_r :=(OTHERS =0); count 0);instr_reg := (OTHERS =0);acc := (OTHERS =0);mdr := (OTHERS =0);reg := (OTHERS =0);mar := (OTHERS =0);z_flag 0);ELSIF RISING_EDGE(clock) THEN-microprog
23、ram controllerdata_r := code(TO_INTEGER(add_r);IF data_r(4 DOWNTO 0)=“11111“ THEN -判断下地址temp:=“01“ add_r := UNSIGNED(temp);ELSIF data_r(4 DOWNTO 0)=“11011“ THENIF IR_out(0)=1 THENadd_r :=“00101“;ELSEadd_r :=“00100“;END IF;ELSIF data_r(4 DOWNTO 0)=“11100“ THENIF IR_out(0)=1 THENadd_r :=“10001“;ELSEad
24、d_r :=“01111“; END IF; ELSIF data_r(4 DOWNTO 0)=“11101“ THENIF z_flag=1 THENadd_r:=“10111“;ELSEadd_r :=“11000“;END IF;ELSEadd_r := UNSIGNED(data_r(4 DOWNTO 0);END IF;data_r_out sysbus -mode=1 - PC-mode=2 - result of ALU-mode=3 - IR-mode=4 - MAR-mode=5 - MDR-mode=6 - mem output 0);CASE mode is WHEN “
25、000“ = output output(word_w-op_w-1 DOWNTO 0)output output output(word_w-op_w-1 DOWNTO 0) output output output Z);END CASE; END PROCESS;END ARCHITECTURE;10. 调试仿真add_r_out 下地址的输出端,clock 为时钟脉冲,data_r_out 为微指令的输出,mem_addr 为内存地址的输入,mode 为输出模式的选择,op_out 为操作码的输出,output 结果的输出,根据模式决定,reset 复位信号,1. mode 的值为 0
26、10,则 output 中输出为 acc 中的内容:STA 指令:把 9 号单元的数据放到 acc 中,把 10 号单元的数据放入寄存器中。此时 acc 值为2,寄存器的值为 3,仿真图并不显示。仿真图 1 STA 指令ADD 指令:把 9 号单元的数据放到 acc,并与寄存器中的数据相加,把结果放到 acc 中,acc中的数据为 5。SUB 指令: acc 中的数据与 10 号单元的数据想减,结果放到 acc 中。acc 中数据为 2。AND 指令:acc 中的数据与 10 号单元的数据相与,结果放到 acc 中。acc 中数据为 2。仿真图 2 ADD 指令仿真图 3 SUB 指令仿真图
27、4 AND 指令SHL 指令:acc 中的数据逻辑左移一位,空位补 0,结果放入 acc 中。acc 中数据为 4.NOP 指令:此操作为空操作,对 acc 中数据无影响。JMP 指令:跳转到 STA 指令,将 9 号单元的数据放到 acc 中。acc 中数据为 2.仿真图 5 SHL 指令仿真图 6 NOP 指令仿真图 7 JMP 指令2.mode 中的值为 001,则则 output 中输出为 pc 中的内容:在此只截了具有代表性的 jmp 指令截图:11. 课程设计回顾总结本次课程设计我们要设计一台微程序控制的模型计算机,完成对计算机组成原理这门课程的综合应用,达到学习本书的作用。由于计
28、算机设计的部件较多、结构原理较复杂,对于我们这样的初设计者来说感到无从下手,所以我们在整个过程中采取由浅入深,由简单到复杂的放法,通过这次设计,使我们能清楚的了解计算机的基本组成、基本原理和设计步骤、设计思路和调试步骤,为独立完成计算机设计奠定了基础。也是通过这次课程设计,使我学会了我的动手能力以及动脑能力的重要性,同时信心也增强了,在课程设计中通过自己动脑子解决遇到的问题,把书本上学到的知识应用到实践中去,这样也巩固和深化了自己的知识结构。虽然在设计的过程中遇到了很多问题不是我自己能够独自解决的,但是通过同学和老师的帮助和指导使我遇到的问题得到清楚的解决,同时也让我学到在遇到问题时如何去解决
29、所遇到的问题。虽然在整个设计过程不是很完善,所做的也都只是按老师的最低要求完成的,只是多加了一条指令,但是总的来说这次课程设计还是很成功的,从中我得到了不少的收获,它很好的将理论与实际相结合,既检验了知识还锻炼了思维和设计操作能力。在此次的课程设计中,我要感谢辅导我们的老师们,是你们不辞辛苦的奔波以及对我们的帮助和指导,才让我们顺利的完成了这次课程设计。在此我代表所有的同学跟你们说声谢谢!参 考 文 献 1 罗克露,单立平,刘辉,俸志刚计算机组成原理北京:电子工业出版社,2004。2 张兴忠,阎宏印,武淑红数字逻辑与数字系统北京:科学出版社,2004。3 杨春武,于艳丽,刘敬晗tec-ca 学生实验指导书北京:清华大学科教仪器厂,2005。仿真图 8 001 模式下 JMP 指令