基于单周期MIPS的微控制器设计与实现.docx
- 文档编号:27744269
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:55
- 大小:1.14MB
基于单周期MIPS的微控制器设计与实现.docx
《基于单周期MIPS的微控制器设计与实现.docx》由会员分享,可在线阅读,更多相关《基于单周期MIPS的微控制器设计与实现.docx(55页珍藏版)》请在冰豆网上搜索。
基于单周期MIPS的微控制器设计与实现
课程设计说明书(论文)
课程名称:
电子设计自动化基础课程设计
设计题目:
基于单周期MIPS的微控制器设计与实现
院系:
航天学院微电子科学与技术系
班级:
设计者:
学号:
指导教师:
设计时间:
哈尔滨工业大学
哈尔滨工业大学课程设计任务书
姓名:
院(系):
航天学院微电子科学与技术系
专业:
电子信息科学与技术班号:
任务起至日期:
2014年6月23日至2014年7月10日
课程设计题目:
基于单周期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学时
工作计划安排:
2014.6.23--2014.6.25学习VCS、DesignAnalyser使用方法,分析设计题目
2014.6.26--2014.6.30利用Verilog语言进行系统设计、验证
2014.7.1--2014.7.4性能评估、整理数据
2014.7.5开始撰写课程设计报告
同组设计者及分工:
宋佳盈——JUMP_PC和INSTR_mem模块的设计与实现;
刘泽鹏——ALU和DATA_mem模块的设计与实现
花旭——control和REG_mem模块的设计与实现
马元——通用异步串行收发器(UART)设计与实现
指导教师签字___________________
年月日
教研室主任意见:
教研室主任签字___________________
年月日
*注:
此任务书由课程设计指导教师填
一、功能描述
二、功能描述
本设计为一个具有标准MIPS指令格式,并包含load/store、算术逻辑运算、流程控制等部分的MIPS处理器,它能够实现lw、sw、add、sub、and、or、slt、beq、j、jal、jr指令以及完成UART通用异步传输功能。
处理器具有32位总线,具有256个数据存储体,每个包含8位信息;寄存器堆包括32个32为寄存器,PC为32位。
1、单周期MIPS(load/store指令部分),实现支持loadword(lw)、storeword(sw)指令的MIPS单周期数据通路:
Load指令:
可以选择需要装载的数据在数据存储器中的位置,并将数据从数据存储器中取出,存入指定的寄存器;
Store指令:
可以选择数据存储器中需要存储数据的位置,并将指定寄存器中的数据存入数据存储器中的相应位置。
2、单周期MIPS(算术逻辑运算指令部分),实现支持add、sub、and、or和slt指令的MIPS单周期数据通路:
add:
从两个指定寄存器中取出数据,做加法运算,结果写回指定寄存器;
sub:
从两个指定寄存器中取出数据,做减法运算,结果写回指定寄存器;
and:
从两个指定寄存器中取出数据,做与运算,结果写回指定寄存器;
or:
从两个指定寄存器中取出数据,做或运算,结果写回指定寄存器;
slt:
从两个指定寄存器中取出数据,做减法,如果结果小于0,则输出置1,否则输出为0,并将结果写回指定寄存器。
3、单周期MIPS(流程控制指令部分),实现支持branchequal(beq)、jump(j)、jumpandlink(jal)、jumpregister(jr)指令的MIPS单周期数据通路:
branchequal(beq):
从两个指定寄存器中取出数据,做减法,如果为零,两数相等,则跳转到指定地址处执行,否则,继续执行当前pc的下一条指令;
jump(j):
直接跳到指定地址处执行下一条指令;
jumpandlink(jal):
将下一条指令的pc先保存到寄存器$31,然后直接跳到指定地址处执行。
二、设计方案
1、框图
2、模块划分:
现今复杂的数字系统的设计大多采用自顶向下的设计方案,采用层次化、结构化的设计方法。
它将一个完整的硬件设计方案从系统级开始,划分为若干个可操作的模块,在每一个层次模块中进行仿真验证,最后在系统级上进行组合。
这样既提高设计效率又提高了设计质量,同时还可以很方便地查看某一层次的代码以改正仿真时发现的错误。
本次微处理器的设计主要分为六个大模块,INSTR_mem、JUMP_PC、REG_mem、ALU、DATA_mem、CONTROL。
(1)INSTR_mem模块
利用PC值的不同方式的变化来实现程序的跳转,并从指令存储器中取出相应的指令,以供后续模块的执行。
(2)JUMP_PC模块:
PC值的变化方式分为以下四种:
①顺序执行,下一条指令的PC为PC+1;②执行beq指令,跳到指令指定的PC;③执行jump指令,直接跳到指令指定的PC;④执行jr指令,跳到$31号寄存器中所存放的PC。
其中,addr_form用以实现将6位的PC转变成8位的指令存储器的地址。
(3)CONTROL模块:
将从指令存储器中取出的指令instruction进行解码,得到控制信号(包括RegDst,RegWr,ExtOp,ALUSrc,ALUctr,MemWr,MemtoReg,branch,jump),寄存器编号(包括rs,rt,rd)和立即数(包括imm16,imm26),以完成对topup和topdown两个模块的控制和使用。
(4)REG_mem模块:
数据选择器mux3和寄存器堆reg_array。
根据输入的寄存器号输出相应寄存器中的数据。
在写使能状态下,可以完成数据的回写,需要时钟clk控制。
(5)ALU模块
扩展器extender,数据选择器mux4和ALU。
用以完成数据的算术或逻辑运算,例如add,sub,and,or,stl,beq,或地址的计算,例如lw,sw。
(6)DATA_mem模块
数据存储器datamem,数据选择器mux5,rs_addr和ext。
可以从datamem中取出相应地址处的数据或向指定地址处存入数据。
ext用以接受PC+1,并将其转换成32位(主要用于完成jal指令)。
通过mux5选择需要写回的数据。
rs_addr用于将$31中存放的32位地址转换成6位,以供跳转(主要用于完成jr指令)。
进行本课程设计要先了解32位RISC处理器指令的格式和特点
MIPS指令的分类:
根据其操作的不同及本次设计的需要,MIPS指令可以分为以下几类。
(1)计算类指令(Computational)
计算类指令用于执行算术操作,加、减、乘、除运算,逻辑操作和对寄存器进行移位操作。
这些指令有两种类型:
寄存器类型和立即数类型。
寄存器类型的指令使用两个源寄存器的值作为源操作数,立即数类型使用一个寄存器和立即数作为源操作数。
根据操作的不同,这些指令分为下面4种:
1)ALU立即数指令
2)3操作数指令
3)移位指令
4)乘/除法指令
(2)Load/Store指令
Load和Store指令都为立即数(I-type)类型,用来在存储器和通用寄存器之间的储存和装载数据。
指令格式:
(3)跳转/分支指令(jump&branch)
跳转和分支指令改变程序流。
所有的跳转和分支指令都会产生的一个延迟槽(delayslot)。
紧跟着跳转/分支指令后的指令(delayslot中的指令)也被执行,然后在跳转目的的第一条指令从存储器中取出并执行,这是在指令的流水线执行时获得更高效率。
Jump指令格式:
Branch指令格式:
(4)寄存器传送指令
寄存器传送指令用来在通用寄存器和专用寄存器之间传送数据,这些指令分为有条件传送和无条件传送2种类型。
(6)MIPS指令集的寻址方式
MIPS的寻址方式有以下几种:
(1)寄存器寻址——操作数在寄存器堆中。
(2)立即数寻址——操作数是一个常数,包含在指令中。
(3)基址偏移量寻址——操作数在存储器中,存储器地址由一个寄存器的内容与指令中的常数相加得到。
(4)PC相对寻址——转移指令计算转移地址时使用。
PC的相对值是指令中的一个常数。
(5)伪直接寻址——跳转指令形成转移地址时使用。
指令中的26位目标地址值与PC的高4位拼接,形成30位的存储器“字地址”。
明白这些指令格式和功能,就可以根据它们编写正确的代码。
单周期MIPS指令处理步骤的执行顺序
各模块的设计代码层次和顺序分布如指令处理步骤一样.个人参与的设计代码如下
三、设计代码
1、程序计数器PC
modulepc(pc,clk,rst,imm16,imm26,branch,zero,jump,rs_addr,temp0);
//输出PC,时钟,复位信号,输入立即数,输入立即数,beq指令控制,0信号,JUMP指令控制,jr
//指令输入的PC地址,输出PC+1
inputclk,rst,branch,zero,jump;
input[15:
0]imm16;
input[25:
0]imm26;
input[5:
0]rs_addr;
output[5:
0]temp0;
output[5:
0]pc;
reg[5:
0]pc,next_pc;
wire[5:
0]temp0,temp1,temp2,temp3,temp4;
assigntemp0=pc+1;
assigntemp4=imm16[5:
0];//将16位立即数,取其后6位。
assigntemp3=imm26[5:
0];//取26位立即数的后6位
assingtemp1=temp0+temp4;
assigntemp2=(branch&&zero)?
temp1:
temp0;
//由branch和zero共同控制,即若想完成beq指令,必须有branch=1且zero=1。
//选择temp3,temp2或rs_addr
always@(*)
if(rst)
next_pc=6'b0;
else
case(ctr_jump)//选择rs_addr,temp2,temp3
2'b00:
out2=rs_addr;
2'b01:
out2=temp2;
2'b10:
out2=temp3;
default:
out2=6'b0;
endcase
assigntemp3=imm26[5:
0];//截取6位
always@(negedgeclk)//时序电路,在时钟下降沿pc_next给pc
if(rst)
pc<=0;
else
pc<=next_pc;
endmodule
注释:
每来到一个上升沿,next_pc赋给pc,即pc得到新值。
2、指令存储器instrmem
moduleinstrmem(pc,instruction);
//输入pc地址,输出指令
input[5:
0]pc;
output[31:
0]instruction;
reg[7:
0]instr_memory[0:
255];
reg[31:
0]instruction;
wire[7:
0]addr;
assignaddr={pc[5:
0],2'b00};
always@(addr)//由PC地址读出存储器里的数据
begin
instruction[31:
24]=instr_memory[{addr[7:
2],2'b11}];
instruction[23:
16]=instr_memory[{addr[7:
2],2'b10}];
instruction[15:
8]=instr_memory[{addr[7:
2],2'b01}];
instruction[7:
0]=instr_memory[{addr[7:
2],2'b00}];
end
always@(*)//对存储器赋初值,初值由各种指令组成,对指令进行测试
begin
00lw$16,0($0);10001100_00010000_00000000_00000000
14lw$17,4($0);10001100_00010001_00000000_00000100
28add$18,$16,$17;00000010_00010001_10010000_00100000
312or$21,$16,$17;00000010_00010001_10101000_00100101
416beq$18,$21,3;00010010_01010101_00000000_00000011
520sub$19,$16,$17;00000010_00010001_10011000_00100010
624and$20,$16,$17;00000010_00010001_10100000_00100100
728jr$31;00000011_11100000_00000000_00001000
832sw$21,8($0);10101100_00010101_00000000_00001000
936jal5;00001100_00000000_00000000_00000101
1040stl$22,$17,$16;00000010_00110000_10110000_00101010
1144j2;00001000_00000000_00000000_00000010
instr_memory[3]=8'b10001100;instr_memory[2]=8'b00010000;instr_memory[1]=8'b00000000;instr_memory[0]=8'b00000000;
instr_memory[7]=8'b10001100;instr_memory[6]=8'b00010001;instr_memory[5]=8'b00000000;instr_memory[4]=8'b00000100;
instr_memory[11]=8'b00000010;instr_memory[10]=8'b00010001;instr_memory[9]=8'b10010000;instr_memory[8]=8'b00100000;
instr_memory[15]=8'b00000010;instr_memory[14]=8'b00010001;instr_memory[13]=8'b10101000;instr_memory[12]=8'b00100101;
instr_memory[19]=8'b00010010;instr_memory[18]=8'b01010101;instr_memory[17]=8'b00000000;instr_memory[16]=8'b00000011;
instr_memory[23]=8'b00000010;instr_memory[22]=8'b00010001;instr_memory[21]=8'b10011000;instr_memory[20]=8'b00100010;
instr_memory[27]=8'b00000010;instr_memory[26]=8'b00010001;instr_memory[25]=8'b10100000;instr_memory[24]=8'b00100100;
instr_memory[31]=8'b00000011;instr_memory[30]=8'b11100000;instr_memory[29]=8'b00000000;instr_memory[28]=8'b00001000;
instr_memory[35]=8'b10101100;instr_memory[34]=8'b00010101;instr_memory[33]=8'b00000000;instr_memory[32]=8'b00001000;
instr_memory[39]=8'b00001100;instr_memory[38]=8'b00000000;instr_memory[37]=8'b00000000;instr_memory[36]=8'b00000101;
instr_memory[43]=8'b00000010;instr_memory[42]=8'b00110000;instr_memory[41]=8'b10110000;instr_memory[40]=8'b00101010;
instr_memory[47]=8'b00001000;instr_memory[46]=8'b00000000;instr_memory[45]=8'b00000000;instr_memory[44]=8'b00000010;
end
endmodule
注释:
存放指令操作码,根据addr读取instruction。
3.控制器部分
UART及其与其连接的数据存储器的32位信号输出作为控制器的控制信号,通过向UART送入的一连串32位数据就实现了对MIPS微处理器的操作。
control
modulecontrol(RegDst,RegWr,ExtOp,ALUSrc,ALUctr,MemWr,MemtoReg,branch,jump,instruction,rs,rt,rd,imm16,imm26,rst);
input[31:
0]instruction;//输入32位的指令
outputALUSrc,MemWr,RegWr,branch,ExtOp;//输出ALU数据选择,datamem写控制,beq控制,//符号位扩展
output[4:
0]rs,rt,rd;//输出3个寄存器地址
output[1:
0]jump,MemtoReg,RegDst;//输出jump,datamem输出选择,写寄存器选择
output[2:
0]ALUctr;//ALU控制
output[15:
0]imm16;//输出16位立即数
output[25:
0]imm26;//输出26位立即数
inputrst;
regALUSrc,MemWr,RegWr,branch,ExtOp;
reg[4:
0]rs,rt,rd;
reg[1:
0]jump,MemtoReg,RegDst;
reg[2:
0]ALUctr;
reg[15:
0]imm16;
reg[25:
0]imm26;
parameterR_type_=6'b0,lw_=6'b100011,sw_=6'b101011,beq_=6'b000100,j_=6'b000010,jal_=6'b000011;
parameteradd_=6'b100000,sub_=6'b100010,and_=6'b100100,or_=6'b100101,stl_=6'b101010,jr_=6'b001000;
always@(*)
begin
if(rst)
begin
ALUctr=3'b000;ALUSrc=0;MemWr=0;MemtoReg=2'b00;RegDst=2'b00;branch=0;jump=2'b00;RegWr=0;
end
else
begin
case(instruction[31:
26])
R_type_:
//R型指令
begin
case(instruction[5:
0])//R型指令需要对instruction后六位判别算术运算
add_:
begin//加指令
ALUctr=3'b000;ALUSrc=0;MemWr=0;MemtoReg=2'b00;RegDst=2'b01;branch=0;jump=2'b00;RegWr=1;
end
sub_:
begin//减指令
ALUctr=3'b001;ALUSrc=0;MemWr=0;MemtoReg=2'b00;RegDst=2'b01;branch=0;jump=2'b00;RegWr=1;
end
and_:
begin//与指令
ALUctr=3'b010;ALUSrc=0;MemWr=0;MemtoReg=2'b00;RegDst=2'b01;branch=0;jump=2'b00;RegWr=1;
end
or_:
begin//或指令
ALUctr=3'b011;ALUSrc=0;MemWr=0;MemtoReg=2'b00;RegDst=2'b01;branch=0;jump=2'b00;RegWr=1;
end
stl_:
begin//stl
ALUctr=3'b100;ALUSrc=0;MemWr=0;MemtoReg=2'b00;RegDst=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 周期 MIPS 控制器 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)