计组-微程序控制器设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档