硬件基础微程序控制器实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖南大学
HUNAN UNIVERSITY
硬件基础实验2
实验报告
一、实验预习
1.书中的图形实现微程序控制器,中间的映射逻辑究竟是怎么实现的?
答:但出现分支时,预设端信号由IR决定。IR为1时信号有效,输出为1.
通过IR的值映射为下址的低三位,从而产生下址。
2.书中设计用到了强写强读,为什么要设计这个功能?
答:满足用户因为没有初始化mif文件时输入数据的需要。
二、实验目的
微程序控制器实验的主要任务:生成CPU里的控制信号,并使程序按正
确的顺序执行。核心部分是ROM,存放机器指令的微程序。
1、掌握微程序控制器的组成、工作原理;
2、掌握微程序控制器的基本概念和术语:微命令、微
操作、微指令、微
程序等;
3、掌握微指令、微程序的设计及调试方法;
4、通过单步运行若干条微指令,深入理解微程序控制
器的工作原理;
二、实验电路
图1
附:电路图过大,请放大观察详情
三、实验原理
将机器指令的操作(从取指到执行)分解为若干个更基本的微操作序列,并将有
关的控制信息(微命令)以微码的形式编成微指令输入到控制存储器中。这样,
每条机器指令将与一段微程序对应,取出微指令就产生微命令,以实现机器指令
要求的信息传送与加工。
四、实验步骤及概述
1)设计状态机部分
a、编写VHDL代码如下
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY zhuangtaiji IS
PORT (
reset : IN STD_LOGIC := '0';
clock : IN STD_LOGIC;
qd : IN STD_LOGIC := '0';
dp : IN STD_LOGIC := '0';
tj : IN STD_LOGIC := '0';
t1 : OUT STD_LOGIC;
t2 : OUT STD_LOGIC;
t3 : OUT STD_LOGIC;
t4 : OUT STD_LOGIC
);
END zhuangtaiji;
ARCHITECTURE BEHAVIOR OF zhuangtaiji IS TYPE type_fstate IS
(idle,st1,s_st2,st4,st2,st3,s_st4,s_st3);
SIGNAL fstate : type_fstate;
SIGNAL reg_fstate : type_fstate;
BEGIN
PROCESS (clock,reset,reg_fstate)
BEGIN
IF (reset='1') THEN
fstate <= idle;
ELSIF (clock='1' AND clock'event) THEN fstate <= reg_fstate;
END IF;
END PROCESS;
PROCESS (fstate,qd,dp,tj)
BEGIN
t1 <= '0';
t2 <= '0';
t3 <= '0';
t4 <= '0';
CASE fstate IS
WHEN idle =>
IF (NOT((qd = '1'))) THEN
reg_fstate <= st1;
ELSE
reg_fstate <= idle;
END IF;
t1 <= '0';
t2 <= '0';
t4 <= '0';
WHEN st1 =>
IF (((tj = '1') AND NOT((dp = '1')))) THEN
reg_fstate <= st1;
ELSIF (((dp = '1') AND NOT((tj = '1')))) THEN
reg_fstate <= s_st2;
ELSE
reg_fstate <= st2;
END IF;
t1 <= '1';
t2 <= '0';
t3 <= '0';
t4 <= '0';
WHEN s_st2 =>
IF ((tj = '1')) THEN
reg_fstate <= s_st2;
ELSE
reg_fstate <= s_st3;
END IF;
t2 <= '1';
t3 <= '0';
t4 <= '0';
WHEN st4 =>
IF (((tj = '1') AND NOT((dp = '1')))) THEN
reg_fstate <= st4;
ELSIF (((dp = '1') AND NOT((tj = '1')))) THEN
reg_fstate <= idle;
ELSE
reg_fstate <= st1;
END IF;
t1 <= '0';
t2 <= '0';
t3 <= '0';
t4 <= '1';
WHEN st2 =>
IF (((tj = '1') AND NOT((dp = '1')))) THEN
reg_fstate <= st2;