北工大Logisim完成单周期处理器开发.docx
《北工大Logisim完成单周期处理器开发.docx》由会员分享,可在线阅读,更多相关《北工大Logisim完成单周期处理器开发.docx(21页珍藏版)》请在冰点文库上搜索。
![北工大Logisim完成单周期处理器开发.docx](https://file1.bingdoc.com/fileroot1/2023-5/15/8bed3409-863a-41c2-85b5-c2a518612183/8bed3409-863a-41c2-85b5-c2a5186121831.gif)
北工大Logisim完成单周期处理器开发
Logisim完成单周期处理器开发
实验报告
学号__________********__________
姓名___________王禹心___________
指导教师___________朱文军___________
提交日期__________2019.5.28_________
成绩评价表
报告内容
报告结构
报告最终成绩
□丰富正确
□基本正确
□有一些问题
□问题很大
□完全符合要求
□基本符合要求
□有比较多的缺陷
□完全不符合要求
报告与Project功能一致性
报告图表
总体评价
□完全一致
□基本一致
□基本不一致
□符合规范
□基本符合规范
□有一些错误
□完全不正确
教师签字:
________________________
一、总体数据通路结构设计图
二、数据通路中的模块设计图
1、IFU
2、GPR
3、ALU
4、EXT
5、DM
6、Controller
三、控制器设计
四、机器指令描述
五、测试程序
六、运行结果
七、问答
八、收获体会
附:
Logisim模块目录
一、总体数据通路结构设计图
二、数据通路中的模块设计图
1、IFU
模块接口
信号名
方向
描述
Zero
I
ALU计算结果
1:
计算结果为0
0:
计算结果非0
Clk
I
时钟信号
Reset
I
复位信号
1:
复位
0:
无效
Insout[31:
0]
O
32位MIPS指令
功能定义
序号
功能名称
描述
1
复位
当复位信号有效时,PC被设置为0x00000000
2
取指令
根据PC从IM中取出指令
3
计算下一条指令地址
若不是beq指令,则PC<-PC+1,若是beq指令,且zero为1,则PC<-PC+sign_ext
2、GPR
信号名
方向
描述
Wd[31:
0]
I
写入数据的输入
Regwrite
I
读写控制信号
1:
写操作
0:
读操作
Clk
I
时钟信号
Reset
I
复位信号
1:
复位
0:
无效
A1[4:
0]
I
读存取器地址1
A2[4:
0]
I
读存取器地址2
A3[4:
0]
I
写寄存器地址
Rd1[31:
0]
O
32位数据输出1
Rd2[31:
0]
O
32位数据输出2
3、ALU
模块接口
信号名
方向
描述
A[31:
0]
I
32位输入数据1
B[31:
0]
I
32位输入数据2
2F[1:
0]
I
控制信号
01:
或运算
10:
减法
11加法
C[31:
0]
O
32位数据输出
功能定义
序号
功能名称
描述
1
或
A|B
2
减
A-B
3
加
A+B
4、EXT
模块接口
信号名
方向
描述
Imm16[15:
0]
I
16位数据输入
Extop[1:
0]
I
控制信号
00:
高位补0
01:
低位补0
10:
符号扩展
Ext32
O
32位数据输出
功能定义
序号
功能名称
描述
1
高位补0
高16位补0
2
低位补0
低16位补0
3
符号扩展
符号位扩展
5、DM
模块接口
信号名
方向
描述
D[31:
0]
I
写入数据的输入
Memwrite
I
读写控制信号
1:
写操作
Clk
I
时钟信号
Reset
I
复位信号
1:
复位
0:
无效
A[4:
0]
I
操作寄存器地址
Out[31:
0]
0
32位数据输出
功能定义
序号
功能名称
描述
1
复位
当复位信号有效时,所有数据被设置为0
2
读
根据输入的寄存器地址读出数据
3
写
根据输入的地址把输入的数据写入
6、Controller
模块接口
信号名
方向
描述
Op[5:
0]
I
六位op
Func[5:
0]
I
六位function
Regdst
0
写地址控制
Alusrc
0
cpu第二操作数选择控制
Mentoreg
0
Dm读控制
Regwrite
0
GPR读写控制
Memwrite
0
DM写控制,写入GPR数据选择
Npc_sel
0
Beq指令标志
Extop
0
控制ext扩展方式
Aluop[1:
0]
0
控制cpu进行相应运算
三、控制器设计
单周期真值表
Func
100000
100010
N/A
Op
000000
000000
001101
100011
000100
001111
add
sub
ori
lw
sw
beq
lui
RegDst
1
1
0
0
X
X
0
ALUSrc
0
0
1
1
1
0
1
MentoReg
0
0
0
1
X
X
X
RegWrite
1
1
1
1
0
0
2
MemWrite
0
0
0
0
1
0
0
Npc_sel
0
0
0
0
0
1
0
Extop
X
X
0
0
0
X
1
ALUctr
Add
subtract
or
add
add
subtract
X
四、机器指令描述
助记符
opcode
function
功能
addu
000000
100001
rd<-rs+rt
subu
000000
100011
rd<-rs-rt
ori
001101
rt<-rs|(zero-extend)immediate
lw
100011
rt<-memory[rs+(sign-extend)immediate]
sw
101011
memory[rs+(sign-extend)immediate]<-rt
beq
000100
if(rs==rt)PC<-PC+4+(sign-extend)immediate<<2
lui
001111
rt<-immediate*65536
j
000010
PC<-(PC+4)[31..28],address,0,0
五、测试程序
lui$t0,0x0004#lui测试程序要实现:
立即数0x0004加载至t0寄存器的高位lui$t1,0x0008#lui测试程序要实现:
立即数0x0008加载至t1寄存器的高位ori$t3,$zero,0x00002000#ori测试程序要实现:
zero寄存器中的内容与立即数0x00002000进行或运算,储存在t3寄存器中
sw$t0,4($t3)#sw测试程序要实现:
把t0寄存器中值(1Word),存储到t3的值再加上偏移量4,所指向的RAM中
sw$t0,8($t3)#sw测试程序要实现:
把t0寄存器中值(1Word),存储到t3的值再加上偏移量8,所指向的RAM中
loop:
add$t2,$t2,$t1#add测试程序要实现:
t1寄存器中的值加上t2寄存器中的值后存到t2寄存器中
lw$t4,4($t3)#lw测试程序要实现:
把t3寄存器的值+4当作地址读取存储器中的值存入t4
lui$t5,0x0004#lui测试程序要实现:
立即数0x0004加载至t5寄存器的高位sub$t7,$t6,$t5#sub测试程序要实现:
t6寄存器中的值减去t5寄存器中的值后存到t7寄存器中
add$t0,$t0,$t5#sub测试程序要实现:
t0寄存器中的值减去t5寄存器中的值后存到t0寄存器中
add$t6,$t6,$t0#add测试程序要实现:
t6寄存器中的值加上t0后存到t6寄存器中beq$t0,$t1,loop#beq测试程序要实现:
判断t0的值和t1的值是否相等,相等转loopadd$t0,$t0,$t5#add测试程序要实现:
t0寄存器中的值加上t5后存到t0寄存器中lui$v0,0x0001#lui测试程序要实现:
立即数0x0001加载至v0寄存器的高位lui$v1,0x0002#lui测试程序要实现:
立即数0x0002加载至v1寄存器的高位add$v0,$v0,$v1#add测试程序要实现:
v0寄存器中的值加上v1后存到v0寄存器中add$v1,$v0,$v1#add测试程序要实现:
v0寄存器中的值加上v1后存到v1寄存器中ori$a0,$v0,0xffff#ori测试程序要实现:
v0寄存器中的内容与立即数0xffff进行或运算,储存在a0寄存器中
sub$a1,$a0,0x0000ffff#sub测试程序要实现:
a0寄存器中的值减去立即数0x0000ffff后存到a1寄存器中
loop2:
sub$a2,$v1,$v0#sub测试程序要实现:
v1寄存器中的值减去v0中的值后存到a2寄存器中
add$a1,$a2,$a1#add测试程序要实现:
a2寄存器中的值加上a1后存到a1寄存器中beq$a1,$v1,loop2#beq测试程序要实现:
判断a1的值和v1的值是否相等,相等转loop2
机器码:
3c0800043c090008340b2000ad680004014950208d6c00043c0d000401cd7822010d402001c870201109fff9010d40203c0200013c03000200431020004318203444ffff3c0100003421ffff008128220062302200c5282010a3fffd
MARS:
六、运行结果
GPR
DM
七、问答
1.请充分利用Figure3中的X可以将控制信号化简为最简单的表达式。
RegDst=add+sub
ALUSrc=ori+lw+sw
MemtoReg=lw
RegWrite=add+sub+ori+lw
MemWrite=sw
Npc_sel=beq
Extop=lw+sw
ALUctr[0]=~(subu+beq)
ALUctr[1]=~ori+lui
ALUctr[2]=0
2.对于Figure5、Figure6中的与或阵列来说,1个3输入与门最终转化为2个2输入与门,1个4输入与门最终转化为3个2输入与门,依次类推。
或阵列也类似计算。
那么
a)请给出采用Figure5、Figure6中的方法设计的每个控制信号所对应的2输入与门、2输入或门、非门的数量。
2输入与门
2输入或门
非门
RegDst
17
1
10
RegWrite
32
4
10
ALUsrc
20
3
5
PCsrc
5
0
5
Memwrite
5
0
2
MemRead
5
0
3
MentoReg
5
0
3
Extop
15
2
4
ALUctr[1]
10
1
3
ALUctr[2]
21
2
9
b)请与第17项对比,你更喜欢哪种设计方法。
为什么
第一种的每个控制信号都需要对其分配单独的与门、或门,因为它是直接对op、func的12位或6位信号的逻辑表达式,所以没有针对性并且浪费元件。
而第二种是先把op、func变成相应的指令信号,再由指令信号生成控制信号。
当一种指令对应多种控制信号为1时,不必再对每个信号再单独为这个指令分配与门,而可以共用这个指令的信号,再添加或门就可以了。
八、收获体会
第一次课设主要重新熟悉了Logisim软件,并且使用较为简单的方式做出了较为基础的几个指令。
通过本次课设我更好的理解了每条指令的用途,调用指令完成一些存储功能。
在连线中我遇到最大的困难是IFU的设计,其中指令的跳转对于我比较难编写,在逻辑上出现一些问题导致存储器的数据存储的不太对。
经过修改后我更加理解了每个模块的运行过程,为下次课设打好基础。