湘潭大学 计算机组成与原理 控制器实验 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湘 潭 大 学 实 验 报 告
课程名称 计算机原理与设计 实验名称 控制器实验 页数
专业 班级 同组者姓名 无 组别 学号 姓名 实验日期
一、实验目的
1.了解多周期 MIPS CPU 的控制部件的总体结构。
2.掌握多周期 MIPS CPU 的控制部件的状态转移。
3.掌握用 Verilog HDL 实现有限状态机的常用方法。
4.验证实验台多周期 MIPS CPU 控制部件的控制信号产生功能。
二、实验要求
1、做好实验预习:要求掌握周期 MIPS CPU 的控制部件的总体结构以及状态转移,并熟悉本实验中所用的控制台开关的作用和使用方法。
2、记录实验结果,包括以下内容:
①根据操作结果填好控制信号的真值表;
②按理论分析值给出对应的仿真波形。
3、写出实验报告,包括以下内容:
①列表比较实验数据的理论分析值与实验结果值;并对结果进行分析。实验结果与理论 分析值比较,有没有不同?为什么?
②通过本实验,你对周期MIPS CPU的控制部件的总体结构有何认识,有什么心得体会?
三、实验原理
多周期 MIPS CPU 的控制部件的总体结构如图 3-2-1 所示。 多周期 MIPS CPU 的控制部件的状态转移如图 3-2-2 所示。 本实验根据状态及指令直接对控制信号赋值,使用中间变量 next_state,意为下一状态。 在当前状态中,根据指令对 next_state 赋值,并在每个时钟上升沿把 next_state 打入状态寄 存器,这是用 Verilog HDL 实现有限状态机时常用的方法。模块设计如图 3-2-3 所示。
图 3-2-1 多周期 MIPS CPU 的控制部件的总体结构图
图 3-2-2 多周期 MIPS CPU 的控制部件的状态状态转移图
四、实验内容
(1)设计元件 在 Quartus II 环境下,用文本输入编辑器 Text Editor 输入 mccu.v 单元文件,编译 Verilog
HDL 文件,并将 mccu.v 单元文件制作成可调用的原理图元件。
(2)以原理图方式建立顶层文件工程 选择图形方式。根据图 3-2-3 输入实验电路图,从 Quartus II 的基本元件库中将各元件调 入图形编辑窗口、连线,添加输入输出引脚。 将所设计的图形文件保存到原先建立的文件夹中,将当前文件设置成工程文件,以后的 操作就都是对当前工程文件进行的。
(3)器件选择 选择 Cyclone 系列,在 Devices 中选择器件 EP1C12QC240C8。编译,引脚锁定,再编译。 引脚锁定后需要再次进行编译,才能将锁定信息确定下来,同时生成芯片编程/配置所需要 的各种文件。
(4)芯片编程 Programming(可以直接选择光盘中的示例已完成的设计进行验
证实验)打开编程窗口。将配置文件 mccu.sof 下载进 GW48 系列现代计算机组成原理系统中的 FPGA 中。
(5)选择实验系统的电路模式是 NO.0,验证控制部件的功能 设置 opfunc[5..0]、clk、op_func、z、clock、resetn 的值,验证控制部件的功能,记录实 验数据。
五、 实验环境与设备
GW48CP+主系统、pc机
六、实验代码设计(含符号说明)
module mccu (op,func,z,clock,resetn,wpc,wir,wmem,wreg,iord,regrt,m2reg,aluc,shift ,alusrca,alusrcb,pcsource,jal,sext,state);
input [5:0] op,func;
input z,clock,resetn;
output reg wpc,wir,wmem,wreg,iord,regrt,m2reg;
output reg [3:0] aluc;
output reg [1:0] alusrcb,pcsource;
output reg shift,alusrca,jal,sext;
output reg [2:0] state;
reg [2:0] next_state;
parameter [2:0] sif = 3'b000,
sid = 3'b001,
sexe = 3'b010,
smem = 3'b011,
swb = 3'b100;
wire r_type,i_add,i_sub,i_and,i_or,i_xor,i_sll,i_srl,i_sra,i_jr;
wire
i_addi,i_andi,i_ori,i_xori,i_lw,i_sw,i_beq,i_bne,i_lui,i_j,i_jal;
//and(r_type,~op[5],~op[4],~op[3],~op[2],~op)
and(r_type,~op[5],~op[4],~op[3],~op[2],~op[1],~op[0]);
and(i_add,r_type,func[5],~func[4],~func[3],~func[2],~func[1],~fun c[0]);
and(i_sub,r_type,func[5],~func[4],~func[3],~func[2],func[1],~func [0]);
and(i_and,r_type,func[5],~func[4],~func[3],func[2],~func[1],~func [0]);
and(i_or,r_type,func[5],~func[4],~func[3],func[2],~func[1],func[0 ]);
and(i_xor,r_type,func[5],~func[4],~func[3],func[2],func[1],~func[ 0]);
and(i_sll,r_type,~func[5],~func[4],~func[3],~func[2],~func[1],~fu nc[0]);
and(i_srl,r_type,~func[5],~func[4],~func[3],~func[2],func[1],~fun c[0]);
and(i_sra,r_type,~func[5],~func[4],~func[3],~func[2],func[1],func [0]);
and(i_jr,r_type,~func[5],~func[4],func[3],~func[2],~func[1],~func [0]);
and(i_addi,~op[5],~op[4],op[3],~op[2],~op[1],~op[0]);
and(i_andi,~op[5],~op[4],op[3],op[2],~op[1],~op[0]);
and(i_ori,~op[5],~op[4],op[3],op[2],~op[1],op[0]);
and(i_xori,~op[5],~op[4],op[3],op[2],op[1],~op[0]);
and(i_lw,op[5],~op[4],~op[3],~op[2],op[1],op[0]);
and(i_sw,op[5],~op[4],op[3],~op[2],op[1],op[0]);
and(i_beq,~op[5],~op[4],~op[3],op[2],~op[1],~op[0]);
and(i_bne,~op[5],~op[4],~op[3],op[2],~op[1],op[0]);
and(i_lui,~op[5],~op[4],~op[3],op[2],op[1],op[0]);
and(i_j,~op[5],~op[4],~op[3],~op[2],op[1],~op[0]);
and(i_jal,~op[5],~op[4],~op[3],~op[2],op[1],op[0]);
wire i_shift;
or (i_shift,i_sll,i_srl,i_sra);
always @ * begin
wpc = 0;
wir = 0;
wmem = 0;
wreg = 0;
iord = 0;