文档库 最新最全的文档下载
当前位置:文档库 › 类MIPS单周期处理器.doc

类MIPS单周期处理器.doc

类MIPS单周期处理器.doc
类MIPS单周期处理器.doc

一、实验目的

1.了解微处理器的基本结构。

2.掌握哈佛结构的计算机工作原理。

3.学会设计简单的微处理器。

4.了解软件控制硬件工作的基本原理。

二、实验任务

利用 HDL 语言,基于 Xilinx FPGA nexys4实验平台,设计一个能够执行以下MIPS 指令集的单周期类MIPS 处理器,要求完成所有支持指令的功能仿真,验证指令执行的正确性,要求编写汇编程序将本人学号的ASCII 码存入 RAM 的连续内存区域。

(1)支持基本的算术逻辑运算如 add,sub,and ,or,slt ,andi 指令

(2)支持基本的内存操作如 lw, sw 指令

(3)支持基本的程序控制如 beq,j 指令

三、实验过程

1、建立工程

在ISE 14.7软件中建立名为 Lab1 的工程文件。芯片系列选择 Artix7, 具体芯片型号选择 XC7A100T,封装类型选择 CSG324,速度信息选择 -1 。

2、分模块设计

1)指令存储器 ROM 设计

新建 IP core Generator,命名为 irom 。设定的指令存储器大小为128 字,指令存储器模块在顶层模块中被调用。输入为指令指针(PC)与时钟信号(clkin),输出为 32 位的机器指令,并将输出的机器指令送到后续的寄存器组模块、控制

器模块、立即数符号扩展模块进行相应的处理。

然后制作 COE 文件。先使用 UltraEdit 编辑代码,代码如下

main:

addi $2,$0,85

sw $2,0($3)

addi $2,$0,50

sw $2,4($3)

addi $2,$0,48

sw $2,8($3)

addi $2,$0,49

sw $2,12($3)

addi $2,$0,53#

sw $2,16($3)

addi $2,$0,49#

sw $2,20($3)

addi $2,$0,51#

sw $2,24($3)

addi $2,$0,52#

sw $2,28($3)

addi $2,$0,54#

sw $2,32($3)

addi $2,$0,52#

sw $2,36($3)

j main

将其导入 QtSpim 中,选中机器码,加上前缀并将最后一行0x08100009 修改为 0x08000000,代码如下

MEMORY_INITIALIZATION_RADIX=16;

MEMORY_INITIALIZATION_VECTOR=

20020055,

ac620000,

20020032,

ac620004,

20020030,

ac620008,

20020031,

ac62000c,

20020035,

ac620010,

20020031,

ac620014,

20020033,

ac620018,

20020034,

ac62001c,

20020036,

ac620020,

20020034,

ac620024,

08000000,

保存为 .coe 文件,在 ROM 模块里调用。

2)数据存储器 RAM 设计

新建 IP core Generator ,命名为 dram 。数据存储器为RAM 类型的存储器,并且需要独立的读写信号控制。因此其对外的接口为clk、we、datain 、addr ;输

出信号为 dataout 。当时钟上升沿到来时,如果写信号(we)为真,根据 addr 所

表示的地址找到对应的存储单元,并将输入的数据(datain )写到对应的存储单

元中;如果写信号为假,则根据addr 所表示的地址,将对应存储单元的数据送

到输出端( dataout )。在本实验中调用 ISE提供的 IP 核进行设计,设定的数据存

储器大小为 64 字。

数据存储器模块在顶层模块中被调用。输入的时钟信号来自于顶层模块的clkin,addr 信号来自于ALU 单元的输出端(对基地址与偏移量执行加操作),datain 来自于寄存器组的第二个数据输出端(Rtdata),而控制信号we则来自于

控制器对指令的译码。输出数据dataout 通过一个选择器( MUX3 )决定是否写

入到相应的寄存器。

初始化 dram 值: 0x55555555,在以后的仿真过程中可以用于验证是否正确调用

3)立即数符号扩展模块设计

对于 I 型指令,将指令的低十六位作为立即数符号扩展模块的输入inst[15:0], 如果十六位立即数的最高位(即符号位)为1,则在 inst[15:15]前面补 16 个 1,

如果为 0,则在前面补 16 个 0。然后将符号扩展之后的data[31:0] 通过一个选择

器(即 MUX2)输送到 ALU 单元的第二个源操作数输入端(即input2 )。

代码如下:

module signext(

input [15:0] inst,

output [31:0] data

);

assign data=inst[15:15]?{16'hffff,inst}:{16'h0000,inst};

endmodule

4)寄存器组模块

该模块的输入为 clk、RegWriteData 、RegWriteAddr 、RegWriteEn、RsAddr、RtAddr 和 reset,输出信号为RsData 和 RtData。由于 $0 一直输出0,因此当RsAddr、RtAddr 为 0 时,RsData 以及 RtData 必须输出 0,否则输出相应地址寄

存器数据。另外,当 RegWriteEn 信号有效时,数据应该写入 RegWriteAddr 寄存

器,并且每次复位时所有寄存器都清零。

寄存器组模块在顶层模块中被调用。clk 信号来自于顶层模块的clkin,reset 信号来自于顶层模块的reset,RegWriteData 来自于 ALU 单元的运算结果输出端

或者是数据存储器的输出端(通过一个选择器MUX3 进行选择),RegWriteAddr 、RsAddr、RtAddr 来自于指令的对应位, RegWriteEn 来自于控制器对指令的译码。

输出信号 Rsdata 与 Rtdata 则分别来自于 Rsaddr 与 Rtaddr 对应的寄存器。

代码如下:

module regFile(

input clk,

input reset,

input [31:0] regWriteData,

input [4:0] regWriteAddr,

input regWriteEn,

output [31:0] RsData,

output [31:0] RtData,

input [4:0] RsAddr,

input [4:0] RtAddr

);

reg[31:0] regs[0:31];

assign RsData = (RsAddr == 5'b0)?32'b0:regs[RsAddr];

assign RtData = (RtAddr == 5'b0)?32'b0:regs[RtAddr];

integer i;

always @(posedge clk)

begin

if(!reset)

begin

if(regWriteEn==1)

begin

regs[regWriteAddr]=regWriteData;

end

end

else

begin

for(i=0;i<31;i=i+1)

regs[i]=0;

regs[31]=32'hffffffff;

end

end

endmodule

5)控制器模块

控制器输入为指令的opCode 字段,即操作码。操作码经过主控制单元的译码,给 ALUCtrl、Data Memory 、Registers、Muxs 等部件输出正确的控制信号。

该模块在顶层模块中被调用,输入的opcode 来自于指令的前 6 位,而输出信号 aluSrc、MemToReg 、RegWrite 、MemRead 、MemWrite 、branch 、aluop 和jmp 则是对 6 位 opcode 的译码。

代码如下:

module ctr(

input [5:0] opCode,

output regDst,

output aluSrc,

output memToReg,

output regWrite,

output memRead,

output memWrite,

output branch,

output [1:0] aluop,

output jmp

);

reg regDst;

reg aluSrc;

reg memToReg;

reg regWrite;

reg memRead;

reg memWrite;

reg branch;

reg[1:0] aluop;

reg jmp;

always @(opCode) begin

case(opCode)

6'b000010://jmp

begin

regDst=0;

aluSrc=0;

memToReg=0;

regWrite=0;

memRead=0;

memWrite=0;

branch=0;

aluop=2'b00;

jmp=1;

end

6'b000000://R begin

regDst=1; aluSrc=0; memToReg=0; regWrite=1; memRead=0; memWrite=0; branch=0; aluop=2'b10; jmp=0;

end

6'b100011://lw begin

regDst=0; aluSrc=1; memToReg=1; regWrite=1; memRead=1; memWrite=0; branch=0; aluop=2'b00; jmp=0;

end

6'b101011://sw begin

regDst=0; aluSrc=1; memToReg=0; regWrite=0; memRead=0; memWrite=1;

branch=0;

aluop=2'b00;

jmp=0;

end

6'b000100://beq begin

regDst=0;

aluSrc=0; memToReg=0; regWrite=0; memRead=0; memWrite=0; branch=1;

aluop=2'b01;

jmp=0;

end

//6'b001100://andi 6'b001000://andi begin

regDst=0;

aluSrc=1; memToReg=0; regWrite=1; memRead=0; memWrite=0; branch=0;

//aluop=2'b11; aluop=2'b00;

jmp=0;

end

default:

begin

regDst=0;

aluSrc=0;

memToReg=0;

regWrite=0;

memRead=0;

memWrite=0;

branch=0;

aluop=2'b00;

jmp=0;

end

endcase

end

endmodule

6)运算器 (ALU)模块

微处理器支持的 add 、sub、and 、or 和 slt 运算指令,需要利用ALU 单元实现运算,同时数据存储指令sw 和 lw 也需要通过 ALU 单元计算存储器地址,条

件跳转指令 beq 需要 ALU 来比较两个寄存器是否相等。所有这些指令包含的操

作为加、减、与、或和小于设置 5 钟不同的操作。

该模块根据输入控制信号对输入数据进行相应的操作,并获得输出结果以及零标识,由于 MIPS 处理器 ALU 单元利用 4 根输入控制信线的译码决定执行何种

操作,于是该操作的输入接口为input1 、input2 和 aluCtr,输出端口为zero 和aluRes。

ALU 模块在顶层模块被调用。 input1 来自于寄存器组模块输出信号Rsdata,input2 来自于寄存器组模块输出信号Rtdata 或者是立即数符号扩展模块的输出

信号(通过一个选择器MUX2 进行选择),aluCtr 来自于 aluctr 模块的输出端。

aluRes 与 zero 为 ALU 单元的运算结果,其中zero 主要用于 beq 指令。

代码如下:

module ALU(

input [31:0] input1,

input [31:0] input2,

input [3:0] aluCtr,

output [31:0] aluRes,

output zero

);

reg zero;

reg[31:0] aluRes;

always @(input1 or input2 or aluCtr)

begin

case(aluCtr)

4'b0110:

begin

aluRes=input1-input2;

if(aluRes==0)

zero=1;

else

zero=0;

end

4'b0010:

aluRes=input1+input2;

4'b0000:

aluRes=input1&input2;

4'b0001:

aluRes=input1|input2;

4'b1100:

aluRes=~(input1|input2);

4'b0111:

begin

if(input1

aluRes = 1;

end

default:

aluRes = 0;

endcase

end

endmodule

7)ALU 控制设计

MIPS 指令中具有 6 位操作码,如果为R 型指令,进一步采用 6 位功能码来表示 R 型指令的具体操作。由于设计的微处理器支持的运算类指令全部为R 型指令,因此可以通过对R 型指令的 6 位功能码编码产生ALU 的 4 为控制信号。

但是 lw、sw 以及 beq 、j 型指令没有功能码,因此需要区分指令的类型。由于只

有三类指令需要ALU 单元,因此可以采用两位二进制码对指令的ALU 操作类型

进行编码。指令的ALU 操作类型编码由指令译码器产生。

通过 2 位操作类型码以及 6 位指令功能码就可以产生ALU 单元的 4 位控制信号。

该模块的主要功能就是根据译码控制单元产生的 2 位操作码以及 6 位功能码产生 4 位 ALU 控制信号,因此输入信号为aluop (2 位)、 funct ( 6 位),输出

信号为 aluctr (4 位)。ALU 控制模块在顶层模块被调用。aluop 来自于控制器对

指令的 6 位 opcode 的译码,而 funct 来自于指令的后 6 位。

代码如下:

module aluctr(

input [1:0] ALUOp,

input [5:0] funct,

output [3:0] ALUCtr

);

reg[3:0] ALUCtr;

always @(ALUOp or funct)

casex({ALUOp,funct})

8'b00xxxxxx:ALUCtr=4'b0010;

8'b01xxxxxx:ALUCtr=4'b0110;

8'b11xxxxxx:ALUCtr=4'b0000;

8'b10xx0000:ALUCtr=4'b0010;

8'b10xx0010:ALUCtr=4'b0110;

8'b10xx0100:ALUCtr=4'b0000;

8'b10xx0101:ALUCtr=4'b0001;

8'b10xx1010:ALUCtr=4'b0111;

endcase

endmodule

8)顶层模块设计

本次实验中多路复用器模块MUX 以及 PC 模块综合在顶层模块之中,顶层模块需要将前面的多个模块实例化后,通过导线以及多路复用器将各个部件连接起来,并且在时钟的控制下修改PC 的值, PC 是一个 32 位的寄存器,每个时钟沿自动增加 4。

多路复用器 MUX 直接通过三目运算符实现,例如

assign OUT = SEL ? INPUT1 : INPUT2;

其中, OUT、 SEL、INPUT1 和 INPUT2 都是预先定义的信号。

代码如下:

module top(

input clkin,

input reset

);

reg[31:0] pc,add4;

wire choose4;

wire[31:0] expand2,mux2,mux3,mux4,mux5,address,jmpaddr,inst; wire[4:0] mux1;

//wire for controller

wire reg_dst,jmp,branch,memread,memwrite,memtoreg;

wire[1:0] aluop;

wire alu_src,regwrite;

//wire for aluunit

wire zero;

wire[31:0] aluRes;

//wire for aluctr

wire[3:0] aluCtr;

//wire for memory

wire[31:0] memreaddata;

//wire for register

wire[31:0] RsData,RtData;

//wireforext

wire[31:0] expand;

always @(negedge clkin)

begin

if(!reset) begin

pc=mux5;

add4=pc+4;

end

else begin

pc=32'b0;

add4=32'h4;

end

end

ctr mainctr(

.opCode(inst[31:26]),

.regDst(reg_dst),

.aluSrc(alu_scr),

.memToReg(memtoreg),

.regWrite(regwrite),

.memRead(memread),

.memWrite(memwrite),

.branch(branch),

.aluop(aluop),

.jmp(jmp));

ALU alu(.input1(RsData), .input2(mux2),

.aluCtr(aluCtr),

.zero(zero),

.aluRes(aluRes));

aluctr aluctr1(.ALUOp(aluop), .funct(inst[5:0]),

.ALUCtr(aluCtr));

dram dmem(

.a(aluRes[7:2]),

.d(RtData),

.clk(!clkin),

.we(memwrite),

.spo(memreaddata)

);

irom imem(

.a(pc[8:2]),

.clk(clkin),

.spo(inst)

);

regFile regfile(

.RsAddr(inst[25:21]),

.RtAddr(inst[20:16]),

.clk(!clkin),

.reset(reset),

.regWriteAddr(mux1),

.regWriteData(mux3),

.regWriteEn(regwrite),

.RsData(RsData),

.RtData(RtData)

);

signext signext(.inst(inst[15:0]),.data(expand));

assign mux1=reg_dst?inst[15:11]:inst[20:16];

assign mux2=alu_scr?expand:RtData;

assign mux3=memtoreg?memreaddata:aluRes;

assign mux4=choose4?address:add4;

assign mux5=jmp?jmpaddr:mux4;

assign choose4=branch&zero;

assign expand2=expand<<2;

assign jmpaddr={add4[31:28],inst[25:0],2'b00};

assign address=pc+expand2;

endmodule

3、各模块仿真

1)寄存器组仿真

代码如下:

module regFile(

input clk,

input reset,

input [31:0] regWriteData,

input [4:0] regWriteAddr,

input regWriteEn,

output [31:0] RsData,

output [31:0] RtData,

input [4:0] RsAddr,

input [4:0] RtAddr

);

reg[31:0] regs[0:31];

assign RsData = (RsAddr == 5'b0)?32'b0:regs[RsAddr];

assign RtData = (RtAddr == 5'b0)?32'b0:regs[RtAddr];

integer i;

always @(posedge clk)

begin

if(!reset)

begin

if(regWriteEn==1)

begin

regs[regWriteAddr]=regWriteData;

end

end

else

begin

for(i=0;i<31;i=i+1)

regs[i]=0;

regs[31]=32'hffffffff;

end

end

endmodule

仿真结果如下:

Reset 高电平下输出为0,Reset 无效后,正常输入和输出数据,Reset 正常工作。

第一次for 循环的地址范围输出数据在低电平时输出0 ,高电平输出0x55aaaa55,如图所示,说明数据是在时钟上升沿写入,之后输出的数据与写入的数据相同,数据都保存在了寄存器组中,工作正常。

2)顶层模块仿真

代码如下:

module topsim;

//Inputs

reg clkin;

reg reset;

//Instantiate the Unit Under Test (UUT)

top uut (

.clkin(clkin),

.reset(reset)

);

initial begin

//Initialize

Inputs clkin = 0;

reset = 0;

//Add stimulus

here #100;

reset = 1;

#100;

reset = 0;

end

parameter PERIOD = 20;

always begin

clkin = 1'b0;

#(PERIOD/2) clkin = 1'b1;

#(PERIOD/2);

end

endmodule

仿真结果如下

100ns 之前,为不定态。清零信号未使能100ns 之后,清零信号使能

可以看到 $2 寄存器内已经存入学

学号也已经写入RAM 中

四、实验总结

本次实验由许多模块组成,在仿真调试时难免会出现失误,第一次顶层模块仿真时,我的学号并没有写入RAM 中,经过排查,主控制器模块中有关addi 指令的 opcode 输入错误,对照表格改正之后,还是没有显示相应波形。我又检查

到ALU 控制模块, ALUop=00 对应的 ALUCtr 码错误,对照表改正后,总体运行

正常,学号也正确写入 RAM 中。

这次实验使我对类 MIPS 单周期处理器又有了更深的了解,同时也加强了我

对 Verilog 语言的运用。我在本次实验中的不足之处在于排查出一个错误之后没

有立刻去检查相关的部分,这导致我发现第二个错误的时候花费了许多时间,如果在第一次仿真出现问题时能够及时排查相关联的另外的部分,就能够提高效率。

MIPS单周期CPU设计2018版体会

11条MIPS指令单周期CPU设计 2018元月份,我按照袁春风老师的第三版教材,又重新设计了11条MIPS 指令的单周期CPU。这次的设计与我2017年7月份的单周期CPU还是有些区别。2017年7月份设计的CPU主要是参考《计算机组成与设计-硬件/软件接口David A.Patterson》。 设计中的几点体会如下: 一.基本流程 1.首先要分析清楚这11条指令的格式和特点。按照MIPS指令的格式和特 点,完全掌握它们的功能和执行的过程。 2.这些指令执行过程中需要哪些硬件部件和控制信号,这些部件如何连接 构成数据通路。 3.对所有需要的控制信号进行归纳分析,列出真值表,设计相应的控制电 路。 二.具体设计过程 1.ALU的设计。ALU的设计重点在于先设计出32位的加法器,减法运算是利用 加法的“变反加一”。同时要产生各种运算结果的信号:溢出(OF)、进位(CF)、符号位(SF)、零符号位(Zero)。OF=C n⊕C n-1;CF=C out⊕C in。至于需要其它的运算指令,如逻辑运算、移位运算、乘除法运算,都可以直接调用logisim库中的器件,添加到ALU中,这些运算的结果可以同时产生,只是最后用多路选择器来选择那种指令的结果输出,用的控制信号是OPctr。在ALU中需要设计一个控制信号生成部件,用于产生ALU内部需要的各种控制信号。见袁春风老师教材P155。(第一次实验:ALU部件的设计)(ALU设计中,现在的加法器只是串行的,可以让好的学生用先行进位加法器)

图1:ALU电路图 2.设计寄存器部件。设计一个32个*32位的寄存器部件。两路输入和两路输出, 可读写。(第二次实验:寄存器部件的设计) 图2:寄存器电路图 3.数据通路的设计。通路的设计不能急于求成,要一条指令一条指令来分析和 设计。首先设计R-type中的add、sub、subu、slt、sltu等的通路。要注意是否要判断溢出。在此基础上,再分析I-type带立即数运算指令的数据通路,分析出需要添加哪些部件。再分析sw、lw指令的数据通路,分支指

单周期CPU实验报告

MIPS-CPU设计实验报告

实验名称:32位单周期MIPS-CPU设计 姓名学号:刘高斯11072205 实验日期:2014年12月19日 目录 前言 MIPS简介------------------------------------------------------------- 3 实验目的------------------------------------------------------------- 3 第一部分VERILOG HDL 语言实现部分 实验内容------------------------------------------------------------- 4 试验环境------------------------------------------------------------- 4 模块简介------------------------------------------------------------- 4 实验截图------------------------------------------------------------- 5 实验感想------------------------------------------------------------- 5 实验代码------------------------------------------------------------- 6 第二部分LOGISIM 语言实现部分 实验内容------------------------------------------------------------- 16 实验环境------------------------------------------------------------- 16

(完整版)类MIPS单周期处理器

一、实验目的 1.了解微处理器的基本结构。 2.掌握哈佛结构的计算机工作原理。 3.学会设计简单的微处理器。 4.了解软件控制硬件工作的基本原理。 二、实验任务 利用HDL语言,基于Xilinx FPGA nexys4实验平台,设计一个能够执行以下MIPS指令集的单周期类MIPS处理器,要求完成所有支持指令的功能仿真,验证指令执行的正确性,要求编写汇编程序将本人学号的ASCII码存入RAM的连续内存区域。 (1)支持基本的算术逻辑运算如add,sub,and,or,slt,andi指令 (2)支持基本的内存操作如lw,sw指令 (3)支持基本的程序控制如beq,j指令 三、实验过程 1、建立工程 在ISE 14.7软件中建立名为Lab1 的工程文件。芯片系列选择Artix7,具体芯片型号选择XC7A100T,封装类型选择CSG324,速度信息选择-1。

2、分模块设计 1)指令存储器ROM设计 新建IP core Generator,命名为irom。设定的指令存储器大小为128字,指令存储器模块在顶层模块中被调用。输入为指令指针(PC)与时钟信号(clkin),输出为32位的机器指令,并将输出的机器指令送到后续的寄存器组模块、控制器模块、立即数符号扩展模块进行相应的处理。 然后制作COE文件。先使用UltraEdit编辑代码,代码如下 main: addi $2,$0,85 sw $2,0($3) addi $2,$0,50 sw $2,4($3) addi $2,$0,48 sw $2,8($3) addi $2,$0,49 sw $2,12($3) addi $2,$0,53 # sw $2,16($3) addi $2,$0,49 # sw $2,20($3) addi $2,$0,51 # sw $2,24($3) addi $2,$0,52 # sw $2,28($3) addi $2,$0,54 # sw $2,32($3) addi $2,$0,52 # sw $2,36($3) j main

计算机组成原理实验报告单周期cpu的设计与实现

1个时钟周期 Clock 电子科技大学计算机科学与工程学院 标 准 实 验 报 告 (实验)课程名称: 计算机组成原理实验 电子科技大学教务处制表 电 子 科 技 大 学 实 验 报 告 学生姓名: 郫县尼克杨 学 号: 2014 指导教师:陈虹 实验地点: 主楼A2-411 实验时间:12周-15周 一、 实验室名称: 主楼A2-411 二、 实验项目名称: 单周期CPU 的设计与实现。 三、 实验学时: 8学时 四、 实验原理: (一) 概述 单周期(Single Cycle )CPU 是指CPU 从取出1条指令到执行完该指令只需1个时钟

周期。 一条指令的执行过程包括:取指令→分析指令→取操作数→执行指令→保存结果。对于单周期CPU 来说,这些执行步骤均在一个时钟周期内完成。 (二) 单周期cpu 总体电路 本实验所设计的单周期CPU 的总体电路结构如下。 (三) MIPS 指令格式化 MIPS 指令系统结构有MIPS-32和MIPS-64两种。本实验的MIPS 指令选用MIPS-32。以下所说的MIPS 指令均指MIPS-32。 MIPS 的指令格式为32位。下图给出MIPS 指令的3种格式。 本实验只选取了9条典型的MIPS 指令来描述CPU 逻辑电路的设计方法。下图列出了本实验的所涉及到的9条MIPS 指令。 五、 实验目的 1、掌握单周期CPU 的工作原理、实现方法及其组成部件的原理和设计方法,如控制器、26 31 221 216 15 11 1 6 5 0 op rs rt rd sa func R 型指令 26 31 221 216 15 0 op rs rt immediate I 型指令 26 31 20 op address J 型指令

单周期CPU设计

信息科学与工程学院 课程设计报告 课程名称:计算机组成原理与结构题目:单周期CPU逻辑设计年级/专业:XXXXXXXXXXXXXXX X 学生姓名:王侠侠、李怀民 学号:XXXXXXXXXXXXXXXXXXX 指导老师:XXXX 开始时间:2016年9月15日 结束时间:2016年11月15日

摘要 一、设计目的与目标 1.1 设计目的 1.2 设计目标 二、课程设计器材 2.1 硬件平台 2.2 软件平台 三、CPU逻辑设计总体方案 3.1 指令模块 3.2 部件模块 四、模块详细设计 4.1 指令设计模块 4.2 部件设计模块 五、实验数据 5.1 初始数据 5.2 指令数据 六、结论和体会 七、参考文献

本CPU设计实验以Quartus II 9.0为软件设计平台,以Cyclone 采III型号EP3C16F484C6为FPGA实测板。此CPU设计采用模块化设计方案,首先设计指令格式模块,此模块决定CPU各个部件的接口数据容量及数量,再对CPU各个部件独立设计实现,主要涉及的部件有:寄存器组、控制器、存储器、PC计数器、数据选择器、ALU单元以及扩展单元。分部件的设计通过软件平台模拟仿真各部件的功能,在确保各部件功能正确的情况下,将所有部件模块整合在一起实现16位指令的CPU功能。再按照指令格式设计的要求,设计出一套能完整运行的指令,加载到指令存储器中,最终通过在FPGA实测板上实现了加2减1的循环运算效果,若要实现其他效果,也可更改指令存储器或数据存储器的数据而不需要对内部部件进行更改元件。 关键词:CPU设计、16位指令格式、模块化设计、Quartus软件、CPU各部件

MIPS单周期CPU实验报告

《计算机组成原理实验》 实验报告 (实验二) 学院名称: 专业(班级): 学生姓名: 学号: 时间:2017 年11 月25 日

成绩: 实验二:单周期CPU设计与实现 一.实验目的 (1) 掌握单周期CPU数据通路图的构成、原理及其设计方法; (2) 掌握单周期CPU的实现方法,代码实现方法; (3) 认识和掌握指令与CPU的关系; (4) 掌握测试单周期CPU的方法; (5) 掌握单周期CPU的实现方法。 二.实验内容 设计一个单周期的MIPSCPU,使其能实现下列指令: ==> 算术运算指令 ==> 逻辑运算指令 功能:rd←rs | rt;逻辑或运算。 ==>移位指令 ==>比较指令

==> 存储器读/写指令 将rt寄存器的内容保存到rs寄存器内容和立即数符号扩展后的数相加作为地址的内存单元中。 即读取rs寄存器内容和立即数符号扩展后的数相加作为地址的内存单元中的数,然后保存到rt寄存器中。 ==> 分支指令 功能:if(rs=rt) pc←pc + 4 + (sign-extend)immediate <<2 else pc ←pc + 4 特别说明:immediate是从PC+4地址开始和转移到的指令之间指令条数。immediate 符号扩展之后左移2位再相加。为什么要左移2位?由于跳转到的指令地址肯定是4的倍数(每条指令占4个字节),最低两位是“00”,因此将immediate放进指令码中的时候,是右移了2位的,也就是以上说的“指令之间指令条数”。 12 特别说明:与beq不同点是,不等时转移,相等时顺序执行。 功能:if(rs>0) pc←pc + 4 + (sign-extend)immediate <<2 else pc ←pc + 4 ==>跳转指令 ==> 停机指令

《单周期CPU设计》实验报告

《计算机组成原理与接口技术实验》 实验报告 学院名称: 学生姓名: 学号: 专业(班级): 合作者:

时间:2016年4月25日 成绩: 实验二: 一.实验目的 1.掌握单周期CPU数据通路图的构成、原理及其设计方法; 2.掌握单周期CPU的实现方法,代码实现方法; 3.认识和掌握指令与CPU的关系; 4.掌握测试单周期CPU的方法。 二.实验内容 设计一个单周期CPU,该CPU至少能实现以下指令功能操作。需设计的指令与格式如下: ==> 算术运算指令 (1)add rd , rs, rt(说明:以助记符表示,是汇编指令;以代码表示,是机器指令)

功能:rd←rs + rt。reserved为预留部分,即未用,一般填“0”。 (2)addi rt , rs ,immediate 功能:rt←rs + (sign-extend)immediate;immediate符号扩展再参加“加”运算。 (3)sub rd , rs , rt 完成功能:rd←rs - rt ==> 逻辑运算指令 (4)ori rt , rs ,immediate

功能:rt←rs | (zero-extend)immediate;immediate做“0”扩展再参加“或”运算。 (5)and rd , rs , rt 功能:rd←rs & rt;逻辑与运算。 (6)or rd , rs , rt 功能:rd←rs | rt;逻辑或运算。 ==> 传送指令 (7)move rd , rs 功能:rd←rs + $0 ;$0=$zero=0。 ==> 存储器读/写指令 (8)sw rt ,immediate(rs) 写存储器

单周期处理器

实验八单周期处理器的实现 实验目的: 进一步理解数据通路、控制通路等基本概念 掌握处理器中控制器的基本设计方法 进一步理解单周期处理器以及多周期处理器的工作原理和设计思路实验要求: 设计和实现一个单周期处理器(60%) 可执行至少7条MIPS指令,add、sub、ori、lw、sw、beq、j 编写测试程序的二进制代码,测试实现的电路 撰写实验报告,dead line:5.19 设计和实现一个多周期处理器(40%) Dead line:6.6 。 实验报告: (1)实验过程 1 控制器的设计与实现 控制器的功能 根据当前指令,生成处理器内部各部件所需要的控制信号 控制器的输入输出

输入:op[5:0],func[5:0] 输出:RegDst,ALUSrc,MemtoReg,RegWrite,MemWrite,Branch,Jump,ExtOp,ALUctr[2:0] 图表1 主控的设计 图表2 ALUCTR的设计

图表3 控制器的封装 2 ALU的设计与实现 ALU的功能 根据控制信号ALUctr[2:0],将输入端口的两个32位的数据进行加、减、与、或操作,并判断结果是否为0 ALU的输入输出 输入:A[31:0],B[31:0],ALUctr[2:0] 输出:OUT[31:0],Zero ALU的实现 将运算器实验中实现的加减法扩展为32位

增加32位与、或功能 增加结果判零电路 根据ALUctr[2:0]信号确定ALU的输出 图表4 加法器的设计与封装 (由于上一个实验已做成ALU,这里不再赘述加法器的制作) 根据ADD/SUB信号判断实现加法或是减法,并且设置Zero 项输出,用作Beq指令的判定依据

单周期CPU设计参考

单周期CPU及其Verilog HDL设计 一、指令的设计 MIPS32的指令的三种格式的参考: R类型: I类型: J类型: R类型指令的op为0,具体操作由func指定。rs和rt是源寄存器号,rd是目的寄存器号。只有移位指令使用sa来指定移位位数。I类型指令的低16位是立即数,计算时要把它扩展到32位。依指令的不同,有零扩展和符号扩展两种。J类型指令右边26位是字地址,用于产生跳转的目标地址。具体的指令格式和内容请参考MIPS32。 设计报告中需自行设计所有指令的二进制格式和对应的汇编指令格式。 二、单周期CPU的设计 我们把时钟的电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。单周期CPU指的是一条指令的执行在一个这样的时钟周期内完成,然后开始下一条指令的执行,即一条指令用一个周期。 2.1执行一条指令所需的硬件电路 我们的目的地是要设计CPU的硬件电路,使其能够从存储器中读出一条条指令并执行指令所描述的操作。从存储器中读取指令的动作一般与指令本身的意义无关,可以以同样的方法把指令从存储器中取出。而执行指令则与指令本身的意义密切相关,因此最重要是首先搞清楚CPU要执行的每条指令的意义。下面以两种类型的电路来举例。 2.1.1与取指令有关的电路

指令存储在存储器中。CPU取指令时把程序计数器(PC)中的内容作为存储器的地址,根据它来访问存储器,从PC值指定的存储单元中取来一条32位指令。如果取来的指令执行时没有引起转移,PC的值要加4;如果转移,要把转移的目标地址写入PC,以便在下一个时钟周期取出下一条指令。 图2.1 取指令时用到的硬件电路和指令寄存器 如图2.1所示,PC是一个简单的32位寄存器,由32个D触发器构成。指令存储器(Inst Mem)的输入端a是地址、输出端do是数据输出,即指令。图中的加法器专供PC+4使用,它的输出接到多路器的一个输入端。如果取来的指令没有引起转移或跳转,则选择PC+4,在时钟上升沿处将其打入PC;若引起转移或跳转,则用多路器选择下一条指令该打入的PC值。 2.1.2寄存器计算类型指令执行时所需电路 寄存器类型的指令有add等。如图2.2所示是执行它们所需的部分硬件电路。大多数MIPS指令属于三操作数指令。指令格式中的rs和rt是两个5位的寄存器号,由它们从寄存器堆(Regfile)中读出两个32位的数据。由于寄存器号有5位,所以能从32个寄存器中选出一个。32个寄存器合在一起称为寄存器堆(Register File)。从寄存器堆读出的两个32位数据分别被送到ALU的a和b的输入端。 图2.2 执行寄存器计算类型指令所需电路 具体的计算由ALU完成。ALU的计算控制码aluc由控制部件(Control Unit)产生。这里的控制部件是简单的组合电路,输入信号是指令的操作码op和功能码func,输出信号3个,它们分别是ALU的操作码aluc、计算结果是否写入寄存器堆的控制信号wreg和下一条指令的地址选择信号pcsource。ALU的计算结

单周期CPU设计

短学期综合实验报告 实验名称:单周期CPU设计 院系:信息科学与工程学院 专业:计算机科学与技术 组员:XXXXXXXXXXX XXXXXXXXXXX 指导老师:XXXXXXX 二〇一一年七月八日

摘要 中央处理器(CPU)是计算机取指令和执行指令的部件,它是由算术逻辑单元(ALU)、寄存器和控制器组成,简称处理器(或CPU),CPU是计算机系统的核心部件,在各类信息终端中得到了广泛的应用。处理器的设计及制造技术也是计算机技术的核心之一。 CPU设计的第一步应当根据指令系统来建立数据路径,再定义各个部件的控制信号,确定时钟周期,完成控制器的设计。然后建立数据路径,进而可以进行数字设计、电路设计,最后完成物理实现。而在本次试验中,我们研究的重点是数据路径的建立和控制器的实现。 一个机器的性能由三个关键因素决定:指令数、时钟周期,以及执行每条指令所需的时钟周期数(CPI)。然而不论是时钟周期,还是每条指令所需的时钟周期数目,都是由处理器的实现情况决定的。在本次试验中,我们构造了单周期的数据路径和组合逻辑实现的控制器。 本次试验中,我们运用Quartus II 8.0软件设计出了一个拥有6条指令的单周期CPU,并对它进行了简单的测试,最终完成了一个正确的单周期CPU的设计。 关键词:数据路径,控制器,控制信号,单周期

Abstract Central processing unit (CPU) is a computer instruction fetch and execution of components, it is an arithmetic logic unit (ALU), registers and a controller, referred to as the processor (or CPU), CPU is the core component of computer systems in all type information terminal has been widely used. Processor design and manufacturing technology is one of the core computer technology. The first step should be based on CPU design instruction to create a data path, and then define the various components of the control signals to determine the clock cycle, the controller design. Then set up a data path, and then can be digital design, circuit design, physical implementation finalized. In this experiment, the focus of our research is to establish the data path and controller implementation. The performance of a machine consists of three key factors: the number of instructions, clock cycles to execute each instruction as well as the required number of clock cycles (CPI). Whether it be a clock cycle, each instruction or the number of clock cycles required are determined by the achievement of the processor. In this study, we constructed single-cycle data path and the combinational logic to achieve the controller. This experiment, we use Quartus II 8.0 software to design a single-cycle instruction with 6 CPU, and it conducted a simple test, the

计算机组成原理实验报告 单周期CPU的设计与实现

1个时钟周 期 Cloc k 电子科技大学计算机科学与工程学院 标 准 实 验 报 告 (实验)课程名称: 计算机组成原理实验 电子科技大学教务处制表 电 子 科 技 大 学 实 验 报 告 学生姓名: 郫县尼克杨 学 号: 2014 指导教师:陈虹 实验地点: 主楼A2-411 实验时间:12周-15周 一、 实验室名称: 主楼A2-411 二、 实验项目名称: 单周期CPU 的设计与实现。 三、 实验学时: 8学时 四、 实验原理: (一) 概述 单周期(Single Cycle )CPU 是指CPU 从取出1条指令到执行完该指令只需1个时钟周期。 一条指令的执行过程包括:取指令→分析指令→取操作数→执行指令→保存结果。对于单周期CPU 来说,这些执行步骤均在一个时钟周期内完成。 (二) 单周期cpu 总体电路 本实验所设计的单周期CPU 的总体电路结构如下。

(三) MIPS 指令格式化 MIPS 指令系统结构有MIPS-32和MIPS-64两种。本实验的MIPS 指令选用MIPS-32。以下所说的MIPS 指令均指MIPS-32。 MIPS 的指令格式为32位。下图给出MIPS 指令的3种格式。 本实验只选取了9条典型的MIPS 指令来描述CPU 逻辑电路的设计方法。下图列出了本实验的所涉及到的9条MIPS 指令。 五、 实验目的 1、掌握单周期CPU 的工作原理、实现方法及其组成部件的原理和设计方法,如控制器、运算器等。? 2、认识和掌握指令与CPU 的关系、指令的执行过程。? 3、熟练使用硬件描述语言Verilog 、EDA 工具软件进行软件设计与仿真,以培养学生的分析和设计CPU 的能力。 六、 实验内容 (一)拟定本实验的指令系统,指令应包含R 型指令、I 型指令和J 型指令,指令数为9条。 (二)CPU 各功能模块的设计与实现。 (三)对设计的各个模块的仿真测试。 (四)整个CPU 的封装与测试。 七、 实验器材(设备、元器件): (一)安装了Xilinx ISE Design Suite 13.4的PC 机一台 (二)FPGA 开发板:Anvyl Spartan6/XC6SLX45 (三)计算机与FPGA 开发板通过JTAG (Joint Test Action Group )接口连接,其连接方式如图所示。 八、 实验步骤 一个CPU 主要由ALU (运算器)、控制器、寄存器堆、取指部件及其它基本功能部件等构成。? 在本实验中基本功能部件主要有:32位2选1多路选择器、5位2选1多路选择器、32位寄存器堆、ALU 等。 (一)新建工程(New Project ) 启动ISE Design Suite 13.4软件,然后选择菜单File →New Project ,弹出New 26 31 25 21 20 16 15 11 10 6 5 0 op rs rt rd sa func R 型指令 26 31 25 21 20 16 15 0 op rs rt immediate I 型指令 26 31 25 0 op address J 型指令

单周期CPU

一、指令的设计 MIPS32的指令的三种格式的参考: R类型: I类型: J类型: R类型指令的op为0,具体操作由func指定。rs和rt是源寄存器号,rd是目的寄存器号。只有移位指令使用sa来指定移位位数。I类型指令的低16位是立即数,计算时要把它扩展到32位。依指令的不同,有零扩展和符号扩展两种。J类型指令右边26位是字地址,用于产生跳转的目标地址。具体的指令格式和内容请参考MIPS32。 设计报告中需自行设计所有指令的二进制格式和对应的汇编指令格式。 二、单周期CPU的设计 我们把时钟的电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。单周期CPU指的是一条指令的执行在一个这样的时钟周期内完成,然后开始下一条指令的执行,即一条指令用一个周期。 2.1执行一条指令所需的硬件电路 我们的目的地是要设计CPU的硬件电路,使其能够从存储器中读出一条条指令并执行指令所描述的操作。从存储器中读取指令的动作一般与指令本身的意义无关,可以以同样的方法把指令从存储器中取出。而执行指令则与指令本身的意义密切相关,因此最重要是首先搞清楚CPU要执行的每条指令的意义。下面以两种类型的电路来举例。 2.1.1与取指令有关的电路 指令存储在存储器中。CPU取指令时把程序计数器(PC)中的内容作为存储器的地址,根据它来访问存储器,从PC值指定的存储单元中取来一条32位

指令。如果取来的指令执行时没有引起转移,PC的值要加4;如果转移,要把转移的目标地址写入PC,以便在下一个时钟周期取出下一条指令。 图2.1 取指令时用到的硬件电路和指令寄存器 如图2.1所示,PC是一个简单的32位寄存器,由32个D触发器构成。指令存储器(Inst Mem)的输入端a是地址、输出端do是数据输出,即指令。图中的加法器专供PC+4使用,它的输出接到多路器的一个输入端。如果取来的指令没有引起转移或跳转,则选择PC+4,在时钟上升沿处将其打入PC;若引起转移或跳转,则用多路器选择下一条指令该打入的PC值。 2.1.2寄存器计算类型指令执行时所需电路 寄存器类型的指令有add等。如图2.2所示是执行它们所需的部分硬件电路。大多数MIPS指令属于三操作数指令。指令格式中的rs和rt是两个5位的寄存器号,由它们从寄存器堆(Regfile)中读出两个32位的数据。由于寄存器号有5位,所以能从32个寄存器中选出一个。32个寄存器合在一起称为寄存器堆(Register File)。从寄存器堆读出的两个32位数据分别被送到ALU的a和b的输入端。 图2.2 执行寄存器计算类型指令所需电路 具体的计算由ALU完成。ALU的计算控制码aluc由控制部件(Control Unit)产生。这里的控制部件是简单的组合电路,输入信号是指令的操作码op和功能码func,输出信号3个,它们分别是ALU的操作码aluc、计算结果是否写入寄存器堆的控制信号wreg和下一条指令的地址选择信号pcsource。ALU的计算结果要写入寄存器堆。到底要写入32个寄存器中的哪一个,由5位目的寄存器号rd指定。

华中科技大学HUST类MIPS单周期微处理器设计实验报告

类MIPS单周期微处理器设计 实验报告 专业: 班级: 学号: 姓名:

一、微处理器各模块设计 各模块的框图结构如上图所示。由图可知,该处理器包含指令存储器、数据存储器、寄存器组、ALU单元、符号数扩张、控制器、ALU控制译码以及多路复用器等。图中还忽略了一个单元:时钟信号产生器,而且以上各个部件必须在时钟信号的控制下协调工作。 1.指令存储器的设计 指令寄存器为ROM类型的存储器,为单一输出指令的存储器。因此其对外的接口为clk、存储器地址输入信号(指令指针)以及数据输出信号(指令)。 (1)在IP wizard 中配置ROM,分配128个字的存储空间,字长为32位宽。 (2)选择输入具有地址寄存功能,只有当时钟上升沿有效时,才进行数据的输出。 (3)配置ROM内存空间的初始化COE文件。最后单击Generate按钮生成IROM模块。

2.数据存储器的设计 数据存储器为RAM类型的存储器,并且需要独立的读写控制信号。因此其对外的接口输入信号为clk、we、datain、addr;输出信号为dataout。 数据存储器基本建立过程同ROM的建立。 3.寄存器组设计 寄存器组是指令操作的主要对象,MIPS中一共有32个32位寄存器。在指令的操作过程中需要区分Rs、Rt、Rd的地址和数据,并且Rd的数据只有在寄存器写信号有效时才能写入,因此该模块的输入为clk、RegWriteAddr、RegWriteData、RegWriteEn、RsAddr、RtAddr、reset;输出信号为RsData、RtData。 由于$0一直输出0,因此当RsAddr、RtAddr为0时,RsData以及RtData 必须输出0,否则输出相应地址寄存器的值。另外,当RegWriteEn有效时,数据应该写入RegWriteAddr寄存器。并且每次复位时所有寄存器都清零。 代码如下: module regFile( input clk, input reset, input [31:0] regWriteData, input [4:0] regWriteAddr, input regWriteEn, output [31:0] RsData, output [31:0] RtData, input [4:0] RsAddr, input [4:0] RtAddr

《单周期CPU的设计与实现》

《单周期CPU的设计与实现》 电子科技大学计算机科学与工程学院 单周期CPU的设计与实现 实验指导书 [计算机组成原理实验] 张建 20XX-12-13 计算机组成原理实验单周期CPU的设计与实验 目录 前言 ................................................ ................................................... ................................................... . (1) 实验内容 ................................................ ................................................... ...................................... 2 实验要求 ................................................ ................................................... ....................................... 2 2. 实验环境 ................................................

(3) 2. 1 硬件平台 ................................................ ................................................... ................................... 3 2.2 软件平台 ................................................ ................................................... ................................... 3 2.3 实验主要仪器设备连接框图 ................................................ ................................................... .... 4 3. 实验原理 ................................................ ................................................... (5) 3. 1 概述 ................................................ ................................................... ........................................... 5 3.2 单周期CPU的总体电路 ................................................

单周期CPU实验报告

电子科技大学 标准实验报告(实验)课程名称:单周期CPU的设计与实现 电子科技大学教务处制表

电 子 科 技 大 学 实 验 报 告 学生姓名:xx 学 号:2012xx 指导教师:xx 实验地点: 主楼 A2-412 实验时间:2015.4.12 一、 实验室名称: 主楼A2-412 二、 实验项目名称:单周期CPU 的设计与实现。 三、 实验学时: 4 四、 实验原理: 本实验的单周期CPU 的工作原理如下图1如示。 rna qa rnb RegFile wn d qb we Control Unit P C a do Inst Mem + 01 0123 e 01 01 we a do Data Mem di a b 01 r z aluc addr sa imme rd rs1rs2rd 4 op z wreg aluimm shift aluc wmem pcsource m2reg sst sext clock

一条指令的执行过程包括:取指令(IF)→指令译码(ID)→执行指令(EXE)→访问存储器(MEM)(如果有的话)→结果写回寄存器(如果有的话)。 对于单周期CPU来说,这些执行步骤均在一个时钟周期内完成。 1.本实验的所设计的指令共有16条,分为4种类型:R型、I型和J型。 不同的指令类型有不同的数据路径。 2.在每个时钟周期根据当前PC的内容取出一条指令,将指令的op高6位 送控制器(Control Unit)译码,产生指令执行的相应控制信号,控制指 令的执行。 3.寄存器堆、多路选择器、数据存储器及运算器等部件在相应控制码的控 制下工作,产生指令的输出数据流,并将结果写入相应的存储部件。 4.在下一个时钟周期到来时,重复2、3步骤,直到程序执行完成。 五、实验目的 通过使用硬件描述语言Verilog、Xilinx软件进行CPU设计、综合与仿真,以增强分析和设计CPU的能力,掌握单周期CPU的工作原理,控制器、运算器等部件设计的基本方法和技能,加深对所学知识的理解和掌握。 六、实验内容 1.拟定本实验的16条指令构成的指令系统,并进行相应编码 2.CPU各功能模块的设计与实现 3.CPU的封装 4.对所做设计综合与仿真,以验证实验结果 七、实验器材(设备、元器件): 1.Lenovo G480 Laptop(PC)一台 2.Xilinx ISE Design Suite 14.6 软件 3.Editplus 3 编辑器 八、实验步骤 1.拟定本实验所设计CPU的指令系统;

单周期和多周期专用CPU设计【开题报告】

毕业设计开题报告 计算机科学与技术 单周期和多周期专用CPU设计 一、选题的背景与意义 随着信息技术的迅猛发展,计算机技术也在不断革新,而计算机已经成为了人们日常生活中不断或缺的一个组成部分,在经济全球化和网络普及化的今天,计算机对于人们的影响也越来越大,而作为计算机的核心设备,CPU也在不停地更新换代并越来越受到人们的关注和重视,多线程,多核心理论的产生,使得CPU的革新速度又得到进一步的提升。本课题旨在通过对硬布线控制器知识的分析,对单、多周期CPU设计进行探究,熟练掌握CPU内部线路,实现其功能。 中央处理器(Central Processing Unit,CPU),是电子计算机的主要设备之一。其功能主要是解释计算机指令以及处理计算机软件中的数据。所谓的计算机的可编程性主要是指对CPU的编程。CPU,往往采用硬布线逻辑实现。 硬布线控制器又称组合逻辑控制器,它将控制部件做成产生专门固定时序控制信号的逻辑电路,产生各种控制信号。硬布线控制器又称组合逻辑控制器,以使用最少元件和取得最高操作速度为设计目标。硬布线控制的功能由逻辑门组合实现。硬布线控制逻辑主要取决于电路延时,因而在超高速机器中,对影响速度的关键部分如核心部件CPU,往往采用硬布线逻辑实现。近年来,在一些新型计算机系统中,例如,RISC(精简指令系统计算机)中,一般都选用硬布线逻辑电路。,与微程序控制器相比,硬布线控制的速度较快。其原因是微程序控制中每条微指令都要从控制存储器中读取一次,影响了速度,而硬布线控制主要取决于电路延迟。另外,随着新一代机器及VLSI技术的发展与不断进步,硬布线逻辑设计思想又得到了重视,现代新型计算机体系结构RISC 中多采用硬布线控制逻辑。 另外我们还需要了解EDA技术,它是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。利用EDA 工具,可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。

单周期CPU实验报告

计算机组成实验报告 实验名称:单周期CPUVerilog实现 实验日期:2011.4.12-2011.4.19 实验人员: 同组者: 一、主要实验内容

将已做好的各个模块进行模块合并,实现单周期CPU的各项指令,(注:由于此次设计只是利用verilog硬件编程语言实现具体功能,因此数据寄存器和存储器部件内的内容需由程序设计者自己给出,并不能从计算机中直接读取),下面对各个子模块进行简单的介绍。 二、各个子模块的简单介绍 此程序将数据通路(SingleDataLoad)设定为顶层模块,下面的模块包括:算术逻辑运算单元(ALU)、数据存储器(DataStore)、数据寄存器(Registers)、取指令部件(GetCode)、总控制器(Control),通过顶层模块对各个子模块的调用从而实现了整个单周期CPU。 1)数据通路(SingleDataLoad):进行数据的运算、读取以及存储功能,通过总控制器 产生的各个控制信号,进而实现对数据的各项操作。 2)算术逻辑运算单元(ALU):数据通路调用此模块,根据得到的控制信号对输入数 据进行处理,处理功能有:addu、add、or、subu、sub、sltu、slt等。 3)数据存储器(DataStore):当WrEn控制信号为1时,此时就将输入数据存储到此 存储器中,当WrEn为0时,则根据输入的地址,找到地址对应的单元将单元中的 数据输出。 4)数据寄存器(Registers):在此程序中功能和实现基本和数据存储器相同,但在实 际CPU当中使用的逻辑器件及获取数据的方式还是有所区别的。 5)取指令部件(GetCode):指根据PC所提供的地址从指令寄存器中取出要执行的指 令,再根据各控制信号,得出下一次要执行的指令的地址。(注:指令寄存器中存 放的就是一个程序或一段代码所需要执行的指令,这里也是程序设计者自己给出的 一些指令的值。) 6)总控制器(Control):总控制器通过从取指令部件获得的指令,进而产生各个控制 信号,并将控制信号返回个数据通路,就此实现各项功能。 (以上各个模块代码见附录) 三、程序截图及说明 上图为执行下列指令产生的图像: (此时$1,$2所指的寄存器中存放的值是不同的) (beq rs rt imm16:指令的功能为:Cond←R[rs]-R[rt] if(Cond eq 0)PC←PC+(SignExt(imm16)*4) Mem[0]<={6'b000100,5'b00001,5'b00010,5'b00000,5'b00000,6'b000001}; //beq $1,$2,1

CPU实验——单周期MIPS处理器设计

单周期MIPS处理器设计 实验报告 完成人:笪腾飞2012011263 一、实验目的 1、设计一个32位的单周期MIPS处理器,具备定时器、数码管等外设; 2、编写一个编译器,可以将mips代码编译为二进制机器码; 3、编写一个计算两个整数的最大公约数的汇编程序。 二、设计方案 根据理论课所学的单周期MIPS处理器数据通路的知识,结合本次试验的具体要求,最终设计方案如下: 1、系统时钟 为了综合后能够在开发板上正确运行程序,我们决定采取50MHz的CPU时钟,因此编写了一个时钟分频模块,对开发板提供的100MHz时钟进行二分频,从而得到50MHz时钟。 2、PC产生模块 原理图如下: 如上图左半部分所示,多路选择器由一个always语句中的if…else if…else语句实现。其中,将ALU中的加减法部分提取出来实现一个加法器,用于产生PC+4和ConBA两个PC来源。将I型指令中的16位立即数左移两位后再符号位扩展成32位地址,与PC+4相加得到分支地址ConBA。

将跳转指令中的26位目标地址左移两位后,与当前PC的高四位拼接得到跳转地址JT。将第一个操作数寄存器中的值取出作为PC的一个输入,这是为了实现jr和jalr指令,从$Xp和$Ra寄存器中读取跳转地址。ILLOP和XADR分别是发生中断和异常时的跳转地址。下一指令地址的选择由PCSrc决定,而PCSrc是译码后由控制信号模块根据每条指令的操作码(opcode)和函数码(funct)产生。 3、译码模块 原理图如上图右半部分所示,将PC作为ROM模块的地址输入,输出即为PC所对应的指令。分别取出指令中的某些片段,得到$Rs,$Rt,$Rd,shamt,funct,16位立即数和26位跳转地址。 4、控制模块 控制模块即控制信号产生模块,六位操作码OpCode,六位函数码[5:0] Funct,定时器中断信号irq和PC最高位PC31作为输入,输出为以下控制信号: (1) R型指令指示信号IsR,值为1表示当前指令为R型指令,否则非R型指令; (2) PC产生的选择信号[2:0] PCSrc,取值0,1,2,3,4及其它,分别选择下一指令不同的PC; (3) 目的寄存器选择信号[1:0]RegDst,被写入的寄存器有四种选择:$Rd,$Rt,$Ra,$Xp,分别由RegDst不同取值完成选择; (4) 写寄存器使能信号RegWr,值为1表示允许对寄存器进行写操作; (5) ALU第一个操作数选择信号ALUSrc1,值为1表示选择将移位量shamt进行0扩展后作为输入,值为0表示将$Rs寄存器中的值作为输入; (6) ALU第一个操作数选择信号ALUSrc1,值为1表示选择将扩展后的32位立即数作为输入,值为0表示将$Rt寄存器中的值作为输入; (7) ALU运算控制信号[5:0] ALUFunc,作为ALU的输入选择不同的运算操作; (8) 有无符号数指示信号Sign,值为1表示有符号数,值为0表示无符号数; (9) 写存储器使能信号MemWr,值为1表示允许对存储器进行写操作; (10) 读存储器使能信号MemRd,值为1表示允许对存储器进行读操作; (11) 写寄存器值的选择信号[1:0] MemToReg,选择ALU结果,存储器读取结果和PC+4其中之一作为写入目的寄存器的值; (12) 符号位扩展指示信号EXTOp,值为1表示对16位立即数进行符号位扩展,值为0表示0扩展; (13) 立即数高位取指令指示信号LUOp,值为1表示当前指令为lui指令,选择将立即数载入高16位低位填0的32位立即数作为ALU输入,值为0表示将正常扩展后的32位立即数作为ALU输入; 控制信号的具体产生过程此处略去,在控制信号说明文件中进行详述。

相关文档