计算机组成原理报告实验心得体会范文,计算机组成原理实验三【计算机组成原理实验报告材料1-单周期】...

计算机组成原理实验报告

单周期处理器开发

Q:1064950364

2015.05.12

文档目录:

功能设计说明

模块化和层次化设计说明

具体模块定义

测试代码及结果

实验完成时间安排

心得体会

功能设计说明

1. 完成的指令集:

a) add,sub,and,or,slt,lw,sw,beq 和J 指令。

b) 不支持溢出。

2. 处理器为单周期设计。

3. 功能模块统一采用书上201页的图4-24设计,信号控制采用书上的193页图4-12和200页图4-22的真值表进行化简。

模块化和层次化设计说明

具体模块定义

数据通路:

1)PC模块定义:

(1) 基本描述

PC 主要功能是完成输出当前指令地址。复位后,PC指向0x0000_0000,此处为第一条指令的地址。

(2) 模块接口

信号名

方向

描述

[31:0]address

I

输入的指令地址

clk

I

时钟信号

rst

I

复位信号

[31:0]out

O

输出的指令地址

(3)功能定义

序号

功能名称

功能描述

1

复位

rst=1时,将out置为0X0000_0000

2

输出指令地址

时钟信号到来时,将address赋给out

2)NPC模块定义:

(1) 基本描述

NPC 主要功能是根据当前指令是否为beq指令,输出下一条指令的地址。该模块调用了MUX模块。

(2) 模块接口

信号名

方向

描述

[15:0]imaddr

I

指令的低16位

zero

I

ALU计算结果:

1表示当前两寄存器(rs,rt)值相等;

0表示不相等。

br

I

是否为beq指令。1是0否

[31:0]pc

I

输入当前指令地址

[31:0]npc

O

输出下一条指令地址

(3)功能定义

序号

功能名称

功能描述

1

输出指令地址

根据zero与br的值输出下一条指令的地址。

3)ALU模块定义:

(1) 基本描述

实现加、减、与、或、小于则赋1五种计算。

(2) 模块接口

信号名

方向

描述

[2:0]aluctrl

I

ALU控制信号

[31:0]A

I

rs寄存器的值

[31:0]B

I

rt寄存器的值

zero

O

B=0,则zero=1;

否则zero=0.

[31:0]result

O

Alu计算输出的结果。

(3)功能定义

序号

功能名称

功能描述

1

输出计算结果

根据alu控制信号,输出A与B的计算结果

2

输出zero

若result=0

则输出zero=1,否则输出zero=0。

4)MUX模块定义:

(1) 基本描述

实现32位和5位二选一数据选择器

(2) 模块接口

信号名

方向

描述

S

I

MUX控制信号

[31:0]d0/

[4:0]d0

I

MUX输入

[31:0]d1/

[4:0]d1

I

MUX输入

[31:0]y/

[4:0]y

O

MUX输出

(3)功能定义

序号

功能名称

功能描述

1

输出d0,或d1的值

S为0,y=d0;

S为1,y=d1.

5)EXT模块定义:

(1) 基本描述

将输入的16位地址按符号位扩展为32位。

(2) 模块接口

信号名

方向

描述

[15:0]addrin

I

输入的16位地址

[31:0]addrout

O

输出的32位地址

(3)功能定义

序号

功能名称

功能描述

1

输出扩展的32位地址.

将addrin扩展为32位的addrout.

6)regfile模块定义:

(1) 基本描述

根据输入的两个寄存器地址,输出相应寄存器的值,根据寄存器写信号和寄存器地址,将输入的数据选择写入寄存器。

(2) 模块接口

信号名

方向

描述

clk

I

时钟信号

[4:0]rreg1

I

Rs寄存器地址

[4:0]rreg2

I

Rt寄存器地址

[31:0]rdata1

O

Rs寄存器值

[31:0]rdata2

O

Rt寄存器值

regw

I

写寄存器信号

[4:0]wreg

I

Rt写寄存器地址

[31:0]wdata

I

写入寄存器的信号

(3)功能定义

序号

功能名称

功能描述

1

读寄存器数据

读rs、rt寄存器的数据

2

向寄存器写入数据

根据写信号向寄存器选择写入数据

7)im_4k模块定义:

(1) 基本描述

指令存大小为4K,初始化从code.txt载入指令。根据输入的指令地址,输出当前位置存储的指令。

(2) 模块接口

信号名

方向

描述

[9:0]addr

I

指令地址

[31:0]dout

O

指令

(3)功能定义

序号

功能名称

功能描述

1

载入指令

初始化载入code.txt中的指令

2

输出指令

根据输入的指令地址,输出当前指令

8)dm_4k模块定义:

(1) 基本描述

“数据存”大小为4K,根据输入的地址读出“数据存”中的数据,并根据数据写信号,将输入的数据选择写入“数据存”中。

(2) 模块接口

信号名

方向

描述

clk

I

时钟信号

[9:0]addr

I

数据地址

[31:0]din

I

写入的数据

we

I

数据存写信号

[31:0]dout

O

读出的数据

(3)功能定义

序号

功能名称

功能描述

1

读数据存数据

根据输入的数据地址,读出数据存的数据,读出的数据不一定被使用,只有lw指令才会使用。

2

向数据存写入数据

在时钟信号到来时,根据写数据信号,将输入的数据选择写入数据存中。

9)Jump模块定义:

(1) 基本描述

将输入的低26位指令左移两位,高四位加上pc+4的高4位,组成32位地址输出。

(2) 模块接口

信号名

方向

描述

[25:0]addrin

I

低26位指令

[31:0]pc

I

当前PC

[31:0]addrout

O

计算出的32位地址

(3)功能定义

序号

功能名称

功能描述

1

输出J跳转地址

输出计算得到的32位地址,为J指令要跳转的地址。

10) ALUCtrl模块定义:

(1) 基本描述

根据指令的低6位(function字段)和输入的aluop控制信号,利用真值表化简输出三位的ALU控制信号。真值表利用书上193页图4-12.

(2) 模块接口

信号名

方向

描述

[5:0]func

I

指令低6位

[1:0]aluop

I

Aluop控制信号

[2:0]aluctrl

O

Alu控制信号

(3)功能定义

序号

功能名称

功能描述

1

输出ALU控制信号

利用真值表化简输出ALU控制信号。

11) controller模块定义:

(1) 基本描述

根据输入的指令高6位(Op字段),利用真值表化简,输出RegDst,ALUSrc,MemtoReg,RegWrite,MemWrite,

Branch,J,ALUOp控制信号。真值表采用书上200页图4-22,再加上J指令的输入输出。其中高阻状态设为0。MemRead信号可以省略。

(2) 模块接口

信号名

方向

描述

[5:0]Op

I

指令高6位

RegDst

O

Rd寄存器控制信号

ALUSrc

O

ALU数据来源控制信号

MemtoReg

O

数据存数据写入寄存器控制信号

RegWrite

O

寄存器写控制信号

MemWrite

O

数据存写控制信号

Branch

O

Beq指令控制信号

J

O

J指令控制信号

[1:0]ALUOp

O

ALUOp控制信号

(3)功能定义

序号

功能名称

功能描述

1

输出各种控制信号

根据输入的OP,利用真值表化简,输出各种控制信号。

测试代码及结果

测试代码及结果:

在regfile模块初始化了17($s1),18($s2),20($s4)号寄存器的值分别为8、4、12.

add $s3,$s2,$s1 //$s3=4+8=12

sub $s5,$s4,$s3 //$s5=12-12=0

beq $s3,$s4,LI //$s3==$s4,跳到LI

sw $s2,1($s1)

lw $s3,1($s1)

LI:and $s5,$s4,$s3 //$s5=$s4 & $s3=12

or $s5,$s3,$s1 //$s5=$s4 | $s3=12

slt $s5,$s3,$s1 //$s3>$s1,$s5=0

sw $s2,1($s1) //存入4

lw $s3,1($s1) //载入4到$s3

j LI //跳转

生成的16进制文件(code.txt): // add $s3,$s2,$s1

0293a822 // sub $s5,$s4,$s3 // beq $s3,$s4,LI

ae320001 // sw $s2,1($s1)

8e330001 //lw $s3,1($s1)

0293a824 // LI:and $s5,$s4,$s3

0271a825 // or $s5,$s3,$s1

0271a82a // slt $s5,$s3,$s1

ae320001 // sw $s2,1($s1)

8e330001 // lw $s3,1($s1) //j LI

实验完成时间安排

实验前2小时看了Verilog语法,并用ModelSim跑了PPT给的counter程序。

实验课上跟着老师写了各个模块,至此各个模块已经基本写完。

中午用了不到1小时写了控制信号及顶层模块,只剩下测试工作。

中午用了大概半小时时间测试程序可以运行,完成调试。

总体完成时间在10小时以。

6、心得体会

通过该实验,对硬件编程有了更深入的理解。之前参加学校的PLD比赛赛前培训(后来时间太紧,比赛放弃),使用过Vivado跑了一段测试程序,当时对仿真一块还不太懂,此次实验更加深了理解。对单周期处理器的认识也更深刻了。开发初期,受c语言开发的限制,老是想不通这些模块的调用参数是如何传递的。后来想到Verilog有wire型变量,其实就可以将其想象成一条条真实的线,各个模块就是各个真实的器件,这些器件用线连接起来才可以工作。于是,便突破了思想局限,顺利完成了实验。使用开发工具多了,渐渐就会发现这些工具都小异,所以上手也会很快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值