数学与计算机学院 计算机组成原理 实验报告
年级 *****级 学号 ********** 姓名 ***** 成绩
专业网络工程 实验地点 主楼528 指导教师 何欣枫
实验项目 CPU指令译码器 实验日期 20##-12-5
一、实验目的
(1)理解指令译码器的作用和重要性。
(2)学习设计指令译码器。
二、实验原理
指令译码器是计算机控制器中最重要的部分。所谓组合逻辑控制器就是指指令译码电路是由组合逻辑实现的。
组合逻辑控制器又称硬连线控制器,是设计计算机的一种方法。这种控制器中的控制信号直接由各种类型的逻辑门和触发器等构成。这样,一旦控制部件构成后,除非重新设计和物理上对它重新连线,否则要想增加新的功能是不可能的。结构上这种缺陷使得硬连线控制器的设计和调试变得非常复杂而且代价很大。所以,硬连线控制器曾一度被微程序控制器所取代。但是随着新一代及其及VLSI技术的发展,这种控制器又得到了广泛重视,如RISC机广泛使用这种控制器。
图6-42是组合逻辑控制器的方框图。逻辑网络的输入信号来源有3个:①指令操作码译码器的输出In;②来自时序发生器的节拍电位信号Tk;③来自执行部件的反馈信号Bj。逻辑网络的输出信号就是微操作控制信号,用来对执行部件进行控制。
图6-42 组合逻辑控制器的结构方框图
组合逻辑控制器的基本原理可描述位:某一微操作控制信号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显示的控制信号,并填写表6-28。
五、实验结果(程序)及分析
1、编写的VHDL代码及解释如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity decoder is
port (IRH :in std_logic_vector(3 downto 0);
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_intruct :buffer std_logic;
change_z :out std_logic;
change_c :out std_logic;
sel_memdata :out std_logic
);
end decoder; --以上是实体的定义部分。
architecture behav of 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));
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';
end if;
end process;
M_instruct:process(IRH)
begin
case IRH(3 downto 0) is
when "1000" | "1100" => --jmp addr;mvrd dr,data
Mem_Write <= '0';
DW_intruct <= '1';
when "1110" => -- str sr,dr
Mem_Write <= '1';
DW_intruct <= '0';
when "1011" =>--|"1111"
Mem_Write <='1';
DW_intruct<='1';
when others =>
Mem_Write <= '0';
DW_intruct <= '0';
end case;
end process;
ALUOP_CODE_PROC: PROCESS(IRH)
begin
if IRH(3) = '0' then
op_code <= IRH(2 downto 0);
else
op_code <= "111";
end if;
end process;
Jinstruct_PROC: process(IRH)
begin
case IRH(3 downto 0) is
when "1000" => --jmp adr
zj_instruct <= '0';
cj_instruct <= '0';
lj_instruct <= '1';
when "1001" => --jnc addr
zj_instruct <= '0';
cj_instruct <= '1';
lj_instruct <= '0';
when "1010" => --jnz addr
zj_instruct <= '1';
cj_instruct <= '0';
lj_instruct <= '0';
when "1011"=>
zj_instruct<='1';
cj_instruct<='1';
lj_instruct<='0';
when "1111"=>
zj_instruct<='0';
cj_instruct<='0';
lj_instruct<='0';
when others =>
zj_instruct <= '0';
cj_instruct <= '0';
lj_instruct <= '0';
end case;
end process;
end behav;
2、实验结果如表6-28所示:
表6-28 指令译码器实验(C=0且Z=0)
由上表可知,C和Z只影响与标志位有关的指令的结果。其中指令JNC ADR和JNZ ADR有条件转移,所以当C和Z的取值变化时,会影响实验结果。对于其他指令,C和Z的取值发生变化时结果不变。对于JNC ADR指令,其功能是:如果C=0,则PC←ADR;如果C=1,则PC←PC+1。当C=0时,c_z_j_flag=1,表示需要条件转移;当C=1时,转向下一条指令,c_z_j_flag=0。对于指令JNZ ADR,其功能是:如果Z=0,则PC←ADR;如果Z=1,则PC←PC+1。当Z=0时,c_z_j_flag=1,表示需要条件转移;当Z=1时,转向下一条指令,c_z_j_flag=0。
对于其他指令,不论C和Z取何值,实验结果不变。指令“ADD DR,SR”“INC DR” “SUB DE,SR”“DEC DR”结果一致,因为它们都是算术运算,都可能影响进位标志C和结果为0标志Z,只是它们的控制运算的编码OP[2..0]不同。指令“ADD DR,SR”“OR DR,SR”“OR DR”除表示运算编码不同外,其他结果相同,因为它们都是逻辑运算,不影响进位标志C,只影响结果为0标志Z。指令“MOV DR,SR”,功能是DR←SR,不影响标志位,但需要把执行结果写入目的寄存器,故DRWr=1。指令“JMP ADR”,功能是PC←ADR,是双字节指令,并且需要写入存储器,故lj_instruct=1,DW_instruct=1。指令“MVRD DR,DATA”,功能是DR←DATA,PC=PC+2,是双字节指令,并且写入目的寄存器的值来自读寄存器,故DW_instruct=1,DRWr=1,sel_memdate=1。指令“LDR DR,SR”,功能是DR←[SR],PC=PC+1,写入寄存器的值来自读寄存器,故,DRWr=1,sel_memdate=1。指令“STR SR,DR”,功能是[DR] ←SR,PC=PC+1,有存储器写操作,故Mem_Write=1。
第二篇:指令译码器实验报告
计算机组成与系统结构
指令译码器试验报告
姓 名:
试验时间:20xx年5月
一、实验名称:指令译码器的设计
二、实验原理:一台计算机能执行的机器指令的集合称为该机器的指令集或指令系统,它是构成程序的基本元素,也是硬件设计的依据,它衡量极其硬件的功能,反映硬件对软件支持的程度。而指令译码器所起到的作用就是根据用户所选择的指令代码来执行相关操作,将二进制代码转换为机器所能识别的机器码,设计时设置了一个6位二进制代码的指令输入端,输出端有各种控制信号,寄存器写信号,跳转信号,存储器写信号等等。
三、试验目的:使用指令译码器,使得我们使用简单的二进制代码,经过指令译码器转换为机器代码,从而很容易的使计算机执行相关操作,是cpu不可或缺的部件。
四、 Verilog源代码:
module
zlymq(op,func,RegWr,Branch,Jump,ExtOp,AluSrc,ALUctr,MemWr,MemtoReg,RegDst); input [5:0] op,func;
output RegWr,Branch,Jump,ExtOp,AluSrc,MemWr,MemtoReg,RegDst;
output [2:0] ALUctr;
reg RegWr,Branch,Jump,ExtOp,AluSrc,MemWr,MemtoReg,RegDst;
reg [2:0] ALUctr;
always @(op)
case (op)
6'b000000:
begin
{Branch,Jump,RegDst,AluSrc,MemtoReg,RegWr,MemWr}=7'b0010010; case (func)
6'b100000:ALUctr=3'b001;
6'b100010:ALUctr=3'b101;
6'b100011:ALUctr=3'b100;
6'b101010:ALUctr=3'b111;
6'b101011:ALUctr=3'b110;
endcase
end
6'b001101:
begin
{Branch,Jump,RegDst,AluSrc,MemtoReg,RegWr,MemWr,ExtOp}=8'b00010100; ALUctr=3'b010;
end
6'b001001:
begin
{Branch,Jump,RegDst,AluSrc,MemtoReg,RegWr,MemWr,ExtOp}=8'b00010101; ALUctr=3'b000;
end
6'b100011:
begin
{Branch,Jump,RegDst,AluSrc,MemtoReg,RegWr,MemWr,ExtOp}=8'b00011101; ALUctr=3'b000;
end
6'b101011:
begin
{Branch,Jump,AluSrc,RegWr,MemWr,ExtOp}=6'b001011;
ALUctr=3'b000;
end
6'b000100:
begin
{Branch,Jump,AluSrc,RegWr,MemWr}=5'b10000;
ALUctr=3'b100;
end
6'b000010:{Branch,Jump,RegWr,MemWr}=4'b0100;
endcase
Endmodule
五、试验心得:本次实验通过对指令译码器的编程,使我更加深刻的了解了计算机内部执行
一个操作的顺序,首先,取指令部件取到用户所输入的指令代码,然后转交给指令译码器转换成为机器能够识别的机器码,再转交给指令执行部件去执行,指令译码器将复杂的机器码简化成为了简单的二进制代码,从而大大增加了cpu的可行性。