CPU_指令译码器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验CPU指令译码器
一、实验目的
1、理解指令译码器的作用和重要性。

2、学习设计指令译码器。

二、实验原理
指令译码器是计算机控制器中最重要的部分。

所谓组合逻辑控制器就是指指令译码电路是由组合逻辑实现的。

组合逻辑控制器又称硬连线控制器,是设计计算机的一种方法。

这种控制器中的控制信号直接由各种类型的逻辑门和触发器等构成。

这样,一旦控制部件构成后,除非重新设计和物理上对它重新连线,否则要想增加新的功能是不可能的。

结构上这种缺陷使得硬连线控制器的设计和调试变得非常复杂而且代价很大。

所以,硬连线控制器曾一度被微程序控制器所取代。

但是随着新一代及其及VLSI技术的发展,这种控制器又得到了广泛重视,如RISC机广泛使用这种控制器。

逻辑网络的输入信号来源有3个:①指令操作码译码器的输出In;
②来自时序发生器的节拍典韦信号Tk;③来自执行部件的反馈信号Bj。

逻辑网络的输出信号就是微操作控制信号,用来对执行部件进行控制。

组合逻辑控制器的基本原理可描述位:某一微操作控制信号Cm是指令操作码译码器的输出In、时序信号(节拍电位信号Tk)和状态条件信号Bj的逻辑函数。


Cm=f(In,Tk,Bj)
用这种方法设计控制器,需要根据每条指令的要求,让节拍电位和时序脉冲有步骤地去控制机器的各有关部分,一步一步地执行指令所规定的微操作,从而在一个指令周期内完成一条指令所规定的全部操作。

一般来说,组合逻辑控制器的设计步骤如下。

(1)绘制指令流程图
(2)安排指令操作时间表
(3)安排为命令表
(4)进行微操作逻辑综合
(5)实现电路
三、实验要求
1、实验设计目标
本实验要求根据第2章中的实验CPU中使用的指令系统设计指令译码器。

本实验治理那个译码器的设计相对比较简单,节拍(t1、t2、和t3)因素只在存储器读写时需要对存储器地址分时使用时考虑,这里暂不考虑节拍脉冲t,也就是说微操作控制信号只是指令操作码In和Bj的函
数:
Cm=f(In,Bj)
时钟的In主要代表指令操作码IR[15..12],还有辅助操作码(如算术逻辑指令的IR[2..0],这里要求只考虑指令操作码IR[15..12]。

Bj代表进位标志C和结果为0标志Z。

要求产生的微操作控制信号如下:
op_code 控制ALU进行8种运算操作的3位编码。

c_z_j_flag 为1表示需要条件转移
lj_instruct 为1表示本条指令是“JMP ADR”指令。

DRWr 为1表示在t3的下降沿将本条指令的执行结果写入目的寄存器中。

Mem_Write 为1表示本条指令有存储器写操作,存储器的地址是目的寄存器中的内容。

DW_instruct 为1表示本条指令是双子指令。

change_z 为1表示本条指令可能改变Z(结果为0)标志。

change_c 为1表示本条指令可能改变C(进位)标志。

sel_memdata 为1表示本条指令写入目的寄存器的值来自读寄存器。

2、顶层设计实体的引脚要求
引脚要求的对应关系如下:
(1)指令IR[15..12]对应试验台开关SD3~SD0
进位C对应试验台开关SD4.
结果为0标志Z对应试验台开关SD5。

(2)控制信号对应如下:
op_code 指示灯R2、R1、R0
c_z_j_flag 指示灯R3
lj_instruct 指示灯R4
DRWr 指示灯R5
Mem_Write 指示灯R6
DW_instruct 指示灯R7
change_z 指示灯R8
change_c 指示灯R9
sel_memdata 指示灯R10
四、实验步骤
(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显示的控制信号,并填写下表。

指令译码器实验(C=0且Z=0)
OP[2..0]c_z_j_flag lj_instruct DRWr Mem_Write 指令IR
[15..12]
ADD
00000000010
DR
SR
JMP
10001110100
ADR
JNC
10011111000
ADR
JNZ
10101111000
ADR
MVRD
DR,
11001110010
DATA
LDR
11011110010
DR,SR
STR
11101110001
SR,DR
指令译码器实验(C=1且Z=0)
指令IR[15..12]OP[2..0]c_z_j_flag lj_instruct DRWr Mem_Write
JNC
10011110000
ADR
JNZ
10101111000
ADR
指令译码器实验(C=1且Z=1)
指令IR[15..12]OP[2..0]c_z_j_flag lj_instruct DRWr Mem_Write
JNC
10011110000
ADR
JNZ
10101110000
ADR
指令译码器实验(C=0且Z=1)
指令IR[15..12]OP[2..0]c_z_j_flag lj_instruct DRWr Mem_Write
JNC
10011111000
ADR
JNZ
10101110000
ADR
五、实验代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity ins_decode is
port(
IR:in std_logic_vector(15 downto 12);
C:in std_logic;
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_instruct:out std_logic;
change_z:out std_logic;
change_c:out std_logic;
sel_memdata:out std_logic
);
end entity;
architecture behav of ins_decode is
begin
process(IR)
begin
if(IR(15 downto 12) <"0111")then
change_z<=not IR(15);
else
change_z<='0';
end if;
if(IR(15 downto 12)<"0100")then
change_c<=not IR(15);
else
change_c<='0';
end if;
sel_memdata<=IR(15)and IR(14) and (not IR(13)); end process;
--change_c<=not IR(15) and C; DRWr_proc:process(IR)
begin
if(IR(15)='0')then
-- if(IR(0)='1')then
if(IR(15 downto 12)<"1000")then DRWr<='1';
else
DRWr<='0';
end if;
elsif(IR(14)='1'and IR(13)='0')then -- if(IR(14)='1'and IR(13)='0')then DRWr<='1';
else
DRWr<='0';
end if;
end process;
M_instruct:process(IR)
begin
case IR(15 downto 12)is
when "1000"|"1100"=>
Mem_Write<='0';
DW_instruct<='1';
when "1110"=>
Mem_Write<='1';
DW_instruct<='0';
when others=>
Mem_Write<='0';
DW_instruct<='0';
end case;
end process;
ALU_OP:process(IR)
begin
if(IR(15)='0')then
op_code<=IR(14 downto 12);
else
op_code<="111";
end if;
end process;
instruct_pro:process(IR)
begin
case IR(15 downto 12)is
when "1000" =>
c_z_j_flag<='0';
lj_instruct<='1';
when "1001"=>
if(C='0')then
c_z_j_flag<='1';
else
c_z_j_flag<='0';
end if;
lj_instruct<='0';
when "1010"=>
if(Z='0')then
c_z_j_flag<='1';
else
c_z_j_flag<='0';
end if;
lj_instruct<='0';
when others=>
c_z_j_flag<='0';
lj_instruct<='0';
end case;
end process;
end architecture;。

相关文档
最新文档