CPU 指令译码器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机组成原理实验报告
姓名:学号:专业:计算机科学与技术
班级:指导老师:实验日期:
实验地点:实验题目: CPU指令译码器
一、实验目的
(1)理解指令译码器的作用和重要性。
(2)学习设计指令译码器。
二、实验原理
指令译码器是计算机控制器中最重要的部分。所谓组合逻辑控制器就是指指令译码电路是由组合逻辑实现的。
组合逻辑控制器又称硬连线控制器,是设计计算机的一种方法。这种控制器中的控制信号直接由各种类型的逻辑门和触发器等构成。这样,一旦控制部件构成后,除非重新设计和物理上对它重新连线,否则要想增加新的功能是不可能的。结构上这种缺陷使得硬连线控制器的设计和调试变得非常复杂而且代价很大。所以,硬连线控制器曾一度被微程序控制器所取代。但是随着新一代及其及VLSI技术的发展,这种控制器又得到了广泛重视,如RISC机广泛使用这种控制器。
图(1)是组合逻辑控制器的结构方框图。逻辑网络的输入信号来源有3个:①指令操作码译码器的输出In;②来自时序发生器的节拍典韦信号Tk;③来自执行部件的反馈信号Bj。逻辑网络的输出信号就是微操作控制信号,用来对执行部件进行控制。
组合逻辑控制器的基本原理可描述为:某一微操作控制信号Cm是指令操作码译码器的输出In、时序信号(节拍电位信号Tk)和状态条件信号Bj的逻辑函数。即Cm=f(In,Tk,Bj)
用这种方法设计控制器,需要根据每条指令的要求,让节拍电位和时序脉冲有步骤地去控制机器的各有关部分,一步一步地执行指令所规定的微操作,从而在一个指令周期内完成一条指令所规定的全部操作。
一般来说,组合逻辑控制器的设计步骤如下。
(1)绘制指令流程图
为了确定指令执行过程所需的基本步骤,通常是以指令为线索,按指令类型分类,将每条指令归纳成若干微操作,然后根据操作的先后次序画出流程图。
(2)安排指令操作时间表
指令流程图的进一步具体化,把每一条指令的微操作序列分配带各个机器周期的各个时序节拍信号上。要求尽量多的安排公共操作,罢免出现互斥。
(3)安排为命令表
以微命令为依据,表示在哪个机器周期的哪个节拍有哪些指令要求这些微命令。
(4)进行微操作逻辑综合
根据微操作时间表,将执行某一位操作的所有条件(哪条指令、哪个机器周期、哪个节拍和脉冲等)都考虑在内,加以分类组合,列出各微操作产生的逻辑表达式,并加以简化。
(5)实现电路
根据上面所得逻辑表达式,用逻辑门电路的组合或大规模集成电路来实现。
三、实验步骤
(1)将试验台设置成FPGA-CPU独立调试模式,REGSEL=0、CLKSEL=1、FDSEL=0。使用试验台上的单脉冲,即STEP_CLK短路子短接,短路子RUN_CLK断开。
(2)将设计在QuartusII下输入,变异后下载到TEC-CA上的FPGA中。
(3)拨动试验台上的开关SD5~SD0,改变IR[15..12]、进位标志C和结果为0标志Z,观察指示灯R10~R0显示的控制信号,并填写表(1)、表(2)。
(4)实验代码(带下划线部分为新加指令的代码):
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity instruction_decoder is
port (IRH: in std_logic_vector(3 downto 0);
c,z: in std_logic;
op_code: out std_logic_vector(2 downto 0);
c_z_j_flag: out std_logic;
lj_instruct: out std_logic;
DRWr: buffer std_logic;
Mem_Write: out std_logic;
DW_intruct: buffer std_logic;
change_z: out std_logic;
change_c: out std_logic;
sel_memdata: out std_logic
);
end instruction_decoder;
architecture behav of instruction_decoder is
signal zj_instruct, cj_instruct: std_logic; begin
sel_memdata <= IRH(3) and IRH(2) and (not IRH(1));
change_z <= ((not IRH(3)) and (not IRH(2)))
or ((not IRH(3)) and IRH(2) and (not IRH(1)))
or ((not IRH(3)) and IRH(2) and IRH(1) and (not IRH(0)));
change_c <= (not IRH(3)) and (not IRH(2));
c_z_j_flag <= (zj_instruct and (not z)) or (cj_instruct and (not c) or(zj_instruct and cj_instruct));
DRWr_proc: process(IRH)
begin
if IRH(3) = '0' then --算术逻辑指令
DRWr <= '1';
elsif IRH(2) = '1' and IRH(1) = '0' then --MVRD DR,DATA;LDR DR,SR
DRWr <= '1';
else
DRWr <= '0';