西安交通大学组成专题实验报告

更新时间:2024-07-04 05:14:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算机组织与结构专题实验报告 MIPS单周期处理器的设计

学生姓名 赵荣建 专业班级 计算机45班 学 号 2140505119 指导教师 姜欣宁 完成日期 2017-05-09

一.实验目的

根据所学的CPU组成原理,自主设计一个MIPS32位的单周期处理器。

二.设计方案

参照计算机组成原理教材上的MIPS32位处理器的工作原理。 1.构建数据通路

取指令 指令译码 指令执行 存储器访问 结果写回

取指周期:

a.从指令寄存器PC输出端得到地址 b.送地址到指令存储器IM地址端A c.从指令存储器IM的数据端RD得到指令

d.计算下地址:通过运算器,PC+4形成下地址,送回到PC。

2. .MIPS 寄存器集:定义了32个32位的寄存器

3.MIPS三种指令格式:R-类型、I-类型和J-类型

R-类型格式:

* 所有指令操作吗OP都是0;特定操作由funct决定。

* 机器语言指令中,字段分配格式如上图;前两个寄存器rs、 rt

是源寄存器,rd是目的寄存器。而在汇编语言格式中,第一个 寄存器是目的寄存器。

如:add $t0,$s4,$s5 #[rd]=[rs]+[rt],[t0]=[s4]+[s5]; I-类型格式:

* 指令含4个字段;op, rs, rt 和 imm

* 有两个寄存器操作数和一个16位立即数操作数,

一些指令中,rt也可作为源寄存器。 J-类型格式:

* 有一个26位立即数操作数,扩展后形成目的地址。

4.算逻单元ALU的设计

<<210Add<<2JumpMemToReg4Add01ControlMemReadMemWriteBranchALUopALUsrcRegWriteInstructionMemoryPC0R1Rdata132R21Register FileW1WdataALU32zeroResult32AddrRdata20132DataData0321Memory3Wdata{15~0}sign32extend2ALUcontrol6{5~0}ALU工作原理图

BA321zeroALU3232Result* 两级控制:通过系统控制器(Control)

3ALUoperFunc6ALUcontrol2ALUop 和运算器控制器(ALU Control)产生 ALU的控制信号:ALUoper

* ALU控制信号对照表:

ALUop Func(来自R型指令的func字段) 操作 ALUop1 ALUop2 F5 0 0 1 1 1 1 1 0 1 × × × × × × × × × × × × F4 × × × × × × × F3 × × 0 0 0 0 1 F2 × × 0 0 1 1 0 F1 × × 0 1 0 0 1 F0 × × 0 0 0 1 0 010:ADD 110:SUB 010:ADD 110:SUB 000:AND 001: OR 111:SLT 5.单周期数据通路的构建

1)构件:PC、指令存储器、寄存器文件RF和数据存储器; 2)取指令的过程:PC→IM: A/RD

3)取源操作数的过程: IM:RD→RF:A1/RD1。

4)立即数的符号扩展的过程:

IM:RD(Instr:15:0)→Sign Extend(15:0→Signimm31:0);

其中Signimm15:0=Instr15:0, Signimm31:16=Instr15

5)存储器地址计算:

6)向寄存器文件写入数据

RegWrite信号被置成1,写入过程在时钟周期最后的时钟上升沿完成。

7)形成PC的下地址 指令占4个字节,字编址。

6.单周期控制器的构建

控制单元基于指令中的opcode字段(31:26)、funct字段(5:0)产生控制信号;主译码的真值表。见下图:

7.完整的单周期MIPS处理器

三.设计过程

1.指令集设计 R型指令 指令序号 指令

译码结果(B)

存储指令

(H)

<0> <1> <2> <3> <4> <5> <6> <13> <14> <17> <18>

add

$s0,$s1,$s2 sub

$t0,$t1,$t2 and

$s3,$s4,$s5 or

$s0,$s6,$s7 xor

$t3,$t4,$t5 slt

$t7,$t5,$t6 nor

$t7,$t5,$t6 srl

$t0,$s1,$t5 sll

$t0,$s1,$t2 inc $t0,$t6 dec $t0,$t5

000000 10001 10010 10000 00000 100000

000000 01001 01010 01000 00000 100010

000000 10100 10101 10011 00000 100100

000000 10110 10111 10000 00000 100101

000000 01100 01101 01011 00000 100110

000000 01101 01110 01111 00000 101010

000000 01101 01110 01111 00000 100111

000000 10001 01101 01000 00000 000010

000000 10001 01010 01000 00000 000000

000000 01110 00000 01000 00000 000011

000000 01101 00000 01000 00000 000100

02328020 012a4022 02959824 02d78025 018d5826 01ae782a 01ae7827 022d4002 022a4000 01c04003 01a04004

I型指令 指令序号 <7> <8> <10>

指令

译码结果(B)

存储指令(H) 8d300001 ad290001 21280001

lw $s0,1($t1) 100011 01001 10000 00000000

00000001 sw $t1,1($t1) 101011 01001 01001 00000000

00000001 addi

$t0,$t1,1

001000 01001 01000 00000000 00000001

<11>

beq $t1,$t1,1 000100 01001 01001 00000000

00000001

11290001

J型指令 指令序号 <15> 指令

译码结果(B)

000010 0000000000000000000 0010001 存储指令(H) 08000011 J 17

2.MIPS 32位单周期处理器结构设计 CPU设计结构图如下:

信号说明:

a1:pc中的指令的地址送往IM去寻找指令 a2:pc产生的下一条指令的地址 a3:pc中指令的地址加4

a4:取pc中指令的地址加4后的高六位 b1:取J型指令的低26位 b2:操作码字段高六位

b3:第一个源操作数的寄存器地址,R型的21-25位,I型的21-25位

b4:第二个源操作数的寄存器地址,R型的16-20位,I型指令的目的寄存器地址,16-20位

b5:R型指令的目的寄存器地址,11-15位 b6:I型指令的立即数,0-15位 b7:R型指令的低六位,0-5位 b8:b4和b5经二路选择器二选一 b20:从IM中取出来的指令内容 c1:I型指令将16位立即数扩展成32位 c2:存入目的寄存器的内容 c3:从源寄存器1中取出的内容 c4:从源寄存器2中取出的内容 c5:c1和c4二选一

c6:ALU计算出的结果,也是读DM的地址 c7:从DM中取出的内容

c8、c9:针对不同类型的指令对进行pc值的修正的选择 d1:功能选择信号

e类信号:主操作控制信号,主要是各部件的读写控制信号

核心模块说明:

IM:按序号存放指令(共17条,其中lw指令执行了两次),在CPU启动时从<0>开始执行。

Rf:主寄存器,存放32个32位字,存储情况见下表(十进制表示,单数行是地址序号,双数行是对应的存储值):

<0> 0 <8> 7 <16>

<1> 14 <9> 6 <17>

<2> 13 <10> 5 <18>

<3> 12 <11> 4 <19>

<4> 11 <12> 3 <20>

<5> 10 <13> 2 <21>

<6> 9 <14> 1 <22>

<7> 8 <15> 0 <23>

15 <24> 7 14 <25> 6 13 <26> 5 12 <27> 4 11 <28> 3 10 <29> 2 9 <30> 1 8 <31> 0 DM:数据存储器,存储情况见下表(十进制表示,单数行是地址序号,双数行是对应的存储值):

<0> 8 <8> 8 <16> 8 <24> 8

tRf:测试模块,用于输出指令执行结果以检验是否正确; IRf:测试模块,用于输出当前执行的指令,与tRf搭配使用。

<1> 7 <9> 7 <17> 7 <25> 7 <2> 6 <10> 6 <18> 6 <26> 6 <3> 5 <11> 5 <19> 5 <27> 5 <4> 4 <12> 4 <20> 4 <28> 4 <5> 3 <13> 3 <21> 3 <29> 3 <6> 2 <14> 2 <22> 2 <30> 2 <7> 1 <15> 1 <23> 1 <31> 1 四.代码分析

1. Add //完成分支指令的目标地址计算// library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity add is

Port ( a: in STD_LOGIC_VECTOR (31 downto 0);

b : in STD_LOGIC_VECTOR (31 downto 0);

y : out STD_LOGIC_VECTOR (31 downto 0)); end add;

architecture Behavioral of add is begin

y<=a + b;-------将a和b相加赋给y

end Behavioral;

2. Add4 //完成PC+1(采用字寻址)的计算// library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity Add4 is

port(pcin:in std_logic_vector(31 downto 0);

pcout:out std_logic_vector(31 downto 0));

end Add4;

architecture behave of Add4 is begin

process(pcin) begin

pcout <= pcin + 1;---------pc值的修改

end process;

end behave;

3. ALU //主运算器// library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity alu is Port (

a1, b1 : in STD_LOGIC_vector(31 downto 0); alucontr: in STD_LOGIC_VECTOR (3 downto 0); result : buffer STD_LOGIC_VECTOR (31 downto 0); zero : out STD_LOGIC ); end alu;

architecture behave of alu is --signal d1: integer;

--signal c1,f1: bit_vector(31 downto 0); begin

process(a1,b1,alucontr) begin

case alucontr is

when \与操作 when \或操作 when \相加 when \异或 when \或非操作

when \conv_integer(b1)); ------Sll将a1向左移动b1数值位 when \减法 when \自增 when \自减

when \比较大小 if(a1

when \conv_integer(b1)); ------srl算术右移 when others=> result<=x\end case;

if(a1=b1)then --beq 判断分支指令是否转移当a1=b1时进行转移 zero<='1'; else zero<='0'; end if; end process;

end behave;

4. and_gate //与门,完成分支指令的判定// library ieee;

use ieee.std_logic_1164.all; entity and_gate is port(

a,b:in std_logic; c:out std_logic );

end and_gate;

architecture dataflow of and_gate is begin

c <= a and b;

本文来源:https://www.bwwdw.com/article/dfn.html

Top