石家庄经济学院华信学院计算机组成原理课程设计报告题目 8位模型计算机的设计姓名学号班号 4064170801指导老师关文革尹立洁赵洋成绩2009年1月目录1. 课程设计目的 522. 开发工具选择 523. 方案选择 524.指令系统设计 525. 模型机框图设计 526. 指令流程图 527. 指令操作时间表(组合逻辑控制器)或者微指令格式(微程序控制器)设计 528. 微操作信号综合与优化(组合逻辑控制器)或者微程序(微程序控制器)设计 529. VHDL实现 5210. 调试仿真 5211. 课程设计回顾总结 52参考文献 52附录 52一、课程设计目的1、计算机组成原理课程设计的主要任务是让学生通过动脑和动手解决计算机设计中的实际问题。
综合运用所学计算机组成原理知识,在掌握部件单元电路实验的基础上,进一步将其组成系统构造一台基本的模型计算机,掌握整机概念,并设计机器指令系统,编写程序,在所设计的模型计算机上调试运行。
2、通过一台模型机的设计过程,明确计算机的控制原理与控制过程,巩固和灵活应用所学的理论知识,掌握计算机组成的一般设计方法,提高学生设计能力和实践操作技能,为从事计算机研制与设计打下基础。
二、开发工具选择以TEC-CA教学实验系统为平台,采用硬件描述语言 VHDL为设计工具,应用QUARTUSⅡ5.1环境进行大规模集成电路的功能设计仿真。
三、方案选择应用微程序控制器来实现8位模型计算机的设计。
四、指令系统设计所要设计的微程序控制器是由七条指令来完成的,即:load,sta,add,sub,and1,nop,jmp。
实现功能分别如下:load指令是公操作,实现取数据的功能;sta指令实现存操作;add指令实现加法操作;sub指令实现减法操作;and指令实现与操作; nop指令实现空操作;jmp指令实现无条件跳转操作。
其中add,sub,and1,属于双操作数指令,其指令格式如下图:目的源其中jmp属于转移指令,其指令格式如下图:转移条件转移地址五、模型机框图设计I/O六、指令流程图Addr_busload_MARCSR_NW3OPNopAndSubAddStaJmp Load913111210814ACC_bus load_MDR transfer CSR_NWCSR_NWCSR_NW1676417MDR_bus load_MDR 5CSMDR_busALU_ACCALU_ANDMDR_busALU_ACCALU_SUBMDR_busALU_ACCALU_ADDMDR_busload_ACC七、微指令格式(微程序控制器)设计八、微程序(微程序控制器)设计微处理器的所有数据通路宽度是8位,操作码是3位。
操作码对应的编码:load—>000,sta—>001,add—>010,sub—>011,and0—>100,nop—>101,jmp—>110。
微程序的编码采用直接编码方法,有16个控制信号,外加5位地址,所以一共21位。
地址3的下地址,应该根据指令操作码来形成,所以将其下地址设为01111,表示如果下地址为01111时,下地址的低3位是指令操作码,高2位固定是01,因此load指令的开始地址是01000=8,sta指令的开始地址是01001=9,同理add的是01010=10,sub的是01011=11,and1的是01100=12,nop的是01101=13,jmp的是01110=14。
九、VHDL实现--实验12 微程序控制器实验(头文件)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;PACKAGE cpu_defs ISTYPE opcode IS (load, sta, add, sub, and1, nop, jmp);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 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 :=("000", "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-- transop:=i;-- end if;-- end loop;-- return transop;--end function slv2op;END PACKAGE BODY cpu_defs;--实验12 微程序控制器实验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 : 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_w)-1) OF STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNAL mem : mem_array;CONSTANT prog : mem_array:=(0=> op2slv(load) & STD_LOGIC_VECTOR(TO_UNSIGNED(7,word_w-op_w)),1=> op2slv(sta) & STD_LOGIC_VECTOR(TO_UNSIGNED(8,word_w-op_w)),2=> op2slv(add) & STD_LOGIC_VECTOR(TO_UNSIGNED(9,word_w-op_w)),3=> op2slv(sub) & STD_LOGIC_VECTOR(TO_UNSIGNED(10,word_w-op_w)),4=> op2slv(and1) & STD_LOGIC_VECTOR(TO_UNSIGNED(11,word_w-op_w)),5=> op2slv(nop) & STD_LOGIC_VECTOR(TO_UNSIGNED(12,word_w-op_w)),6=> op2slv(jmp) & STD_LOGIC_VECTOR(TO_UNSIGNED(8,word_w-op_w)),7=> STD_LOGIC_VECTOR(TO_UNSIGNED(2,word_w)),8=> STD_LOGIC_VECTOR(TO_UNSIGNED(3,word_w)),9=> STD_LOGIC_VECTOR(TO_UNSIGNED(4,word_w)),10=> STD_LOGIC_VECTOR(TO_UNSIGNED(5,word_w)),11=> STD_LOGIC_VECTOR(TO_UNSIGNED(6,word_w)),OTHERS => (OTHERS =>'0'));TYPE microcode_array IS ARRAY (0 TO 17) OF STD_LOGIC_VECTOR(21 DOWNTO 0);CONSTANT code : microcode_array:=(0=> "0000010100010000000001",1=> "0000000000000110000010",2=> "0000001010000000000011",3=> "0000000100001000001111",4=> "0000100010000000000000",5=> "0000000000000100000000",6=> "0000000010100001000000",7=> "0000000010100000100000",8=> "0000000000000110000100",9=> "0101000001000000000101",10=> "0000000000000110000110",11=> "0000000000000110000111",12=> "0000000000000110010000",13=> "0000000000000000000000",14=> "0000000000000110010001",15=> "0000000000000000000000",16=> "1000000010100000000000",17=> "0010000010000000000000");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_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_w-1 DOWNTO 0):=(OTHERS =>'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(21 DOWNTO 0);VARIABLE temp : STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINIF reset='0' THENadd_r:=(OTHERS =>'0');count <= (OTHERS =>'0');instr_reg := (OTHERS =>'0');acc := (OTHERS =>'0');mdr := (OTHERS =>'0');mar := (OTHERS =>'0');z_flag <='0';mem <= prog;sysbus :=(OTHERS =>'0');ELSIF RISING_EDGE(clock) THEN--microprogram controllerdata_r := code(TO_INTEGER(add_r));IF data_r(4 DOWNTO 0)="01111" THEN --判断下地址temp:="01" & op(2 DOWNTO 0);add_r := UNSIGNED(temp);ELSEadd_r := UNSIGNED(data_r(4 DOWNTO 0));END IF;data_r_out <=data_r;add_r_out <= add_r;--PCIF data_r(16)='1' THEN --PC_bus='1'sysbus := rfill & STD_LOGIC_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;ELSEcount <= count;END IF;--IRIF data_r(15)='1' THEN --load_IRinstr_reg := mdr;END IF;IF data_r(9)='1' THEN --Addr_bus='1'sysbus := rfill & instr_reg(word_w-op_w-1 DOWNTO 0);END IF;op <= instr_reg(word_w-1 DOWNTO word_w-op_w);IR_out <= instr_reg;op_out <=op;--ALUIF data_r(17)='1' THEN --load_ACC='1'acc:=UNSIGNED(mdr);END IF;IF data_r(11)='1' THEN --ALU_ACC='1'IF data_r(6)='1' THEN --ALU_add='1'acc := acc + UNSIGNED(mdr);ELSIF data_r(5)='1' THEN --ALU_sub='1'acc := acc - UNSIGNED(mdr);ELSIF data_r(20)='1' THEN --Transfer='1'acc := acc ;ELSIF data_r(21)='1' THEN --ALU_and1='1'acc := acc and UNSIGNED(mdr);END IF;END IF;IF data_r(18)='1' THEN --ACC_bus='1'sysbus := STD_LOGIC_VECTOR(acc);END IF;acc_out<= acc;--RAMIF data_r(14)='1' THEN --load_MAR='1'mar := UNSIGNED(sysbus(word_w-op_w-1 DOWNTO 0));ELSIF data_r(12)='1' THEN --load_MDR='1'mdr := sysbus;ELSIF data_r(8)='1' THEN --CS='1'IF data_r(7)='1' THEN --R_NW='1'mdr := mem(TO_INTEGER(mar));ELSEmem(TO_INTEGER(mar))<=mdr;END IF;END IF;IF data_r(13)='1' THEN --MDR_bus='1'sysbus:=mdr;END IF;mdr_out <= mdr;mar_out <= mar;END IF;sysbus_out <=sysbus;END PROCESS;PROCESS(mode,mem_addr)BEGIN--mode=0 -> sysbus--mode=1 -> PC--mode=2 -> result of ALU--mode=3 -> IR--mode=4 -> MAR--mode=5 -> MDR--mode=6 -> memoutput <= (OTHERS =>'0');CASE mode isWHEN "000" =>output<=sysbus_out;WHEN "001" =>output(word_w-op_w-1 DOWNTO 0)<= STD_LOGIC_VECTOR(count);WHEN "010" =>output <= STD_LOGIC_VECTOR(acc_out);WHEN "011" =>output <= IR_out;WHEN "100" =>output(word_w-op_w-1 DOWNTO 0) <= STD_LOGIC_VECTOR(mar_out);WHEN "101" =>output <= mdr_out;WHEN "110" =>output <= mem(TO_INTEGER(mem_addr));WHEN others =>output <= (OTHERS =>'Z');END CASE;END PROCESS;END ARCHITECTURE;十、调试仿真1、实现load到sta的操作2、实现sta到add的操作3、实现add到sub的操作4、实现sub到and1的操作5、实现and1到nop的操作6、实现nop到jmp的操作6、实现jmp跳转后的操作十一、课程设计回顾总结本次课程设计我们要设计一台微程序控制的模型计算机,完成对计算机组成原理这门课程的综合应用,达到学习本书的作用。