当前位置:文档之家› cpu控制器的设计

cpu控制器的设计

《计算机组成与结构》课程设计报告题目:CPU控制器设计院(系):信息科学与工程专业班级:学生姓名:学号:指导教师:顾兵20 15 年 06 月 15 日至20 15 年 06 月 26 日华中科技大学武昌分校制计算机组成与结构课程设计任务书目录目录 (i)1需求与总体设计 (1)1.1设计任务及功能要求 (1)1.1.1设计任务 (1)1.1.2功能要求 (1)1.2总体设计 (1)1.2.1总体设计原理 (1)1.2.2总体设计说明 (1)1.3总体框图 (2)2详细设计与实现 (3)2.1方案设计与实现 (3)2.1.1输入与输出逻辑图 (3)2.1.2指令与控制信号真值表 (3)2.1.3控制器设计思路流程图 (4)2.2指令分析及逻辑电路图 (4)2.2.1 R-type型指令 (4)2.2.2 Ori指令 (5)2.2.3 lw指令 (6)2.2.4 sw指令 (7)2.2.5 branch指令 (7)2.2.6 Jump指令 (8)2.2.7逻辑电路图 (9)2.3 VHDL代码分析及实现 (10)2.3.1代码分析 (10)2.3.2代码实现 (11)3电路仿真调试 (14)3.1代码仿真 (14)3.2功能仿真及调试 (14)总结 (17)参考文献 (18)1需求与总体设计1.1设计任务及功能要求1.1.1设计任务通过对CPU的工作原理和逻辑功能的理解,运用VHDL硬件描述语言实现能支持基本指令的单时钟控制器设计,采用QUARTUS II软件设计仿真和调试完成。

1.1.2功能要求1.运用VHDL实现能支持基本指令的单时钟控制器设计与调试。

1>实现能够执行R类型、ori、addiu、lw、sw、beg以及jump指令的单时钟控制器使其能够支持基本的指令。

2>实现cpu的控制。

2.采用QUARTUS II软件设计仿真和调试完成。

1.2总体设计1.2.1总体设计原理CPU每次从存储器读取一条指令后,PC指针指向正在取值的指令并存放到指令寄存器IR中,IR将指令送到控制器,控制器对指令进行译码,判断指令类型,从而生成相应指令对应的的数据通路控制信号,指挥整个CPU的运转。

控制单元主要包含一个指令译码器,输入的是指令操作码op(R-型指令还包括功能码func),输出的是控制信号。

所以,控制单元的设计过程如下。

1>根据每条指令的功能,分析控制信号的取值,并在表中列出。

2>根据列出的指令和控制信号的关系,写出每个控制信号的逻辑表达式。

1.2.2总体设计说明1)指令格式如下:MIPS指令分为三种指令:R_Type,I_Type,J_TypeR_Type 如:加法ADD 减法SUBSTRACT加法指令的汇编格式add rd, rs, rt加法指令的汇编格式sub rd, rs, rt图1.1 指令格式2)设计步骤:第一步:确定每个元件所需控制信号的取值。

第二步:汇总所有指令所涉及到的控制信号,生成一张反映指令与控制信号之间关系的表。

第三步:根据表得到每个控制信号的逻辑表达式,据此设计控制器电路。

1.3总体框图总体设计框图如图1.1:图1.2 控制器总体框图2详细设计与实现2.1方案设计与实现2.1.1输入与输出逻辑图由cpu控制器的功能原理得出输入与输出逻辑图如下:图2.1 输入与输出逻辑图2.1.2指令与控制信号真值表查阅得到指令与控制信号真值表如下:表2.1指令与控制信号真值表2.1.3控制器设计思路流程图根据各指令控制信号真值表可得主控制器设计思路流程图如图2.2所示。

图2.2 设计思路流程图2.2指令分析及逻辑电路图2.2.1 R-type型指令图2.3是R-型指令的执行过程示意图,其中粗线描述了R-型指令的数据在数据通中的执行路径:Register File(Rs,Rt)→busA,busB→ALU→Register File(Rd)。

图2.3 R-型指令执行过程控制信号的取值分析如下。

Branch=Jump=0:因为是非分支指令、非无条件跳转指令。

RegDst=1:因为R-型指令的目的寄存器为Rd。

ALUSrc=0:保证选择busB作为ALU的B口操作数。

MemtoReg=0:保证选择ALU结果送到目的寄存器。

RegWr=1:保证在下个时钟到来时,在不发生溢出的情况下结果被写到目的寄存器。

MemWr=0:保证下一个时钟到来时,不会有信息写到数据存储器。

ExtOp=x:因为ALUSrc=0,所以扩展器Extender的值不会影响执行结果,故ExtOp 取0或1都无所谓。

2.2.2 Ori指令指令完成的功能:R[rt] ←R[rs] op ZeroExt[imm16]]图2.4 Ori的控制信号控制信号的取值分析如下。

分支指令和跳转指令都为零Branch=jump=0因为是非分之指令,非跳转指令。

RegDst=1:因为Ori指令的目的寄存器为Rt。

ALUSrc=1:保证选择busB作为ALU的A口操作数。

ALUctr=or。

MemtoReg=0:保证选择ALU结果送到目的寄存器。

RegWr=1:保证在下个时钟到来时,在不发生溢出的情况下结果被写到目的寄存器。

MemWr=0:保证在下个时钟到来时,不会有信息写到数据存储器。

ExpOp=x:因为ALUSrc=0,所以扩展器Extender的值不会影响执行结果,故ExtOP 取0或1都无所谓。

2.2.3 lw指令指令完成的功能:R[rt] ←M[ R[rs] + SignExt[imm16] ]图2.5 lw的控制信号控制信号的取值分析如下。

分支指令和跳转指令都为零Branch=jump=0因为是非分之指令,非跳转指令。

RegDst=1:因为lw指令的目的寄存器为Rt。

ALUSrc=1:保证选择busA作为ALU的A口操作数。

ALUctr=add。

MemtoReg=1:保证选择存储器结果送到目的寄存器。

RegWr=1:保证在下个时钟到来时,在不发生溢出的情况下结果被写到目的寄存器。

MemWr=0:保证在下个时钟到来时,不会有信息写到数据存储器。

ExpOp=1:因为要利用扩展器Extender进行扩展。

2.2.4 sw指令指令完成的功能:rt, rs, imm16图2.6 sw的控制信号控制信号的取值分析如下。

分支指令和跳转指令都为零Branch=jump=0因为是非分之指令,非跳转指令。

RegDst=x:因为不会写到寄存器。

ALUSrc=1:保证选择busA作为ALU的A口操作数。

ALUctr=add。

MemtoReg=x:有没有结果送到目的寄存器无所谓。

RegWr=0:不会有结果被写到目的寄存器。

MemWr=1:保证在下个时钟到来时,会有信息写到数据存储器。

ExpOp=1:因为要利用扩展器Extender进行扩展。

2.2.5 branch指令指令完成的功能:rs, rt, imm16图2.7 branch的控制信号控制信号的取值分析如下。

分支指令置位,跳转指令清零Branch=1,jump=0因为是分之指令,非跳转指令。

寄存器写信号RegDst=x:因为不会写到寄存器。

算术逻辑单元选择信号ALUSrc=0:保证选择busB作为ALU的B口操作数。

算术逻辑单元控制信号ALUctr=sub。

存储器写寄存器信号MemtoReg=x:有没有结果送到目的寄存器无所谓。

寄存器写信号RegWr=0:不会有结果被写到目的寄存器。

存储器写信号MemWr=0:保证在下个时钟到来时,不会有信息写到数据存储器。

符号扩展信号ExpOp=x:因为不需要利用扩展器Extender进行扩展。

2.2.6 Jump指令指令完成的功能:j target图2.8 jump指令的控制信号控制信号的取值分析如下。

分支指令清零,跳转指令置位Branch=0,jump=1因为是非分之指令,跳转指令。

目的寄存器RegDst=x:因为不会写到寄存器。

算术逻辑单元ALUSrc=x:保证选择busB作为ALU的A口操作数。

算术逻辑单元控制信号ALUctr=x。

存储器到寄存器信号MemtoReg=x:有没有结果送到目的寄存器无所谓。

寄存器写信号RegWr=0:不会有结果被写到目的寄存器,避免寄存器在指令执行过程时被写入任何结果。

存储器写信号MemWr=0:保证在下个时钟到来时,不会有信息写到数据存储器。

符号扩展信号ExpOp=x:因为要利用扩展器Extender进行扩展。

2.2.7逻辑电路图图2.9控制器逻辑电路图2.3 VHDL代码分析及实现2.3.1代码分析1)实体一个VHDL实体指定了实体的名称,实体的端口和实体所关联的信息。

所有的设计都是用一个或多个实体创建起来的。

实体是设计的最基本模块。

设计的最高层次是顶层设计。

如果设计是分等级的,那么顶层的描述将包含较低层次的描述。

这些较低层次的描述将是被包含在顶层实体描述中的较低层次的实体。

关键字ENTITY表示这是一个实体语句的开始。

它指定了端口数量,端口方向和端口类型。

实体是描述VHDL模型的接口。

entity main_controller isport(op: in std_logic_vector(5 downto 0);RegWr,ALUSrc,RegDst,MemtoReg,MemWr,Branch,Jump,ExtOp,ALUOP0,ALUOP1,ALUOP2,RType: out std_logic);end main_controller;2)结构结构体描述实体的基本功能,并有对实体的行为进行建模的语句。

所有的能被仿真的实体都有一个结构体描述,这个结构体描述了实体的行为。

一个单一的实体可以有多个结构体,一个结构体可能是一种行为,而令一个结构体可能是一个设计的结构描述。

一个结构体总是与一个实体和描述这个实体的行为相关联。

关键字ARCHITECTURE表示这条语句描述了一个实体的结构体。

这个结构体的名称是behav,所描述的实体称为main_controller。

architecture behav of main_controller issignal iRtype, ori,addiu,lw,sw,beq,jump1: std_logic;beginprocess(op)beginend process;process(iRtype, ori,addiu,lw,sw,beq,jump1)end process;end behav;2.3.2代码实现library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity main_controller isport(op: in std_logic_vector(5 downto 0);RegWr,ALUSrc,RegDst,MemtoReg,MemWr,Branch,Jump,ExtOp,ALUOP0,ALUOP1,ALUOP2,RType: out std_logic);end main_controller;architecture behav of main_controller issignal iRtype, ori,addiu,lw,sw,beq,jump1: std_logic;beginprocess(op)begincase op iswhen "000000" =>iRtype <= '1';ori<='0' ; addiu <= '0'; lw <= '0'; sw <= '0'; beq <= '0'; jump1 <= '0';when "001101" =>iRtype <= '0';ori<='1' ; addiu <= '0'; lw <= '0'; sw <= '0'; beq <= '0'; jump1 <= '0';when "001001" =>iRtype <= '0';ori<='0' ; addiu <= '1'; lw <= '0'; sw <= '0'; beq <= '0'; jump1 <= '0';when "100011" =>iRtype <= '0';ori<='0' ; addiu <= '0'; lw <= '1'; sw <= '0'; beq <= '0'; jump1 <= '0';when "101011" =>iRtype <= '0';ori<='0' ; addiu <= '0'; lw <= '0'; sw <= '1'; beq <='0'; jump1 <= '0';when "000100" =>iRtype <= '0';ori<='0' ; addiu <= '0'; lw <= '0'; sw <= '0'; beq <= '1'; jump1 <= '0';when "000010" =>iRtype <= '0';ori<='0' ; addiu <= '0'; lw <= '0'; sw <= '0'; beq <= '0'; jump1 <= '1';when others=>end case;end process;process(iRtype, ori,addiu,lw,sw,beq,jump1)beginif(iRtype = '1' )thenRegDst<= '1' ; ALUOP0<= '1' ; ALUOP2<= '0'; RType<= '1' ;RegWr <= '1';ALUSrc <= '0';MemtoReg<= '0';MemWr<= '0';Jump<= '0';Branch<= '0';ExtOp<= '0';ALUOP1<= '0';elsif(ori='1')thenALUOP1<= '1';RegWr <= '1';ALUSrc <= '1';RegDst<= '0' ; ALUOP0<= '0' ; ALUOP2<= '0'; RType<= '0' ;MemtoReg<= '0';MemWr<= '0';Jump<= '0';Branch<= '0';ExtOp<= '0';elsif(addiu ='1')thenRegWr <= '1';ALUSrc <= '1';ExtOp<= '1';ALUOP1<= '0';RegDst<= '0' ; ALUOP0<= '0' ; ALUOP2<= '0'; RType<= '0' ;MemtoReg<= '0';MemWr<= '0';Jump<= '0';Branch<= '0';elsif( lw ='1' )thenRegWr <= '1';ALUSrc <= '1';MemtoReg<= '1';ExtOp<= '1';ALUOP1<= '0';RegDst<= '0' ; ALUOP0<= '0' ; ALUOP2<= '0'; RType<= '0' ;MemWr<= '0';Jump<= '0';Branch<= '0';elsif(sw ='1')thenMemWr<= '1';ALUSrc <= '1';ExtOp<= '1';ALUOP1<= '0';RegWr <= '0';RegDst<= '0' ; ALUOP0<= '0' ; ALUOP2<= '0'; RType<= '0' ;MemtoReg<= '0';Jump<= '0';Branch<= '0';elsif(beq ='1')thenBranch<= '1'; ALUOP2<= '1';ALUOP1<= '0';RegWr <= '0';ALUSrc <= '0';RegDst<= '0' ; ALUOP0<= '0' ; RType<= '0' ;MemtoReg<= '0';MemWr<= '0';Jump<= '0';ExtOp<= '0';elsif(jump1='1')thenJump<= '1';ALUOP1<= '0';RegWr <= '0';ALUSrc <= '0';RegDst<= '0' ; ALUOP0<= '0' ;ALUOP2<= '0'; RType<= '0' ;MemtoReg<= '0';MemWr<= '0';Branch<= '0';ExtOp<= '0';end if;end process;end behav;3电路仿真调试3.1代码仿真将VHDL语言编写的代码在quartus5.0上进行仿真,如图3.1所示。

相关主题