中山大学计算机组成原理实验 单周期CPU设计.docx
- 文档编号:4195899
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:29
- 大小:949.90KB
中山大学计算机组成原理实验 单周期CPU设计.docx
《中山大学计算机组成原理实验 单周期CPU设计.docx》由会员分享,可在线阅读,更多相关《中山大学计算机组成原理实验 单周期CPU设计.docx(29页珍藏版)》请在冰豆网上搜索。
中山大学计算机组成原理实验单周期CPU设计
《计算机组成原理实验》
实验报告
(实验三)
学院名称
:
数据科学与计算机学院
专业(班级)
:
学生姓名
:
学号
:
时间
:
2019
年
11
月
8
日
成绩
:
实验三
:
单周期CPU设计与实现
一.实验目的
(1)掌握单周期CPU数据通路图的构成、原理及其设计方法;
(2)掌握单周期CPU的实现方法,代码实现方法;
(3)认识和掌握指令与CPU的关系;
(4)掌握测试单周期CPU的方法。
二.实验内容
设计一个单周期CPU,该CPU至少能实现以下指令功能操作。
指令与格式如下:
==>算术运算指令
(1)addrd,rs,rt
000000
rs(5位)
rt(5位)
rd(5位)
00000100000
功能:
GPR[rd]←GPR[rs]+GPR[rt]。
(2)subrd,rs,rt
000000
rs(5位)
rt(5位)
rd(5位)
00000100010
功能:
GPR[rd]←GPR[rs]-GPR[rt]。
(3)addiurt,rs,immediate
001001
rs(5位)
rt(5位)
immediate(16位)
功能:
GPR[rt]←GPR[rs]+zero_extend(immediate);immediate做符号扩展再参加“加”运算。
(4)addirt,rs,immediate
001111
rs(5位)
rt(5位)
immediate(16位)
功能:
GPR[rt]←GPR[rs]+sign_extend(immediate);immediate做符号扩展再参加“加”运算。
==>逻辑运算指令
(5)andirt,rs,immediate
001100
rs(5位)
rt(5位)
immediate(16位)
功能:
GPR[rt]←GPR[rs]andzero_extend(immediate);immediate做0扩展再参加“与”运算。
(6)andrd,rs,rt
000000
rs(5位)
rt(5位)
rd(5位)
00000100100
功能:
GPR[rd]←GPR[rs]andGPR[rt]。
(7)orirt,rs,immediate
001101
rs(5位)
rt(5位)
immediate(16位)
功能:
GPR[rt]←GPR[rs]orzero_extend(immediate)。
(8)orrd,rs,rt
000000
rs(5位)
rt(5位)
rd(5位)
00000100101
功能:
GPR[rd]←GPR[rs]orGPR[rt]。
==>移位指令
(9)sllrd,rt,sa
000000
00000
rt(5位)
rd(5位)
sa(5位)
000000
功能:
GPR[rd]←GPR[rt]< ==>比较指令 (10)sltirt,rs,immediate带符号数 001010 rs(5位) rt(5位) immediate(16位) 功能: ifGPR[rs] (11)sltrd,rs,rt 000000 rs(5位) rt(5位) rd(5位) 00000110000 ==>存储器读/写指令 (12)swrt,offset(rs)写存储器 101011 rs(5位) rt(5位) offset(16位) 功能: memory[GPR[base]+sign_extend(offset)]←GPR[rt]。 (13)lwrt,offset(rs)读存储器 100011 rs(5位) rt(5位) offset(16位) 功能: GPR[rt]←memory[GPR[base]+sign_extend(offset)]。 ==>分支指令 (14)beqrs,rt,offset 000100 rs(5位) rt(5位) offset(16位) 功能: if(GPR[rs]=GPR[rt])pc←pc+4+sign_extend(offset)<<2 elsepc←pc+4 特别说明: offset是从PC+4地址开始和转移到的指令之间指令条数。 offset符号扩展之后左移2位再相加。 为什么要左移2位? 由于跳转到的指令地址肯定是4的倍数(每条指令占4个字节),最低两位是“00”,因此将offset放进指令码中的时候,是右移了2位的,也就是以上说的“指令之间指令条数”。 (15)bners,rt,offset 000101 rs(5位) rt(5位) offset(16位) 功能: if(GPR[rs]! =GPR[rt])pc←pc+4+sign_extend(offset)<<2 elsepc←pc+4 (16)bltzrs,offset 000001 rs(5位) 00000 offset(16位) 功能: if(GPR[rs]<0)pc←pc+4+sign_extend(offset)<<2 elsepc←pc+4。 ==>跳转指令 (17)jaddr 000010 addr(26位) 功能: PC←{PC[31: 28],addr,2’b0},无条件跳转。 说明: 由于MIPS32的指令代码长度占4个字节,所以指令地址二进制数最低2位均为0,将指令地址放进指令代码中时,可省掉! 这样,除了最高6位操作码外,还有26位可用于存放地址,事实上,可存放28位地址,剩下最高4位由pc+4最高4位拼接上。 ==>停机指令 (18)halt 111111 00000000000000000000000000(26位) 功能: 停机;不改变PC的值,PC保持不变。 三.实验原理 单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一条指令的执行,即一条指令用一个时钟周期完成。 电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。 时钟周期一般也称振荡周期(如果晶振的输出没有经过分频就直接作为CPU的工作时钟,则时钟周期就等于振荡周期。 若振荡周期经二分频后形成时钟脉冲信号作为CPU的工作时钟,这样,时钟周期就是振荡周期的两倍。 ) CPU在处理指令时,一般需要经过以下几个步骤: (1)取指令(IF): 根据程序计数器PC中的指令地址,从存储器中取出一条指令,同时,PC根据指令字长度自动递增产生下一条指令所需要的指令地址,但遇到“地址转移”指令时,则控制器把“转移地址”送入PC,当然得到的“地址”需要做些变换才送入PC。 (2)指令译码(ID): 对取指令操作中得到的指令进行分析并译码,确定这条指令需要完成的操作,从而产生相应的操作控制信号,用于驱动执行状态中的各种操作。 (3)指令执行(EXE): 根据指令译码得到的操作控制信号,具体地执行指令动作,然后转移到结果写回状态。 (4)存储器访问(MEM): 所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出存储器的数据地址,把数据写入到存储器中数据地址所指定的存储单元或者从存储器中得到数据地址单元中的数据。 (5)结果写回(WB): 指令执行的结果或者访问存储器中得到的数据写回相应的目的寄存器中。 单周期CPU,是在一个时钟周期内完成这五个阶段的处理。 图1单周期CPU指令处理过程 MIPS指令的三种格式: 其中, op: 为操作码; rs: 只读。 为第1个源操作数寄存器,寄存器地址(编号)是00000~11111,00~1F; rt: 可读可写。 为第2个源操作数寄存器,或目的操作数寄存器,寄存器地址(同上); rd: 只写。 为目的操作数寄存器,寄存器地址(同上); sa: 为位移量(shiftamt),移位指令用于指定移多少位; funct: 为功能码,在寄存器类型指令中(R类型)用来指定指令的功能与操作码配合使用; immediate: 为16位立即数,用作无符号的逻辑操作数、有符号的算术操作数、数据加载(Laod)/数据保存(Store)指令的数据地址字节偏移量和分支指令中相对程序计数器(PC)的有符号偏移量; address: 为地址。 图2单周期CPU数据通路和控制线路图 图2是一个简单的基本上能够在单周期CPU上完成所要求设计的指令功能的数据通路和必要的控制线路图。 其中指令和数据各存储在不同存储器中,即有指令存储器和数据存储器。 访问存储器时,先给出内存地址,然后由读或写信号控制操作。 对于寄存器组,先给出寄存器地址,读操作时不需要时钟信号,输出端就直接输出相应数据;而在写操作时,在WE使能信号为1时,在时钟边沿触发将数据写入寄存器。 图中控制信号作用如表1所示,表2是ALU运算功能表。 表1控制信号的作用 控制信号名 状态“0” 状态“1” Reset 初始化PC和寄存器为0 PC接收新地址 hold PC更改,相关指令: 除指令halt外 PC不更改,相关指令: halt shift 来自寄存器堆输出A,相关指令: add、sub、addiu、or、and、andi、ori、slti、beq、bne、bltz、sw、lw 来自移位数sa,同时,进行(zero-extend)sa,即{{27{1'b0}},sa},相关指令: sll ALUSrc 来自寄存器堆输出B,相关指令: add、sub、or、and、beq、bne、bltz 来自sign或zero扩展的立即数,相关指令: addi、andi、ori、slti、sw、lw DataSrc 来自ALU运算结果的输出,相关指令: add、addiu、sub、ori、or、and、andi、slti、sll 来自数据存储器(DataMEM)的输出,相关指令: lw RegWre 无写寄存器组寄存器,相关指令: beq、bne、bltz、sw、halt 寄存器组写使能,相关指令: add、addiu、sub、ori、or、and、andi、slti、sll、lw memWR 无操作 写数据存储器,相关指令: sw RegDst 写寄存器组寄存器的地址,来自rt字段,相关指令: addiu、andi、ori、slti、lw 写寄存器组寄存器的地址,来自rd字段,相关指令: add、sub、and、or、sll Extop (zero-extend)immediate(0扩展),相关指令: addiu、andi、ori (sign-extend)immediate(符号扩展) ,相关指令: slti、sw、lw、beq、bne、bltz ALUOp[2..0] ALU8种运算功能选择(000-111),看功能表 相关部件及引脚说明: InstructionMemory: 指令存储器, addr,指令存储器地址输入端口 DataOut,指令存储器数据输出端口(指令代码输出端口) DataMemory: 数据存储器, addr,数据存储器地址输入端口 DataIn,数据存储器数据输入端口 DataOut,数据存储器数据输出端口 WR,数据存储器写控制信号,为0写 RegisterFile: 寄存器组 ReadReg1,rs寄存器地址输入端口 ReadReg2,rt寄存器地址输入端口 WriteReg,将数据写入的寄存器端口,其地址来源rt或rd字段 WriteData,写入寄存器的数据输入端口 ReadData1,rs寄存器数据输出端口 ReadData2,rt寄存器数据输出端口 WE,写使能信号,为1时,在时钟边沿触发写入 ALU: 算术逻辑单元 result,ALU运算结果 zero,运算结果标志,结果为0,则zero=1;否则zero=0 四.实验器材 电脑一台,XilinxVivado软件一套,Basys3板一块。 五.实验过程与结果 Ⅰ数据通路设计 1、PC/NPC程序计数器 设计程序计数器模块PC和配套的下一条PC的生成器NPC,这里统称PC。 输入: 时钟CLK,复位信号RESET,分支信号BRANCH,零指示器ZERO,跳转信号JUMP,26位立即数输入IMM26,32位立即数输入IMM32 输出: PC(currentaddress)当前程序计数器的值。 功能: 每个时钟周期根据输入的信号更新PC值并输出,RESET=1时会强制置零PC。 其中优先级最高的信号为JUMP,其次为BRANCH,再次为ZERO。 实现: 用32位寄存器存储PC值。 电路是时序逻辑,所以要用always语句对CLK和RESET的上升沿敏感,使用if-elseif-else和非阻塞赋值实现PC的更新。 这里注意,不管我们的跳转来自imm32还是imm26,都不保存地址的后二位,因此需要进行左移2位。 图1.1PC的verilog实现 2、InstructionMemory指令存储器 编写程序来模拟指令存储内存,实现指令的初始化与读取; 输入: 指令地址ADDR 输出: 指令INSTR 实现: 建立寄存器组模拟内存,使用系统任务语句readmemb从文件中读取指令到该模拟内存,用下标模拟访问。 因为模块是组合逻辑,所以直接用always@(*)阻塞赋值或assign连线即可。 图1.2指令存储器的实现 3、数据存储器DataMemory 编写程序来模拟内存,实现内存存储,内存读写。 我们设置宽度为8,数据位数32,也就是每4块存储单元保存一个数据。 我们可以设计一个mem[N*4][8]的寄存器数组,通过下标来寻址。 N为数据存储器的数据容量。 输入: 时钟信号CLK,写使能信号MEMWR,目标地址ADDR,数据输入DATAIN 输出: 数据输出端DATAOUT 实现: 使用寄存器数组、always持续非阻塞赋值和分支判断语句。 图1.3数据存储器的实现 4、寄存器文件Regfile 模拟32个32位寄存器组成的寄存器组,其中零号寄存器$zero恒为零。 输入: CLK,Reset,WriteEnable,Ra[4: 0],Rb[4: 0],Rw[4: 0],data[31: 0] 输出: A[31: 0],B[31: 0] 实现: 时钟上升沿时写入data,其他时间恒将输出A、B与目标读取数据相连。 图1.4寄存器文件的实现 5、立即数扩展部件Extender 对16位立即数进行符号或算术扩展。 输入: EXTOP扩展标识符,IMM16立即数 输出: IMM32立即数 实现: 进行简单的assign连线和逻辑判断即可。 图1.5立即数扩展部件的实现 6、算术逻辑单元ALU ALU被用于算术逻辑计算和跳转指令比较。 输入: 三位ALUCTR控制信号,32位数据输入A、B; 输出: 零标识符zero,运算结果out; 实现: 这里对几种运算做如下的编码 表2ALU运算功能表 ALUOp[2..0] 功能 描述 000 Y=A+B 加 001 Y=A–B 减 010
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中山大学计算机组成原理实验 单周期CPU设计 中山 大学计算机 组成 原理 实验 周期 CPU 设计