计组-微程序控制器设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验10 微程序控制器设计实验报告
姓名:X XX 学号:X XX 专业:计算机科学与技术
课程名称:计算机组成同组学生姓名:无
实验时间:实验地点:指导老师:XXX
一、实验目的和要求
1.掌握微程序控制原理
2.掌握微程序控制器的设计方法
二、实验内容和原理
实验内容:
1.设计一个微程序控制单元并进行仿真
实验原理:
1.微程序的原理:
●在多时钟CPU设计的实验中,所有的控制信号均根据操作码以及所处的时钟
周期,由组合逻辑的方式产生各个状态下的控制信号。
●微程序是将CPU每条指令和所有时钟的控制信号,预先以二进制形式写在控
制存储器中。
●多时钟周期的每个状态都对应一组控制信号。
●每条指令都有若干个状态对应若干组控制信号。
●微指令按一定顺序存放在控制存储器中。
2.工作原理图
3.微程序控制逻辑图
4.微指令及其控制码
5.控制存储器内容
三、主要仪器设备
1.Spartan-III开发板1套
2.装有ISE的PC机1台
四、操作方法与实验步骤
实验步骤:
1.创建新的工程和新的源文件
2.编写verilog代码(包括以下模块top,MicroCtrl,pbdebounce,time_1ms)
3.对程序进行波形仿真
4.编写UCF引脚文件,通过编译。
5.. 生成FPGA代码,下载到实验板上并调试,看是否与实现了预期功能
实验代码:
Top.v
module top(
input system_clk,
input clk_i,
input rst_i,
output [3:0] anode4,
output [7:0] segment4,
output reg [7:0] led
);
wire clk;
wire rst;
reg [2:0] pc;
reg [5:0] opcode;
wire [17:0] rom_out;
pbdebounce p0(system_clk, clk_i, clk);
pbdebounce p1(system_clk, rst_i, rst);
initial begin
pc=0;
end
always @ (posedge clk or posedge rst) begin
if (rst==1)
pc=0;
else if (rom_out[1:0]==0)
pc=pc+1;
end
always @ * begin
case (pc)
0: opcode = 6'b000000; //R-type
1: opcode = 6'b100011; //LW
2: opcode = 6'b101011; //SW
3: opcode = 6'b000100; //BEQ
4: opcode = 6'b000010; //J
default: opcode = 6'b000000;
endcase
end
MicroCtrl MicroCtrl(clk, rst, opcode, rom_out);
display display(system_clk, rom_out[17:2], anode4, segment4); always @ * begin
led[1:0] = rom_out[1:0];
led[2]=0;
case (pc)
0: led[7:3] = 5'b10000; //R-type
1: led[7:3] = 5'b01000; //LW
2: led[7:3] = 5'b00100; //SW
3: led[7:3] = 5'b00010; //BEQ
4: led[7:3] = 5'b00001; //J
default: led[7:3] = 5'b11111;
endcase
end
endmodule
mpc=0;
end
always @ * begin
case (mpc)
0: rom_out={16'h0851,2'b11};
1: rom_out={16'h1800,2'b01};
2: rom_out={16'h3000,2'b10};
3: rom_out={16'h00C0,2'b11};
4: rom_out={16'h0300,2'b00};
5: rom_out={16'h00A0,2'b00};
6: rom_out={16'hA000,2'b11};
7: rom_out={16'h0500,2'b00};
8: rom_out={16'h6006,2'b00};
9: rom_out={16'h0009,2'b00};
default: rom_out=0;
endcase
end
always @ (posedge clk or posedge rst) begin if (rst==1)
mpc=0;
else begin
case (rom_out[1:0])
0: mpc=0;
3: mpc=mpc+1;
1: case (opcode)
6'b000000: mpc=6; //R-type
6'b100011: mpc=2; //LW
6'b101011: mpc=2; //SW
6'b000100: mpc=8; //BEQ
6'b000010: mpc=9; //J
default: mpc=0;
endcase
2: case (opcode)
6'b100011: mpc=3; //LW
6'b101011: mpc=5; //SW
default: mpc=0;
endcase
endcase
end
end
endmodule