当前位置:   article > 正文

硬布线控制器设计单周期MIPS处理器_单周期mips硬布线

单周期mips硬布线

一、实习内容

1.基本要求:采用硬布线控制器设计单周期MIPS处理器,能支持下表中的24条MIPS指令,能运行标准测试程序benchmark.asm。

序号

指令

序号

指令

序号

指令

序号

指令

序号

指令

序号

指令

1

SLL

2

SRA

3

SRL

4

ADD

5

ADDU

6

SUB

7

AND

8

OR

9

NOR

10

SLT

11

SLTU

12

JR

13

SYSCALL

14

J

15

JAL

16

BEQ

17

BNE

18

ADDI

19

ANDI

20

ADDIU

21

SLTI

22

ORI

23

LW

24

SW

2.功能扩展:从MIPS指令手册中选择指令,条数不能少于5条,依据增加的指令设计测试程序验证处理器。

二、指令系统

序号

指令

类型

指令格式

功能

汇编举例

1

SLL

R

SLL rd,rt,sa

将寄存器值左移指定的位数后写回目标寄存器。

sll $t0, $s0, 2

2

SRA

R

SRA rd,rt,sa

将寄存器值右移指定的位数后写回目标寄存器,按符号位进行填充。

sra $t0, $s0, 2

3

SRL

R

SRL rd,rt,sa

将寄存器值右移指定的位数后写回目标寄存器,按零进行填充。

srl $t0, $s0, 2

4

ADD

R

ADD rd,rs,rt

将两个寄存器的值相加后写回目标寄存器,如果结果发生溢出则产生异常。

add $t0, $s0, $s1

5

ADDU

R

ADDU rd,rs,rt

将两个寄存器的值相加后写回目标寄存器,忽略溢出。

Addu $t0, $s0, s1

6

SUB

R

SUB rd,rs,rt

将寄存器 rs 的值减去 rt 的值后写回目标寄存器,如果结果发生溢出则产生异常

sub $t0, $s0, $s1

7

AND

R

AND rd,rs,rt

将寄存器 rs 和寄存器 rt 的值进行按位与操作后将结果写入目标寄存器

and $t0, $s0, $s1

8

OR

R

OR rd,rs,rt

将寄存器 rs 和寄存器 rt 的值进行按位或操作后将结果写入目标寄存

or $t0, $s0, $s1

9

NOR

R

NOR rd,rs,rt

将寄存器 rs 和寄存器 rt 的值进行按位异或操作后将结果取反写入目标寄存器

nor $t0, $s0, $s1

10

SLT

R

SLT rd,rs,rt

比较寄存器 rs 和寄存器 rt 的有符号值,如果 rs 的值小于 rt 的值则将目标寄存器设为 1,否则设为 0。

slt $t0, $s0, $s1

11

SLTU

R

SLTU rd,rs,rt

比较寄存器 rs 和寄存器 rt 的无符号值,如果 rs 的值小于 rt 的值则将目标寄存器设为 1,否则设为 0。

sltu $t0, $s0, $s1

12

JR

R

JR rs

将跳转地址设为寄存器 rs 中的

jr $s0

13

SYSCALL

SYSCALL

实现系统调用(例如 I/O 操作、进程管理等

syscall

14

J

J

J target

无条件跳转到指定的目标地址。

j loop

15

JAL

J

JAL target

跳转到指定的目标地址,并将当前地址存储到寄存器 $ra 中,以便过后可以返回

jal function

16

BEQ

I

BEQ rs,rt,offs

如果两个寄存器中的值相等,则跳转到指定的地址。

beq $t0, $t1, loop

17

BNE

I

BNE rs,rt,off

如果两个寄存器中的值不相等,则跳转到指定的地址。

bne $t0, $t1, loop

18

ADDI

I

ADDI rt,rs,imm

将寄存器 rs 的值和立即数进行相加后将结果写入寄存器 rt 中

addi $t0, $s0, 10

19

ANDI

I

ANDI rt,rs,imm

将寄存器 rs 的值和零扩展后的立即数进行按位与操作后将结果写入寄存器 rt

andi $t0, $s0, 0x0F

20

ADDIU

I

ADDIU rt,rs,imm

将寄存器 rs 的值和立即数之和的无符号数存储在寄存器 rt

addiu $t0, $s0, 10

21

SLTI

I

SLTI rt,rs,imm

如果 rs 寄存器中的值小于立即数 immediate,则将 rt 寄存器中的值设为 1,否则设为 0。

slti $t0, $s0, 10

22

ORI

I

ORI rt,rs,imm

将寄存器 rs 的值和零扩展后的立即数进行按位或操作后将结果写入寄存器 rt

ori $t0, $s0, 0xFF

23

LW

I

LW rt,offset

将存储在以 base 寄存器为起始地址加上 offset 位移后的 32 位数据读取到 rt 寄存器

lw $t0, 4($s0)

24

SW

I

SW rt,offset

将 rt 寄存器中的 32 位数据存储到以 base 寄存器为起始地址加上 offset 位移后的内存中

sw $t0, 4($s0)

25

LB

I

LB rt,offset(rs)

将一个字节(8位)的数据从存储器中加载到寄存器中,并进行符号扩展,即将最高位符号位(MSB)复制到剩余的32位中,以便处理有符号数。

Lb $t0,16($s0)

26

LTL

R

LTL rs,rt

有符号比较,如果rs<rt,则rs为1,否则为0

Tlt $t0, $t1

27

LTLU

R

LTLU rs,rt

无符号比较,如果rs<rt,则rs为1,否则为0

Tlt $t0, $t1

28

LTLI

I

LTLI rs,imm

有符号比较,如果rs<imm,则rs为1,否则为0

Tlt $t0, 10

29

LTLIU

I

LTLIU rs,imm

无符号比较,如果rs<imm,则rs为1,否则为0

Tlt $t0, 10

三、数据通路设计

1.部件

(1). 指令存储器(Instruction Memory,IM):存储程序代码,提供指令给处理器执行。

(2). 数据存储器(Data Memory,DM):存储读写数据。

(3). 寄存器堆(Register File,RF):存储处理器的通用寄存器,提供读写操作。

(4). 算术逻辑单元(Arithmetic Logic Unit,ALU):完成处理器的算术和逻辑运算。

(5). 控制单元(Control Unit,CU):根据指令的OpCode字段和FUNCT字段产生控制信号,控制处理器中各个部件的操作。

(6). 时钟(Clock):提供钟信号,控制处理器的各项操作同步进行。

(7). PC寄存器(Program Counter,PC):记录下一条指令的存储地址。

(8). 地址加法器(Address Adder):将PC的值和偏移量相加,计算出下一条指令的地址。

(9).辅助部件:符号扩展单元(Sign-Extend Unit)、多路选择器(MUX)、逻辑门与或非等等。

2.数据通路框图

3.数据通路

①单周期MIPS处理器

可运行标准测试程序benchmark.asm

②单周期硬布线控制器

OP字段为0,Func字段为32,ADD指令,控制信号RegWrite与RegDst为1,其余为0

③运算控制器、控制信号自动生成

四、指令与控制信号之间的关系

五、测试

扩展指令测试

1. LB指令测试用例:

假设有一个字节型数组存储在存储器的基地址为0x10010000的位置,数组内容为{0x12, 0xAB, 0x34, 0xCD},现在要将数组中的第2个元素(即0xAB)加载到$t0$寄存器中,并对其进行符号扩展。

汇编指令:LB $t0, 1($s0)

其中,$s0$为存储器的基地址0x10010000,偏移量1表示要读取数组的第2个元素。

1. 存储器中的数据:

地址                     存储数据

0x10010000               0x12

0x10010001               0xAB

0x10010002               0x34

0x10010003               0xCD

2. 执行LB指令后,$t0$寄存器中的数据值应该为-85 (0xAB的有符号扩展):

寄存器               储存数据

$t0                  -85

2. TLT指令测试用例:

假设要比较$t0$和$t1$两个寄存器中存储的有符号数值的大小,如果$t0$的数值比$t1$的数值小,则跳转到标签$L1$,否则继续执行下一条指令。

MIPS汇编代码:TLT   $t0, $t1, L1

假设$t0$中的数值为-5,$t1$中的数值为6,则当执行上述指令时,应该跳转到标签$L1`(假设该标签在程序中的地址为0x0040002C)。

1. 在程序中,$t0$和$t1$寄存器的值分别为-5和6,如下所示:

寄存器               储存数据

$t0                  -5

$t1                  6

2. 执行TLT指令后,根据比较结果,应该跳转到标签$L1$,即指令PC的值应该被设置为0x0040002C(标签$L1$所在的地址)。

PC                  0x0040002C

因此,该测试用例验证了TLT指令在比较寄存器中的有符号数值大小时的正确性。

3.LTLI指令测试用例:

假设要比较$t0$和$t1$两个寄存器中存储的有符号数值的大小,如果$t0$的数值比-5小,则跳转到标签$L1$,否则继续执行下一条指令。

MIPS汇编代码:LTLI   $t0, -5, L1

假设$t0$中的数值为-6,则当执行上述指令时,应该跳转到标签$L1`(假设该标签在程序中的地址为0x0040002C)。

1. 在程序中,$t0$寄存器的值为-6,如下所示:

寄存器               储存数据

$t0                  -6

2. 执行LTLI指令后,根据比较结果,应该跳转到标签$L1$,即指令PC的值应该被设置为0x0040002C(标签$L1$所在的地址)。

PC                  0x0040002C

因此,该测试用例验证了LTLI指令在比较寄存器中的有符号数值大小时的正确性。

4. LTLU指令测试用例:

假设要比较$t0$和$t1$两个寄存器中存储的无符号数值的大小,如果$t0$的数值比$t1$小,则跳转到标签$L1$,否则继续执行下一条指令。

MIPS汇编代码:LTLU   $t0, $t1, L1

假设$t0$中的数值为4294967295(即无符号数的最大值),$t1$中的数值为2,则当执行上述指令时,应该跳转到标签$L1`(假设该标签在程序中的地址为0x0040002C)。

1. 在程序中,$t0$和$t1$寄存器的值分别为4294967295和2,如下所示:

寄存器               储存数据

$t0                  4294967295

$t1                  2

2. 执行LTLU指令后,根据比较结果,应该跳转到标签$L1$,即指令PC的值应该被设置为0x0040002C(标签$L1$所在的地址)。

PC                  0x0040002C

因此,该测试用例验证了LTLU指令在比较寄存器中的无符号数值大小时的正确性。

5. LTLIU指令测试用例:

假设要比较$t0$和$t1$两个寄存器中存储的无符号数值的大小,如果$t0$的数值比100小,则跳转到标签$L1$,否则继续执行下一条指令。

MIPS汇编代码:LTLIU   $t0, 100, L1

假设$t0$中的数值为50,则当执行上述指令时,应该跳转到标签$L1`(假设该标签在程序中的地址为0x0040002C)。

1. 在程序中,$t0$寄存器的值为50,如下所示:

寄存器               储存数据

$t0                  50

2. 执行LTLIU指令后,根据比较结果,应该跳转到标签$L1$,即指令PC的值应该被设置为0x0040002C(标签$L1$所在的地址)。

PC                  0x0040002C

因此,该测试用例验证了LTLIU指令在比较寄存器中的无符号数值大小时的正确性。

六、附录

benchmark.hex

v2.0 raw
20110001 8000c05 20110001 20120002 20130003 8000c09 20110001 20120002
20130003 8000c0d 20110001 20120002 20130003 8000c11 20110001 20120002
20130003 c000cb8 20100001 20110001 118fc0 112020 20020022 c
118882 12200001 8000c15 112020 20020022 c 20110001 118880
112020 20020022 c 12200001 8000c1f 20110001 118fc0 112020
20020022 c 1188c3 112020 20020022 c 118903 112020
20020022 c 118903 112020 20020022 c 118903 112020
20020022 c 118903 112020 20020022 c 118903 112020
20020022 c 118903 112020 20020022 c 118903 112020
20020022 c 20100001 109fc0 139fc3 8021 2012000c 24160003
26100001 3210000f 20080008 20090001 139900 2709825 132020 20020022
c 1094022 1500fff9 22100001 2018000f 2188024 108700 20080008
20090001 139902 2709825 132021 20020022 c 1094022 1500fff9
108702 2c9b022 12c00001 8000c50 4020 1084027 84400 3508ffff
82021 20020022 c 2010ffff 20110000 ae300000 22100001 22310004
ae300000 22100001 22310004 ae300000 22100001 22310004 ae300000 22100001
22310004 ae300000 22100001 22310004 ae300000 22100001 22310004 ae300000
22100001 22310004 ae300000 22100001 22310004 ae300000 22100001 22310004
ae300000 22100001 22310004 ae300000 22100001 22310004 ae300000 22100001
22310004 ae300000 22100001 22310004 ae300000 22100001 22310004 ae300000
22100001 22310004 ae300000 22100001 22310004 22100001 8020 2011003c
8e130000 8e340000 274402a 11000002 ae330000 ae140000 2231fffc 1611fff8
102020 20020022 c 22100004 2011003c 1611fff2 20020032 c
20100000 22100001 102020 20020022 c 22100002 102020 20020022
c 22100003 102020 20020022 c 22100004 102020 20020022
c 22100005 102020 20020022 c 22100006 102020 20020022
c 22100007 102020 20020022 c 22100008 102020 20020022
20020022 c 3e00008

test.asm

  1. .data
  2. str: .asciiz "Hello world!"
  3. value: .byte 35
  4. number: .word 1234567890
  5. result: .word 0
  6. .text
  7. .globl main
  8. main:
  9. la $t0, str
  10. lb $t1, ($t0)
  11. lw $t2, number
  12. lbu $t3, value
  13. li $t4, -100
  14. li $t5, 200
  15. lui $t6, 0xffff
  16. ori $t6, $t6, 0xffff
  17. slt $t7, $t5, $t4
  18. sll $t8, $t2, 1
  19. add $t9, $t3, $t8
  20. sw $t9, result
  21. li $v0, 10
  22. syscall
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/720251
推荐阅读
相关标签
  

闽ICP备14008679号