湘潭大学计算机原理 实验四 多周期MIPS CPU +存储器实验预习报告

2018-11-30 18:59

实验四 多周期MIPS CPU +存储器实验

一.实验目的

1、深入理解MIPS—CPU指令系统的功能和工作原理; 2、掌握多周期CPU的工作原理和逻辑功能实现;

3、熟练掌握用Verilog HDL语言设计多周期存储器的方法;

4、熟练掌握对多周期存储器的仿真实验验证和硬件测试两种调试方法; 5、通过对多周期CPU的运行情况进行观察和分析,进一步加深理解。

二.实验设备

硬件:现代计算机组成原理实验系统(兼)Nios 32位嵌入式系统实验开发平台 EP1C12Q240

Core(TM)i3-3240 CPU@3.40GHz 3.39GHz 1.91GB的内存 软件:QuartusII 13.0sp1 Microsoft Windows xp

三.实验内容

1、设计一个32位MIPS多周期CPU?具体的要求如下:? 至少运行下列的6类32条MIPS指令。 (1)算术逻辑指令?and、sub、addi

(2)逻辑运算指令?and、0r、xor、 andi、 ori、xori (3)位移指令?sll、srl、sra (4)条件分支指令?beq、bne、 (5)无条件跳转指令?j、jr (6)数据传送指令?lw、sw 2.设计一个存储器

四.实验原理与步骤

实现上述原理框图根据功能将其分划分为控制单元(cunit)、执行单元(eunit)、指令单元(iunit)以及存储单元(munit)四大模块。

(1).控制单元(cunit)是多周期微处理器的核心?控制微处理器取指令、指令译码和指令执行等工作。主要由指令译码器控制器(outputs control)、算术逻辑运算控制器(ALU control)两 个子模块组成。

(2).执行单元(eunit)主要由寄存器堆(registers)和算术逻辑单元(ALU)两个子模块组成。其中寄存器是微处理器最基本的元素?MIPS系统的寄存器堆由32个32位寄存器组成?而ALU则是微处理器的主要功能部件?执行加、减、比较等算术运算和与、或、或非、异或等逻辑运算。指令单元(iunit)的作用是决定下一条指令的地址PC值?。

(3).存储单元(munit)由存储器(memory)、指令寄存器(instruction register)和存储数据寄存 器(memory data register)组成。

五.实验源代码

寄存器元件代码:

module regfile (rna,rnb,d,wn,we,clk,clrn,qa,qb); input [4:0] rna,rnb,wn; input [31:0] d; input we,clk,clrn; output [31:0] qa,qb; reg [31:0] register [1:31]; assign qa = (rna == 0) ? 0 : register[rna]; assign qb = (rnb == 0) ? 0 : register[rnb];

always @ (posedge clk or negedge clrn) begin if (clrn == 0) begin integer i; for (i=1; i<32; i=i+1) register[i] <= 0; end else begin if ((wn != 0) && (we == 1)) register[wn] <= d; end end endmodule

32位四选一选择器:

module mux4x32 (a0,a1,a2,a3,s,y); input [31:0] a0,a1,a2,a3; input [1:0] s; output [31:0] y; function [31:0] select; input [31:0] a0,a1,a2,a3; input [1:0] s; case (s) 2'b00: select = a0; 2'b01: select = a1; 2'b10: select = a2; 2'b11: select = a3; endcase endfunction assign y = select (a0,a1,a2,a3,s); endmodule

//r1-r31 //read //read

//reset

//write

5位二选一选择器:

module mux2x5 (a0,a1,s,y); input [4:0] a0,a1; input s; output[4:0] y; assign y = s ? a1 : a0; endmodule

32位二选一选择器:

module mux2x32 (a0,a1,s,y); input [31:0] a0,a1; input s; output [31:0] y; assign y = s ? a1 : a0; endmodule

存储器元件:

module mcmem (clk, dataout, datain, addr, we, inclk, outclk); input [31:0] datain; input [31:0] addr; input clk, we, inclk, outclk; output [31:0] dataout; wire write_enable = we & ~clk; lpm_ram_dq ram

(.data(datain),.address(addr[7:2]),.we(write_enable),.inclock(inclk),.outclock(outclk),.q(dataout)); defparam ram.lpm_width = 32; defparam ram.lpm_widthad = 6; defparam ram.lpm_indata = \ defparam ram.lpm_outdata = \ defparam ram.lpm_file = \ defparam ram.lpm_address_control = \endmodule

控制部件:

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, // IF state sid = 3'b001, // ID state sexe = 3'b010, // EXE state smem = 3'b011, // MEM state swb = 3'b100; // WB state 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[1],~op[0]);

and(i_add,r_type, func[5],~func[4],~func[3],~func[2],~func[1],~func[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],~func[0]); and(i_srl,r_type,~func[5],~func[4],~func[3],~func[2], func[1],~func[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 // control signals' dfault outputs: wpc = 0; // do not write pc wir = 0; // do not write ir wmem = 0; // do not write memory wreg = 0; // do not write register file iord = 0; // select pc as memory address aluc = 4'bx000; // ALU operation: add alusrca = 0; // ALU input a: reg a or sa alusrcb = 2'h0; // ALU input b: reg b regrt = 0; // reg dest no: rd m2reg = 0; // select reg c shift = 0; // select reg a pcsource = 2'h0; // select alu output


湘潭大学计算机原理 实验四 多周期MIPS CPU +存储器实验预习报告.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:压力容器设计、校核、审核人员测试题(含答案)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: