




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
XXXXXXXX信息工程学院 计算机组成原理课程设计报告题 目 16位模拟机的设计 姓 名 XXXXXX 学 号 _ 班 号 _ 同组人员 指导老师 成 绩 2010年12月30日目 录1. 课程设计目的22. 开发工具选择23. 方案选择 24指令系统设计25. 模型机框图设计46. 指令流程图57. 微指令格式58. VHDL实现79. 调试仿真1510. 课程设计回顾总结 19参 考 文 献 19附录 另附excle表一、课程设计的目的(1). 计算机组成原理课程设计的主要任务是通过动脑和动手解决计算机设计中的实际问题。综合运用所学计算机组成原理知识,在掌握部件单元电路实验的基础上,进一步将其组成系统构造一台基本的模型计算机,掌握整机概念,并设计机器指令系统,编写程序,在所设计的模型计算机上调试运行。(2). 通过一台模型机的设计过程,明确计算机的控制原理与控制过程,巩固和灵活应用所学的理论知识,掌握计算机组成的一般设计方法,提高学生设计能力和实践操作技能,为从事计算机研制与设计打下基础。二、开发工具选择 利用QuartusII软件,在此平台上,采用硬件描述语言 VHDL为设计工具,编写并调试VHDL程序,然后做功能仿真,以实现想要的功能。三、方案选择设计一个16位模型计算机:采用单总线微程序控制方式,两种寻址方式(直接寻址、寄存器寻址)。微程序控制方式由微指令译码产生。微程序中一条机器指令往往分成几步执行,将每一步操作所需的若干为命令以代码编写在一条微指令中,若干条微指令组成一段微程序,对应一条机器指令。然后根据系统的需要,事先编制各段微程序,将它存入一个专用寄存器(即控制存储器)中。微程序执行过程:(1)从控存中逐条取出“取指令操作”,执行取指令公共操作。(2)根据指令的操作码,经过微地址形成部件,得到这条指令的入口地址,并送入微地址寄存器中。(3)从控存中逐条的取出对应的微指令并执行。(4)执行完一条机器指令对应的微程序后又回到取指微程序的入口地址,继续第(1)步,以完成取下一条机器指令的公共操作微程序控制器基本框图如下:(如图1所示)微地址字段. 微命令字段译码器微命令序列. 微指令存储器uAR指令代码IRPC微地址形成电路微地址寄存器uAR控制存储器CM图1微程序控制器基本框图四、指令系统设计(1)指令格式 模型机采用定长指令格式,每条指令16位长,操作码占4位(1512位),两个操作数各占6位,每个操作数的寻址方式各占一位,源操作数的寻址方式为5位,操作数占40位,目的操作数的寻址方式占第11位,操作数占第106位。当寻址方式为直接寻址时,操作数位置上是内存地址号,当为寄存器寻址时,操作数位置上是寄存器号。涉及到的操作有LOAD、ADD、SUB、AND、OR、JZ、STA、INC、DEC、NOT、JMP、NOP等等。 15 12 11 10 6 5 4 0OP寻址方式寄存器号或内存号寻址方式寄存器号或内存号 目的操作数 源操作数(2)寻址方式编号寻址方式含义0直接寻址主存中为操作数1寄存器寻址寄存器中为操作数 表1 寻址方式(3)指令类型操作编码含义ADD0000加SUB0001减AND0010与OR0011或JZ0100判断相等STA0101传送LOAD0110赋初值INC0111自增DEC1000自减NOT1001非JMP1010无条件跳转NOP1011无操作 表2 指令类型(4)通用寄存器寄存器编号R00000R10001R20010R30011 表3 寄存器编号(5)指令举例按下列顺序执行各指令。内存号指令描述0LOAD Ri将操作数2赋值给所有寄存器1ADD 15 R1 将R1寄存器内容与内存中对应操作数4相加2SUB 14 R0将内存中对应操作数3与R0寄存器内容相减3AND 15 R2将R2寄存器内容与内存中对应操作数4相与4OR 14 R0将R0寄存器内容与内存中对应操作数3相或5JZ 16 R2判断R2寄存器内容跟内存中对应操作数5是否相等6STA 17 R3把R3寄存器内容放入指定内存单元7INC 14将主存中单元内容自增8DEC 15将主存中单元内容自减9NOT 13将主存中单元内容取反10NOP 空操作11JMP 13强制跳转到主存内容所指向的指令处执行12112号内存单元中为113213号内存单元中为214314号内存单元中为315415号内存单元中为416516号内存单元中为5 表4 要做的机器指令五、 模型机框图设计模型机数据通路如下 图2 数据通路结构图(1) 寄存器的位数 所有的寄存器都均为16位:l 通用寄存器R0,R1,R2,R3 : 该模拟机有4个通用寄存器,寄存器R0的编码为0000,寄存器1的编码为0001,寄存器R2的编码为0010,寄存器R3的编码为0011。l 寄存器C,D : 寄存器C存放源操作数,寄存器D存放目的操作数。l 指令寄存器IR : 为了提高取指令的速度,将指令从内存中读出,直接置入IR。l 数据寄存器MDR、地址寄存器MAR : 地址寄存器MAR提供访问主存的地址;数据寄存器MDR,把从内存取出的数据暂存于MDR中,在用到该数据进行运算时,再从MDR中取出数据进行运算。l 程序计数器PC : 用于存放下一条指令的内存地址。(2) 总线宽度:该模拟机为单总线,且总线宽度为16位。(3) ALU位数及运算功能 ALU可以实现16位操作数的运算,即ALU的位数为16位。ALU运算功能为:可以实现简单的加(0000,ADD)、减(0001,SUB)、与(0010,AND)、或(0011,OR)、相等(0100,JZ)、传送(0101,STA)、赋初值(0110,LOAD)、自增(0111,INC)、自减(1000,DEC)、非(1001,NOT)、跳转(1010,JMP)、空操作(1011,NOP)操作。6、 指令流程图 图3 指令流程图12七、微指令格式微命令的设置(各标识的含义)微程序设计的关键是设计微指令格式,它与cpu的数据通路结构有很密切的关系,微指令的编码采用直接译码的方法,275位操作位,后5位为下地址部分。用来决定为程序的流程,经过认真分析各信息的传送路径,对指令过程基本掌握,并为相应的微命令做了一下设置:微地址2726252423222120191817161514131211109876540STALOADADDSUBANDORJZINCDECNOTCSR_NWINC_PCALU_BUSLOAD_CLOAD_DLOAD_MDRLOAD_MARPC_BUSM_IRIR_BUSMDR_BUSLOAD_PC下地址00000000000001000011000000001100000000001100000000000000102000000000000000000010000001130000000000000000010001011111400000000001100000000000111105000000000010000000000000000060000000000000000000000000000700000000000000000000000000008000000000000001000000000010090000000000110000000000011100100000000000000000000000000000111000000000000100100000000101120000000000000001000001011101130010000000000000000000000000140001000000000000000000000000150000100000000000000000000000160000010000000000000000000000170000001000000000000000000000180000000000000000000001100000190000000000000001000001011011200100000000000000000000000000210000000100000000000000000000220000000010000000000000000000230000000001000000000000000000 表5 微指令格式各个控制信号为:控 制 信 号描 述LOAD_PC跳转指令时确定跳转地址MDR_bus用MDR内容驱动总线IR_BUS用IR内容驱动总线M_IR将主存指令装载至IRPC_BUS将PC内容驱动总线load_MAR将总线上的数据装载至MARLOAD_MDR将总线上的数据装载至MDRLOAD_D将总线上的数据装载至DLOAD_C将总线上的数据装载至CALU_BUS用acc内容驱动总线INC_PCPC内容自增R_NW读取,不可写。当R_NW无效且CS有效时,MDR的内容存储于存储器中NOT非操作DEC自减操作INC自增操作JZ判断相等OR或操作AND与操作SUB减操作ADD与操作LOAD赋初值STA传送操作 表6 控制信号内容八、VHDL实现(1)头文件cpu_defs.vhdl如下所示:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;PACKAGE cpu_defs ISTYPE zhiling IS (add1, sub1, and1, or1, jz1, sta1, load1, inc1, dec1, not1, jmp1, nop1); CONSTANT word_w: NATURAL :=16;CONSTANT op_w: NATURAL :=4;CONSTANT rfill: STD_LOGIC_VECTOR(op_w-1 downto 0):=(others =0);-FUNCTIOn slv2op(slv:IN STD_LOGIC_VECTOR) RETURN opcode;FUNCTION op2slv1(op:in zhiling) RETURN STD_LOGIC_VECTOR;END PACKAGE cpu_defs;PACKAGE BODY cpu_defs ISTYPE zhi_ling IS ARRAY(zhiling) OF STD_LOGIC_VECTOR(op_w-1 DOWNTO 0);CONSTANT trans_table1:zhi_ling :=(0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011);FUNCTION op2slv1(op:IN zhiling) RETURN STD_LOGIC_VECTOR ISBEGINRETURN trans_table1(op);END FUNCTION op2slv1;END PACKAGE BODY cpu_defs;(2) 主文件cpu.vhdl内容如下所示:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL,IEEE.NUMERIC_STD.ALL;USE WORK.CPU_DEFS.ALL;use ieee.std_logic_unsigned.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_LOGIC_VECTOR(27 DOWNTO 0); op_out : OUT STD_LOGIC_VECTOR(op_w-1 DOWNTO 0); count_out : OUT UNSIGNED(word_w-op_w-1 DOWNTO 0);- add_r_out : OUT UNSIGNED(4 DOWNTO 0) ); END ENTITY;ARCHITECTURE ONE OF CPU ISTYPE mem_array IS ARRAY (0 TO 18) OF STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNAL mem : mem_array;CONSTANT prog : mem_array:=( 0= op2slv1(load1) & 001101 & 000000, -将目的操作数2赋值给寄存器 1= op2slv1(add1) & 001111 & 100001, -源操作数为R1寄存器,目的操作数为4 2= op2slv1(sub1) & 001110 & 100000, -源操作数为R0寄存器,目的操作数为3 3= op2slv1(and1) & 001111 & 100010, -源操作数为R2寄存器,目的操作数为4 4= op2slv1(or1) & 001110 & 100000, -源操作数为R0寄存器,目的操作数为3 5= op2slv1(jz1) & 010000 & 100010, -源操作数为R2寄存器,目的操作数为5 6= op2slv1(sta1) & 010001 & 100011, -源操作数为R3寄存器,目的操作数为17号单元 7= op2slv1(inc1) & 001110 & 000000, -目的操作数为3 8= op2slv1(dec1) & 001111 & 000000, -目的操作数为4 9= op2slv1(not1) & 001101 & 000000, -目的操作数为210= op2slv1(nop1) & 000000 & 000000, -空操作11= op2slv1(jmp1) & 001101 & 000000, -跳转到第2条指令执行12= 0000000001000000, -存放数据 113= 0000000010000000, - 214= 0000000011000000, - 315= 0000000100000000, - 416= 0000000101000000, - 5OTHERS = (OTHERS =0);TYPE microcode_array IS ARRAY (0 TO 23) OF STD_LOGIC_VECTOR(27 DOWNTO 0);CONSTANT code : microcode_array:=( 0= 0000000000001000011000000001, -pc-mar,pc+1-pc 1= 0000000000110000000000000010, -cs,r_nw 2= 0000000000000000000100000011, -m_ir 3= 0000000000000000010001011111, -mdr_bus,load_mar 4= 0000000000110000000000011110, -cs,r_nw 5= 0000000000100000000000000000, -cs, 6= 0000000000000000000000000000, - 7= 0000000000000000000000000000, - 8= 0000000000000010000000000100, -ri_bus,load_c 9= 0000000000110000000000011100, -cs,r_nw10= 0000000000000000000000000000, -nop11=1000000000000100100000000101, -alu_bus,load_mdr,alu_sta12= 0000000000000001000001011101, -mdr_bus,load_d13= 0010000000000000000000000000, -alu_add14= 0001000000000000000000000000, -alu_sub 15= 0000100000000000000000000000, -alu_and 16= 0000010000000000000000000000, -alu_or 17= 0000001000000000000000000000, -alu_jz 18= 0000000000000000000001100000, -mdr_bus,load_pc 19= 0000000000000001000001011011, -mdr_bus,load_d20= 0100000000000000000000000000, -alu_load21= 0000000100000000000000000000, -alu_inc22= 0000000010000000000000000000, -alu_dec23= 0000000001000000000000000000 -alu_not);SIGNAL count : UNSIGNED(word_w-op_w-1 DOWNTO 0);SIGNAL op : STD_LOGIC_VECTOR(op_w-1 DOWNTO 0); 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_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);SIGNAL R0 : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); SIGNAL R1 : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNAL R2 : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNAL R3 : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNAL c : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNAL d : 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);VARIABLE mdr : 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 DOWNTO 0); VARIABLE data_r : STD_LOGIC_VECTOR(27 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);mar := (OTHERS =0);mem 0);R0 0);R1 0);R2 0);R3 0);c 0);d 0);ELSIF RISING_EDGE(clock) THEN-microprogram controllerdata_r := code(TO_INTEGER(add_r);IF data_r(4 DOWNTO 0)=11111 THEN -判断下地址 IF op(3 DOWNTO 0)0110 THENadd_r := 01000; -双操作数ELSIF op(3 DOWNTO 0)=1011 THENadd_r := 01010; -空操作ELSEadd_r := 01001; -单操作数END IF;ELSIF data_r(4 DOWNTO 0)=11110 THENIF op(3 DOWNTO 0)=0101 THEN -staadd_r := 01011;ELSEadd_r := 01100; END IF;ELSIF data_r(4 DOWNTO 0)=11101 THENIF op(3 DOWNTO 0)=0000 THEN -add add_r := 01101; ELSIF op(3 DOWNTO 0)=0001 THENadd_r := 01110; -subELSIF op(3 DOWNTO 0)=0010 THENadd_r := 01111; -andELSIF op(3 DOWNTO 0)=0011 THEN add_r := 10000; -or ELSIF op(3 DOWNTO 0)=0100 THENadd_r := 10001; -jzEND IF;ELSIF data_r(4 DOWNTO 0)=11100 THENIF op(3 DOWNTO 0)=1010 THEN -jmpadd_r := 10010;ELSEadd_r := 10011;END IF;ELSIF data_r(4 DOWNTO 0)=11011 THENIF op(3 DOWNTO 0)=0110 THENadd_r := 10100; -loadELSIF op(3 DOWNTO 0)=0111 THENadd_r := 10101; -incELSIF op(3 DOWNTO 0)=1000 THENadd_r := 10110; -decELSIF op(3 DOWNTO 0)=1001 THENadd_r := 10111; -notEND IF;ELSEadd_r := UNSIGNED(data_r(4 DOWNTO 0);END IF;data_r_out = data_r;add_r_out = add_r; -PCIF data_r(9)=1 THEN -PC_bus=1sysbus := rfill & STD_LOGIC_VECTOR(count);END IF;IF data_r(5)=1 THEN -load_pc=1count = UNSIGNED(mdr(11 DOWNTO 0);add_r := 00000;ELSIF data_r(15)=1 THEN -INC_PC=1count = count+1;ELSE count = count;END IF;-IRIF data_r(8)=1 THEN -M_IRinstr_reg := mem(TO_INTEGER(mar);END IF;op = instr_reg(word_w-1 DOWNTO word_w-op_w);IR_out = instr_reg;op_out =op;-RIF data_r(26)=1 THEN -loadR0=mdr;R1=mdr;R2=mdr;R3 c c c c c=0000000000000000;end case;END IF;-ALUIF data_r(25)=1 THEN -ALU_add=1acc := UNSIGNED(d)+UNSIGNED(c);ELSIF data_r(24)=1 THEN -ALU_sub=1acc := UNSIGNED(d)-UNSIGNED(c);ELSIF data_r(23)=1 THEN -ALU_and=1acc := UNSIGNED(c and d);ELSIF data_r(22)=1 THEN -ALU_or=1acc := UNSIGNED(c or d);ELSIF data_r(21)=1 THEN -ALU_jz=1IF c=d THENacc:=1111111111111111;ELSEacc:=0000000000000000;END IF;ELSIF data_r(20)=1 THEN -ALU_inc=1acc := UNSIGNED(d)+1;ELSIF data_r(19)=1 THEN -ALU_dec=1acc := UNSIGNED(d)-1;ELSIF data_r(18)=1 THEN -ALU_not=1acc := UNSIGNED(not d); ELSIF data_r(27)=1 THEN -ALU_sta=1acc := UNSIGNED(c);END IF;IF data_r(14)=1 THEN -ALU_bus=1sysbus := STD_LOGIC_VECTOR(acc);END IF;acc_out= acc;-RAMIF data_r(6)=1 THEN -MDR_bus=1sysbus:=mdr;END IF;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑楼体防护网安装工程技术考核试卷
- 2023-2024学年广东省名校联盟高一下学期期中质量检测语文试题(解析版)
- 探索光的奥秘
- 江苏名校2024-2025学年高考化学试题模拟题及解析(全国Ⅰ卷)含解析
- 天津机电职业技术学院《材料成型原理与工艺》2023-2024学年第二学期期末试卷
- 苏州大学应用技术学院《生物反应工程实验》2023-2024学年第二学期期末试卷
- 四川省成都市龙泉驿区达标名校2025届初三第6次月考数学试题含解析
- 辽宁工业大学《藏族文化概论》2023-2024学年第一学期期末试卷
- 四川铁道职业学院《跨文化交际(日)》2023-2024学年第一学期期末试卷
- 2025年小学数学期末考试试卷及答案
- GA/T 751-2024公安视频图像屏幕显示信息叠加规范
- 2025至2030中国长链氯化石蜡行业供需现状与前景策略研究报告
- 租地盖大棚合同协议
- 自体输血知识培训课件
- 人教A版高一下册必修第二册高中数学8.6.2直线与平面垂直【课件】
- 小学生涯课件
- 西藏拉萨中学2024-2025学年高三第二学期英语试题4月月考试卷含解析
- GB/T 45421-2025城市公共设施非物流用智能储物柜服务规范
- 档案相关法律法规知识复习试题及答案
- 商铺装修管理规定
- 铁路心理测试题及答案
评论
0/150
提交评论