基于单周期MIPS微控制器设计.docx

上传人:b****8 文档编号:10125126 上传时间:2023-02-08 格式:DOCX 页数:64 大小:428.78KB
下载 相关 举报
基于单周期MIPS微控制器设计.docx_第1页
第1页 / 共64页
基于单周期MIPS微控制器设计.docx_第2页
第2页 / 共64页
基于单周期MIPS微控制器设计.docx_第3页
第3页 / 共64页
基于单周期MIPS微控制器设计.docx_第4页
第4页 / 共64页
基于单周期MIPS微控制器设计.docx_第5页
第5页 / 共64页
点击查看更多>>
下载资源
资源描述

基于单周期MIPS微控制器设计.docx

《基于单周期MIPS微控制器设计.docx》由会员分享,可在线阅读,更多相关《基于单周期MIPS微控制器设计.docx(64页珍藏版)》请在冰豆网上搜索。

基于单周期MIPS微控制器设计.docx

基于单周期MIPS微控制器设计

课程设计题目:

基于单周期MIPS的微控制器设计

已知技术参数和设计要求:

load/store,算术逻辑运算,流程控制三部分是RISC处理器系统的主要组成部分,是RISC处理器的基础,本设计以MIPS处理器的指令子集为例,研究RISC的基本实现及原理。

1)单周期MIPS(load/store指令部分)设计与实现

设计要求:

参考《计算机组成与设计--硬件/软件接口》、设计处理器整体结构和模块划分,实现支持loadword(lw)、storeword(sw)指令的MIPS单周期数据通路,并比较各种实现的效率、面积和速度。

2)单周期MIPS(算术逻辑运算指令部分)设计与实现

设计要求:

参考《计算机组成与设计--硬件/软件接口》、设计处理器整体结构和模块划分,实现支持add、sub、and、or和slt指令的MIPS单周期数据通路,并比较各种实现的效率、面积和速度。

3)单周期MIPS(流程控制指令部分)设计与实现

设计要求:

参考《计算机组成与设计--硬件/软件接口》、设计处理器整体结构和模块划分,实现支持branchequal(beq)、jump(j)、jumpandlink(jal)、jumpregister(jr)指令的MIPS单周期数据通路,并比较各种实现的效率、面积和速度。

4)通用异步串行收发器(UART)设计与实现

具有基本手法功能的通用异步串行收发器,并比较各种实现的效率、面积和速度。

5)小组实现基于MIPS(子集)单周期数据通路的嵌入式控制器

设计要求:

与同组同学共同完成一个具有11条指令的单周期MIPS实现,连接通用异步串行收发器作为外设,实现嵌入式控制器,并比较各种实现的效率、面积和速度。

基本要求:

1.确定设计采用的算法;

2.确定设计的体系结构;

3.划分所确定的体系结构,画出模块图,确定模块间的连接关系,端口方向及宽度;

4.确定设计的测试方案、测试点及测试向量;

5.完成设计的RTL代码及测试代码;

6.完成设计的验证,给出设计的性能评价(面积、速度等);

7.撰写课程设计报告。

工作量:

本课程设计拟按照每4人为一组分工并协作完成。

每位小组成员分别选择1~4题之一,作为该组同学的课程设计题目独立完成;在完成个人题目基础上小组成员共同完成第5题。

熟悉开发环境、学习工具使用:

12学时

分析题目、确定设计方案:

12学时

设计、验证以及性能评估、整理数据:

36学时

 

工作计划安排:

2012.8.27--2012.8.29学习VCS、DesignAnalyser使用方法,分析设计题目

2012.8.30--2012.9.3利用Verilog语言进行系统设计、验证

2012.9.4--2010.9.5性能评估、整理数据

2012.9.6开始撰写课程设计报告

同组设计者及分工:

指导教师签字___________________

年月日

教研室主任意见:

教研室主任签字___________________

年月日

*注:

此任务书由课程设计指导教师填写。

第一部分功能描述

所有的MIPS指令都是32位,支持多种指令,主要有以下几种:

·数据加载和存储指令:

lw、sw指令

·跳转指令:

beq条件跳转和j、jr、jl跳转

·算数逻辑运算:

add、sub、and、or、slt

具体有三种格式:

处理器有32个32位寄存器,并且为了测试和运行方便,配备了一个32字的指令存储器,和一个32字的数据存储器(地址0x0000_0000~0x0000_001f)。

还备有UART串口,并且与数据存储器共同编址(0x8000_0000~0x8000_0008)。

第二部分设计方案

1、设计策略

采用分治:

将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各

个击破,分而治之。

本实验中,我们将整个数据通路化分成多个模块:

寄存器堆、取指部件、扩展器、二选一数据选择器、算术逻辑单元、数据存储器等,分别设计及实现,然后再整体进行逻辑控制,最终实现单周期数据通路。

2、设计思路

建立数据通路:

(1)按照图1设计能够实现R型,lw/sw型和跳转型指令的mips处理器整体数据通路图

数据通路必须具备必要的存储元件,可能需要多个,同时数据通路必要的元件可能需要多个。

(2)选择一组数据通路部件

(3)根据需求,组装数据通路

(4)分析每条指令的实现,以确定如何设置影响寄存器传输的控制点

(5)装配控制逻辑

3.数据通路图

图1数据通路图

第三部分单周期MIPS分析与设计

ALU:

算术逻辑运算单元,有2个32位输入和1个32位输出,还有一个零标志位。

有3个控制输入,而八种可能的输入组合中只有5种可能出现。

对于取字和存储指令,ALU用于计算存储地址;

对于R型指令,根据指令的低6位功能字段的内容,ALU执行5中操作中的一种。

对于相等分支指令,ALU执行剑法操作。

实现代码:

always@(ctrlorin1orin2)

begin

if(in1==in2)zero<=1;

elsezero<=0;

case(ctrl)

3'b010:

ALU_out=in1+in2;

3'b110:

ALU_out=in1-in2;

3'b000:

ALU_out=in1&in2;

3'b001:

ALU_out=in1|in2;

3'b111:

if(in1

ALU_out=1;

else

ALU_out=0;

default:

ALU_out=0;

endcase

end

ALU控制的代码实现:

moduleALU_ctrl(

input[1:

0]ALUOp,

input[5:

0]funct,

outputreg[2:

0]ALU_ctrl

);

always@(ALUOporfunct)

begin

case(ALUOp)

2'b00:

ALU_ctrl=3'b010;

2'b01:

ALU_ctrl=3'b110;

2'b10:

begin

case(funct)

6'b100000:

ALU_ctrl=3'b010;

6'b100010:

ALU_ctrl=3'b110;

6'b100100:

ALU_ctrl=3'b000;

6'b100101:

ALU_ctrl=3'b001;

6'b101010:

ALU_ctrl=3'b111;

default:

ALU_ctrl=0;

endcase

end

endcase

end

endmodule

数据存储单元:

是一个状态单元,有读写控制信号、地址和数据端口。

两个输入是地址和所写数据,一个输出位为出内容,读写控制信号是独立的,任意始终只能激活一个。

存数指令,要从寄存器堆中读出要存的数据;取数指令,则要将刚从存储器中取出的数放入寄存器堆中指定寄存器中。

实现代码:

begin

case({ctrl_write,ctrl_read})

2'b01:

out=mem[addr];

2'b10:

mem[addr]=data;

default:

$display("error");

endcase

end

MUX:

二选一数据选择器,通过控制信号的值来选择输出。

实现代码:

always@(*)

if(ctrl==0)out=in0;

elseout=in1;

寄存器堆:

实现代码:

always@(in1orin2)

begin

case(in1)

5'b00101:

data1<=32'h001c;

5'b01111:

data1<=32'h0004;

5'b00000:

data1<=32'h0008;

5'b10000:

data1<=32'h000c;

5'b10001:

data1<=32'h000c;

default:

data1<=mem[writeaddr];

endcase

case(in2)

5'b00101:

data2<=32'h001c;

5'b01111:

data2<=32'h0004;

5'b00000:

data2<=32'h0008;

5'b10000:

data2<=32'h000c;

5'b10001:

data2<=32'h000c;

default:

data2<=mem[writeaddr];

endcase

end

always@(RegWriteorwriteaddrorwritedata)begin

mem[writeaddr]<=writedata;

end

endmodule

符号扩展器:

将指令中16位有符号数扩展成32位有符号数

符号代码:

modulesignal_extend(

input[15:

0]in,

output[31:

0]out

);

assignout={16'b0,in};

endmodule

取指部件:

首先要从存储器中将指令取出。

为准备执行。

下一条指令,也必须把程序计数器加到指向下一条指令,即向后移动四字节。

此时所需的取指令以及增加PC以获得下一时序指令的地址相对应的数据通路,图如右:

代码:

always@(posedgeclkorposedgereset)

begin

if(reset)PC<=0;

elsePC<=PCnext;

end

 

根据分治设计策略,确定模块间的连接关系,端口方向及宽度,将每一模块通过控制信号联系起来,最终形成完整的数据通路。

综合:

moduletop(

inputclk,

inputreset,

output[31:

0]PCnext,

output[4:

0]addr_regwrite,

output[31:

0]data_regwrite,

output[31:

0]signal_extend

);

wire[31:

0]PC;

wire[31:

0]instruction;

wireRegDst,Jump,Branch,MemRead,MemtoReg,MemWrite,ALUSrc,RegWrite,zero;

wire[1:

0]ALUOp;

//wire[4:

0]addr_regwrite;

wire[31:

0]data1,data2,

ALU2,ALUout,memdata,

signal_extend_l,PCnew,add2out,mux4out,

jumpaddr_l;

wire[2:

0]ALUctrl;

wire[31:

0]jumpaddr;

instruction_regins_reg(.pc(PC),.ins(instruction));

controlcon(.in(instruction[31:

26]),.RegDst(RegDst),

.Jump(Jump),.Branch(Branch),

.MemRead(MemRead),.MemtoReg(MemtoReg),

.ALUOp(ALUOp),

.MemWrite(MemWrite),.ALUSrc(ALUSrc),

.RegWrite(RegWrite));

mux#(5)mux1_datareg(.in0(instruction[20:

16]),

.in1(instruction[15:

11]),

.out(addr_regwrite),

.ctrl(RegDst));

data_regdata_reg(.in1(instruction[25:

21]),

.in2(instruction[20:

16]),

.writeaddr(addr_regwrite),

.writedata(data_regwrite),

.data1(data1),.data2(data2),

.RegWrite(RegWrite));

signal_extends_extend(.in(instruction[15:

0]),

.out(signal_extend));

mux#(32)mux2_ALU(.in1(signal_extend),.in0(data2),.out(ALU2),.ctrl(ALUSrc));

ALUALU(.in1(data1),.in2(ALU2),.ALU_out(ALUout),.ctrl(ALUctrl),.zero(zero));

data_memdata_mem(.addr(ALUout),.data(data2),.ctrl_read(MemRead),

.out(memdata),.ctrl_write(MemWrite));

mux#(32)mux3_datareg(.in1(memdata),.in0(ALUout),.out(data_regwrite),.ctrl(MemtoReg));

left_shiftlshift1(.in(signal_extend),.out(signal_extend_l));

left_shiftlshift2(.in(instruction),.out(jumpaddr_l));

addadd1(.in1(PC),.in2(32'b100),.out(PCnew));

addadd2(.in1(signal_extend_l),.in2(PCnew),.out(add2out));

 

mux#(32)mux4_PCnew(.in0(PCnew),.in1(add2out),.out(mux4out),.ctrl(zero&Branch));

/**/mux#(32)mux5_PCnext(.in0(mux4out),.in1(jumpaddr),.out(PCnext),.ctrl(Jump));

ALU_ctrlALU_ctrl(.ALUOp(ALUOp),.funct(instruction[5:

0]),.ALU_ctrl(ALUctrl));

PCPC0(.clk(clk),.reset(reset),.PCnext(PCnext),.PC(PC));

assignjumpaddr={PCnew[31:

28],jumpaddr_l[27:

0]};

 

endmodule

第四部分验证方案及结果分析

1、加载存储指令:

lw$s1,immt($t7)

32'h08:

ins={6'b100011,5'b00101,5'b10001,16'h0001};

其中immt($t7)指向的内存地址中存的数为32’b0101

//sw$s0,immt($t7)

32'h04:

ins={6'b101011,5'b00101,5'b00101,16'h0001};

其中$s0寄存器中存的值为32’b1000,$t7存的数据32’h001c

2、算术逻辑运算:

加法指令:

add$s0,$a1,$t7

32'h00:

ins={6'b000000,5'b00101,5'b01111,5'b10000,5'b00000,6'b100000};

其中$a1存的数据是32’h001c,$t7存的数据是32’h0001

减法指令:

sub$s0,$a1,$t7

32'h00:

ins={6'b000000,5'b00101,5'b01111,5'b10000,5'b00000,6'b100010};

其中$a1存的数据是32’h001c,$t7存的数据是32’h0004

与运算:

and$s0,$a1,$t7

32'h00:

ins={6'b000000,5'b00101,5'b01111,5'b10000,5'b00000,6'b100100};

其中$a1存的数据是32’h001c,$t7存的数据是32’h0004

或运算

or$s0,$a1,$t7

32'h00:

ins={6'b000000,5'b00101,5'b01111,5'b10000,5'b00000,6'b100101};

其中$a1存的数据是32’h001c,$t7存的数据是32’h0004

Slt运算:

slt$s0,$a1,$t7

32'h00:

ins={6'b000000,5'b00101,5'b01111,5'b10000,5'b00000,6'b101010};

其中$a1存的数据是32’h001c,$t7存的数据是32’h0004

3、分支指令:

bne$s0,$s1,start

32'h04:

ins={6'b000100,5'b10000,5'b10001,16'b0100};

其中$s0=$s2=32’h000c

4、跳转:

J1000

32'h04:

ins={6'b000010,26'h08};

第五部分性能评估:

综合结果:

面积报告:

****************************************

Report:

area

Design:

top

Version:

C-2009.06

Date:

TueSep415:

27:

352012

****************************************

Library(s)Used:

typical(File:

/export/homeO1/smic018/typical.db)

Numberofports:

103

Numberofnets:

634

Numberofcells:

156

Numberofreferences:

30

Combinationalarea:

73589.947530

Noncombinationalarea:

48009.932091

NetInterconnectarea:

518795.906769

Totalcellarea:

121599.879621

Totalarea:

640395.786390

时序报告:

****************************************

Report:

timing

-pathfull

-delaymax

-max_paths1

Design:

top

Version:

C-2009.06

Date:

TueSep415:

27:

462012

****************************************

OperatingConditions:

typicalLibrary:

typical

WireLoadModelMode:

top

Startpoint:

PC0/PC_reg[21]

(risingedge-triggeredflip-flopclockedbyclk)

Endpoint:

data_regwrite[25]

(outputportclockedbyclk)

PathGroup:

clk

PathType:

max

Des/Clust/PortWireLoadModelLibrary

------------------------------------------------

topsmic18_wl10typical

PointIncrPath

-----------------------------------------------------------

clockclk(riseedge)0.000.00

clocknetworkdelay(ideal)0.000.00

PC0/PC_reg[21]/CK(DFFRHQX4)0.000.00r

PC0/PC_reg[21]/Q(DFFRHQX4)0.220.22r

PC0/PC[21](PC)0.000.22r

ins_reg/pc[21](instruction_reg)0.000.22r

ins_reg/U53/Y(NOR2X4)0.060.28f

ins_reg/U37/Y(NAND4X4)0.110.39r

ins_reg/U55/Y(NOR2X4)0.050.44f

ins_reg/U56/Y(NAND2X4)0.080.52r

ins_reg/U38/Y(BUFX20)0.100.63r

ins_reg/U31/Y(NOR2X4)0.060.69f

ins_reg/ins[28](instruction_reg)0.000.69f

con/in[2](control)0.000.69f

con/U29/Y(NOR2X4)0.090.78r

con/U33/Y(NAND3X4)0.060.84f

con/U34/Y(NOR2X4)0.100.94r

con/RegDst(control)0.000.94r

mux1_datareg/ctrl(mux_N5)0.000.94r

mux1_datareg/U1/Y(BUFX20)0.101.05r

mux1_datareg/U10/Y(OAI2BB2X4)0.131.17r

mux1_datareg/out[1](mux_N5)0.001.17r

U25/Y(BUFX16)0.101.28r

data_reg/writeaddr[1](data_reg)0.001.28r

data_reg/U368/Y(NAND2BX4)0.121.39r

data_reg/U365/Y(INVX8)0.051.44f

data_reg/U362/Y(INVX8)0.061.50r

data_reg/U265/Y(OR2X4)0.091.59r

data_reg/U101/Y(AND2X4)0.101.69r

data_reg/U306/Y(NAND2X4)0.061.74f

data_reg/U377/Y(NOR2X4)0.091.83r

data_reg/U295/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1