当前位置:文档之家› 计组-微程序控制器设计报告

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

实验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.vmodule 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 beginpc=0;endalways @ (posedge clk or posedge rst) beginif (rst==1)pc=0;else if (rom_out[1:0]==0)pc=pc+1;endalways @ * begincase (pc)0: opcode = 6'b000000; //R-type1: opcode = 6'b100011; //LW2: opcode = 6'b101011; //SW3: opcode = 6'b000100; //BEQ4: opcode = 6'b000010; //Jdefault: opcode = 6'b000000;endcaseendMicroCtrl MicroCtrl(clk, rst, opcode, rom_out);display display(system_clk, rom_out[17:2], anode4, segment4); always @ * beginled[1:0] = rom_out[1:0];led[2]=0;case (pc)0: led[7:3] = 5'b10000; //R-type1: led[7:3] = 5'b01000; //LW2: led[7:3] = 5'b00100; //SW3: led[7:3] = 5'b00010; //BEQ4: led[7:3] = 5'b00001; //Jdefault: led[7:3] = 5'b11111;endcaseendendmodulempc=0;endalways @ * begincase (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;endcaseendalways @ (posedge clk or posedge rst) begin if (rst==1)mpc=0;else begincase (rom_out[1:0])0: mpc=0;3: mpc=mpc+1;1: case (opcode)6'b000000: mpc=6; //R-type6'b100011: mpc=2; //LW6'b101011: mpc=2; //SW6'b000100: mpc=8; //BEQ6'b000010: mpc=9; //Jdefault: mpc=0;endcase2: case (opcode)6'b100011: mpc=3; //LW6'b101011: mpc=5; //SWdefault: mpc=0;endcaseendcaseendendendmoduleDisplay.vmodule display(input wire clk,input wire [15:0] digit,//显示的数据output reg [ 3:0] node, //4个数码管的位选output reg [ 7:0] segment);//七段+小数点reg [3:0] code = 4'b0;reg [15:0] count = 15'b0;always @(posedge clk) begincase (count[15:14])//与(count[1:0])的不同?起到分频的作用2'b00 : beginnode <= 4'b1110;code <= digit[3:0];end2'b01 : beginnode <= 4'b1101;code <= digit[7:4];end2'b10 : beginnode <= 4'b1011;code <= digit[11:8];end2'b11 : beginnode <= 4'b0111;code <= digit[15:12];endendcasecase (code)4'b0000: segment <= 8'b11000000;4'b0001: segment <= 8'b11111001;4'b0010: segment <= 8'b10100100;4'b0011: segment <= 8'b10110000;4'b0100: segment <= 8'b10011001;4'b0101: segment <= 8'b10010010;4'b0110: segment <= 8'b10000010;4'b0111: segment <= 8'b11111000;4'b1000: segment <= 8'b10000000;4'b1001: segment <= 8'b10010000;4'b1010: segment <= 8'b10001000;4'b1011: segment <= 8'b10000011;4'b1100: segment <= 8'b11000110;Timer_1ms.vmodule timer_1ms(input wire clk,output reg clk_1ms);reg [15:0] cnt;initial begincnt [15:0] <=0;clk_1ms <= 0;endalways@(posedge clk)if(cnt>=25000) begincnt<=0;clk_1ms <= ~clk_1ms;endelse begincnt<=cnt+1;endendmodule五、实验结果与分析1. 仿真结果如下(仿真时间较长,分2张图展示):Ox00c00 0x0300 2’b003.程序运行成功后,将代码下载到实验板spartan3上验证按动按钮,发现数码管上显示的数值即仿真输出码的[17:2]位,且出现顺序一致,说明程序成功。

六、讨论、心得此次微程序控制器设计功能较少,结构较简单,关键是理解微程序的原理。

相关主题