1、高级计算机体系结构实验实验 2 简单 CPU 设计一实验目的设计实现简单 CPU,熟悉并掌握指令结构,利用 verilog 编写各个子模块。二实验原理1.CPU 设计CPU 概念设计如图 1 所示:图 12.指令集(1)本实验设计一个可以运行 4 条指令的简单 CPU(2)指令格式:opcode(2 bit ) addr(6 bit)(3)具体 4 条指令如表 1:表 1 指令结构Inst Op Addr OperationADD 00 XXXXXX 加 法: AC-AC+MAddrAND 01 XXXXXX 逻辑与: AC-ACMAddrINC 10 XXXXXX 加 1: AC-AC+1J
2、MP 11 XXXXXX 跳 转: PC-Addr3.寄存器组织(1)累加器(AC)a提供 ADD,AND 操作的一个操作数b存放 ADD,AND 操作的结果(2)用户不可见寄存器a地址寄存器( AR):6bit,提供访问存储器单元地址高级计算机体系结构实验b程序计数器(PC):6bit,存放下一条指令在存储器单元中的地址c数据寄存器(DR):8bit,存放从访问存储器单元的内容d指令寄存器(IR ):2bit,存放当前取出的指令的操作码部分4.指令的执行指令的执行过程如图 2:图 2(1)取指FETCH1: AR- PCFETCH2: DR- M,PC- PC 1FECTH3: IR- DR
3、76,AR- DR50(2)执行ADD1: DR- MADD2: AC- AC DRAND1: DR- MAND2: AC- AC DRINC1: AC- AC + 1JMP1: PC- DR50(3)寄存器操作AR: AR-PC; AR-DR50高级计算机体系结构实验PC: PC-PC+1; PC-DR50DR: DR-MIR: IR-DR 76AC: AC-AC+DR; AC-AC DR; AC -AC+15.CPU 数据通路CPU 数据通路设计如图 3 所示:图 3图 3 是已经过简化的数据通路,它反映了 CPU 内部各单元的功能特点:(1)AR 只向存储器提供数据(2)IR 不向其他单
4、元提供数据(3)AC 不向其他单元提供数据(4)AC 需保存 ALU 运算结果(5)8bit BUS6.控制器(1)控制器功能控制器是负责产生 CPU 内的各种信号,控制程序的执行:高级计算机体系结构实验1、取指令(fetch)2、分析指令(decode)3、执行指令(Execute )4、其他功能:控制程序数据的输入输出、异常处理、中断等(2)控制信号控制器中有 9 条信号线,分别是:PCLOAD :允许 PC 置值PCINC :允许 PC 自加 1DRLOAD :允许 DR 置值ACLOAD :允许 AC 置值ACINC :允许 AC 自加 1IRLOAD :允许 IR 置值MEMBUS
5、:控制存储器是否输出PCBUS :控制 PC 是否输出READ :读存储器(3)信号生成逻辑1.控制信号的线性表达:PCLOAD = JMP1PCINC = FETCH2DRLOAD = FETCH1 v ADD1 v AND1ACLOAD = ADD2 v AND2ACINC = INC1IRLOAD = FETCH3MEMBUS = FETCH2 v ADD1 v AND1PCBUS = FETCH1READ = FETCH2 v ADD1 v AND12.控制信号的生成逻辑,如图 4:高级计算机体系结构实验图 4三实验环境软件:QuartusII 6,ModelSim硬件平台:GW48-
6、SOPC/DSP EP1C6Q240四实验步骤1.各个子模块的 Verilog 实现(1)ALU 模块module alu(op,a,b,c);高级计算机体系结构实验input op;input 7:0 a,b;output 7:0 c;assign c = (op=0)?(a+b):(a endmodule(2)IR 模块module ir(clk,load,din,dout);input clk,load;input 1:0 din;output 1:0 dout;reg 1:0 dout;always (posedge clk)beginif(load)dout = din;endend
7、module(3)DR 模块module dr(clk,load,din,dout);input clk,load;input 7:0 din;output 7:0 dout;reg 7:0 dout;always (posedge clk)beginif(load)dout = din;endendmodule(4)PC 模块module pc(clk,rst,load,inc,din,dout);input clk,rst,load,inc;input 5:0 din;output 5:0 dout;reg 5:0 dout;always (posedge clk)beginif(rst)
8、dout = 0;else if(inc)dout = dout + 1;高级计算机体系结构实验else if(load)dout = din;endendmodule(5)AR 模块module ar(clk,load,din,dout);input clk,load;input 5:0 din;output 5:0 dout;reg 5:0 dout;always (posedge clk)beginif(load)dout = din;endendmodule(6)AC 模块module ac(clk,rst,load,inc,din,dout);input clk,rst,load,i
9、nc;input 7:0 din;output 7:0 dout;reg 7:0 dout;always (posedge clk)beginif(rst)dout = 0;else if(inc)dout = dout + 1;else if(load)dout = din;endendmodule(7)Control 模块module control(clk,rst,ir,read,membus,arload,pcload,pcinc,pcbus,drload,drbus,alusel,acload,acinc,irload高级计算机体系结构实验);parameter FETCH1 = 0
10、;parameter FETCH2 = 1;parameter FETCH3 = 2;parameter ADD1 = 3;parameter ADD2 = 4;parameter AND1 = 5;parameter AND2 = 6;parameter INC1 = 7;parameter JMP1 = 8;input clk,rst;input 1:0 ir;output read,membus,arload,pcload,pcinc,pcbus,drload,drbus,alusel,acload,acinc,irload;reg 3:0 state,nextstate;always
11、(posedge clk)beginif(rst)state = FETCH1;elsestate = nextstate;end always (state or ir)begincase(state)FETCH1:nextstate = FETCH2;FETCH2:nextstate = FETCH3;FETCH3:beginif(ir=0)nextstate = ADD1;else if(ir = 1)nextstate = AND1;else if(ir = 2)nextstate = INC1;elsenextstate = JMP1;endADD1:nextstate = ADD2
12、;高级计算机体系结构实验ADD2:nextstate = FETCH1;AND1:nextstate = AND2;AND2:nextstate = FETCH1;JMP1:nextstate = FETCH1;INC1:nextstate = FETCH1;default:nextstate = FETCH1;endcaseendassign arload = (state = FETCH1 | state= FETCH3)?1:0;assign pcload = (state = JMP1)?1:0;assign pcinc = (state = FETCH2)?1:0;assign dr
13、load = (state = FETCH2 | state= ADD1 | state= AND1)?1:0;assign acload = (state = ADD2 | state= AND2)?1:0;assign acinc = (state = INC1 )?1:0; assign irload = (state = FETCH3)?1:0;assign alusel = (state = AND2)?1:0;assign membus = (state = FETCH2 | state= ADD1 | state= AND1)?1:0; assign pcbus = (state
14、 = FETCH1)?1:0; assign drbus = (state = FETCH3 | state= ADD2 | state= AND2 | state = JMP1)?1:0; assign read = (state = FETCH2 | state = ADD1 | state = AND1)?1:0;endmodule(8)三态门(6 bit)模块module tri6(en,din,dout);input en;input 5:0 din;output 5:0 dout;assign dout = (en)?din:6bzzz_zzz;endmodule(9)三态门(8
15、bit)模块module tri8(en,din,dout);input en;input 7:0 din;output 7:0 dout;assign dout = (en)?din:8bzzzz_zzzz;endmodule2.CPU 模块的 Verilog 实现module cpu(clk,rst,data,read,addr,acout);高级计算机体系结构实验input clk,rst;input 7:0 data;output read;output 5:0 addr;output 7:0 acout;wire 7:0 bus;wire 5:0 pcout;wire 7:0 dro
16、ut,acout,aluout;wire 1:0 irout;wire alusel,acload,acinc;tri8 t0(membus,data,bus7:0);ar ar1(clk,arload,bus5:0,addr);pc pc1(clk,rst,pcload,pcinc,bus5:0,pcout);tri6 t1(pcbus,pcout,bus5:0);dr dr1(clk,drload,bus7:0,drout);tri8 t2(drbus,drout,bus7:0);alu alu1(alusel,acout,bus7:0,aluout);ac ac1(clk,rst,acl
17、oad,acinc,aluout,acout);ir ir1(clk,irload,bus7:6,irout);control c1(clk,rst,bus7:6,read,membus,arload,pcload,pcinc,pcbus,drload,drbus,alusel,acload,acinc,irload);endmodule3.Inst Mem 模块的实现(用 Altera 的宏)4.Data Mem 模块的实现(用 Altera 的宏)5.顶层模块(系统:CPU+指令 Mem+数据 Mem)用Schematic 实现高级计算机体系结构实验6.引脚配置(要求引出。 。 。 。 )
18、及测试数据Clk 信号,复位信号7.测试在 quartus 中,将 cpu.v 文件设置为顶层文件。然后生成 cpu 和 memery 器件,建立一个 block 模板,在里面讲 cpu 和 memery 连接好,并配上相应的输入输出信号。接着,编译工程。然后建立一个 wave 文件,进行模拟仿真。最后连接实验箱,进行仿真。一 思考题1、单周期 CPU 的控制器设计与实验 1 中控制器设计有何异同。实验 3 单周期 MIPS 处理器设计一、实验目的设计实现是指令简单,容易译码的单周期 MIPS 处理器,设计实现单周期的 MIPS 处理器,熟悉并掌握指令结构,利用 verilog 编写各个子模块
19、。二、实验原理1、MIPS 的简单介绍MIPS 是世界上很流行的一种 RISC 处理器。MIPS 的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。MIPS 技术公司是美国著名的芯片设计公司,它采用精简指令系统计算结构(RISC)来设计芯片。和英特尔采用的复杂指令系统计算结构(CISC)相比,。RISC 具有设计更简单、设计周期更短等优点,并可以应用更多先进的技术,开发更快的下一代处理器。MIPS 是出现最早的商业 RISC 架构芯片之一,新的架构集成了所
20、有原来MIPS 指令集,并增加了许多更强大的功能。2、单周期 MIPS 设计单周期 MIPS 处理器的概念设计如图 1 所示:高级计算机体系结构实验图 1 单周期 MIPS 处理器的结构3、 指令集本实验共有 9 条指令,每一条 MIPS 指令是一个 32 位的。MIPS 指令集中共包括三种格式的指令,分别是立即数(immediate)类型(I 类型) 指令,跳转( jump)类型(J 类型)指令和寄存器(register)类型(R 类型) 指令。指令集的这种设计方法简化了指令译码,一些复杂的很多使用的操作和寻址方式可以通过编译器利用一组简单指令来合成。MIPS 的指令格式如下所示:(1)R
21、类型指令31 26 25 21 20 16 15 11 10 6 5 0 op rs rt rd shamt func6-bit 5-bit 5-bit 5-bit 5-bit 6-bit (2)I 类型指令31 26 25 21 20 16 15 0 op rs rt immediate6-bit 5-bit 5-bit 16-bit (3)J 类型指令31 26 25 0 op Target address6-bit 26-bit 指令格式中的op(opcode) 是指令操作码。rs(register source)是源操作数的寄存器号。rd(register destination)是目
22、的寄存器号。rt(register target)既可为源寄存器号,又可为目的寄高级计算机体系结构实验存器号,由具体的指令决定。func(function)被认为是操作码。shamt(shift amount)由移位指令使用,定义移位位数。immediate是16位立即数,使用之前由指令进行 O扩展或符号扩展。26位Target address由jump指令使用,用于产生跳转的目标地址。R(register)类型的指令从寄存器堆中读取两个源操作数,计算结果写回寄存器堆。I(immediate)类型的指令使用一个 16位的立即数作为一个源操作数。J(jump)类型的指令使用一个26位立即数作为跳
23、转的目标地址(target address)。MIPS指令集具有以下特点。简单的LOADSTORE结构。IPS指令集的指令格式非常规整,所有的指令均为32位,而且指令操作码在固定的位置上。易于编译器的开发。一般地讲,编译器在编译高级语言程序时,很难用到复杂的指令。MIPS指令的寻址方式非常简单,每条指令的操作也非常简单。MIPS 具体的指令结构:表 1 指令结构Instruction bit number3126 2521 2016 1511 106 50add 000000 rs rt rd 00000 100000sub 000000 rs rt rd 00000 100010and 00
24、0000 rs rt rd 00000 100100or 000000 rs rt rd 00000 100101slt 000000 rs rt rd 00000 101010lw 100011 rs rt immediatesw 101011 rs rt immediatebeq 000100 rs rt immediatej 000010 Address4、单周期 MIPS 处理器结构每条指令 1 个时钟周期内完成。高级计算机体系结构实验三、实验环境软件:QuartusII 6,ModelSim硬件平台:GW48-SOPC/DSP EP1C6Q240四、实验步骤1. 各个子模块的设计和
25、Verilog 实现(1) PC 寄存器PC(program counter)是专用寄存器,CPU 使用它从存储器中取指令。每执行一条指令PC 加 4。Clk 为时钟信号,rst 为复位信号。PC 寄存器的部分程序:always (posedge clk)beginif(rst) /当有复位信号时,输出为 0;dout =32h00000000;elsedout = din;end(2) 二选一的数据选择器二选一的数据选择器电路框图如图二所示:输入端是 a、b,输出端为 c,sel 为控制端。当 sel 为0 时,输出端 c 输出 a 信号,当 sel 为 1 时,输出端c 输出 b 信号,w
26、 为数据宽度参数。程序为:module mux1(a,b,sel,c);parameter w = 32;高级计算机体系结构实验input w-1:0 a,b;input sel; output w-1:0 c;assign c = (sel = 0)?a:b;endmodule(3) 符号扩展和移位本实验中的符号扩展是在数据使用之前进行 0 扩展或符号扩展,是把 16 位的数据扩展成 32 的数据。din 为 16 位输入数据,dout 为 32 为输出数据,程序如下:module signextend(din,dout);input 15:0 din;output 31:0 dout;as
27、sign dout15:0 = din;assign dout31:16 = 16h0000;endmodule(4) 寄存器 RegFile 模块根据输入的寄存器地址读写寄存器,n1 为源操作数 1 的寄存器地址, n2 为源操作数 2 的寄存器地址,we 为写寄存器信号,nd 写寄存器的地址,di 写寄存器的数据,q1 为源操作数 1 的数据,q2 为源操作数 2 的数据。当 we 为 0 时,q1 输出以源操作数 1 为地址的数据,q2 输出以源操作数 2 为地址的数据,当 we 为 1 时,把 di 输入的数据写到以 nd为地址的寄存器中。部分程序如下:reg 31:0 r31:0;
28、/定义寄存器;assign q1 = (n1=0)?0:rn1;assign q2 = (n2=0)?0:rn2;always (posedge clk)beginif(we)rnd = di; endendmodule(5) ALU 模块算术逻辑单元(ALU :aritl-irnetic logic unit)的设计是CPU设计中重要的一个环节。可以这样说,微处理器中最重要的地方是ALU,它是CPU 真正处理数据的地方。ALU使用的数据来自寄存器(Register),它读取寄存器中的数据并进行一些计算(如对两个数据相加、对两个数据进行逻辑或运算等等),然后把计算结果返回到寄存器中,最后再把寄
29、存器中的结果返回到主内存中。根据控制信号aluc确定执行功能如图三所示:assign zero = (c=0)?1:0; always (a,b,aluc)begincase(aluc)ADD: c = a + b;SUB: c = a - b;AND: c = a 高级计算机体系结构实验OR: c = a | b;SLT: c = (ab)?1:0;default: c = 0;endcaseend(6) Inst Mem 模块和 Data Mem 模块的实现Inst Mem 是 32 位的指令寄存器,存放着指令数据。Data Mem 是数据寄存器,当 we 信号为 1 时,写寄存器。部分程
30、序如下:reg 31:0 ram31:0;always (negedge clk )beginif (we)beginramaddr = wd;enddata = ramaddr;end(7) Control 控制器模块由指令操作码 op 和功能码 func 确定指令的具体功能如下表所示:控制器中有 8 条信号线,分别是:jump,memtoreg,branch,whitemem,aluc2:0,alusrcb,writereg,regdes,分别控制不同的器件。如下表所示:高级计算机体系结构实验控制器的部分程序为:assign madd = (op5:0= 6b000000 assign m
31、sub = (op5:0 = 6b000000 assign mand = (op5:0 = 6b000000 assign mor = (op5:0 = 6b000000 assign mslt = (op5:0 = 6b000000 assign mlw = (op5:0 = 6b100011 )?1:0;assign msw = (op5:0 = 6b101011 )?1:0;assign mbeq = (op5:0 = 6b000100 )?1:0;assign mj = (op5:0 = 6b000010 )?1:0;assign alusrcb = (mlw | msw)?1:0;
32、assign writereg = (mand | mor | madd | mslt | mlw |msub)?1:0;assign aluc2 = (msub | mslt | mbeq)?1:0;assign aluc1 = (msw | msub | madd | mslt | mlw | mbeq)?1:0;assign aluc0 = (mor | mslt)?1:0;assign branch = (mbeq assign jump = (mj)?1:0;assign memtoreg = (mlw)?1:0;assign regdes = (mlw)?1:0;assign wr
33、itemem = (msw)?1:0;(8)2. 编译和仿真(1)对源程序进行语法检查和编译。对程序进行分析综合,检查语法规范;如果没有问题则编译整个程序,使用 。如果出现问题,则对源程序进行修改,直至没有问题为止。(2)波形仿真。Quartus II 内置波形编辑程序(Waveform Editor)可以生成和编辑波形设计文件,从而设计者可观察和分析模拟结果。Quartus II 中的仿真包括功高级计算机体系结构实验能仿真和时序仿真,功能仿真检查逻辑功能是否正确,不含器件内的实际延时分析;时序仿真检查实际电路能否达到设计指标,含器件内的实际延时分析。两种仿真操作类似,只需在 Processi
34、ng 菜单中选择 Simulater Tool,在其Simulater mode 中进行选择即可。现以时序仿真为例,介绍仿真的具体操作过程: 新建一个波形文件,只是在弹出页式对话框后选择 Other Files 页面的 Vector Waveform File。 在波形文件中加入所需观察波形的管脚:在 Name 中单击右键,选择 Insert Node or bus.选项,出现 Insert Node or bus 对话框,此时可在该对话框的 Name 栏直接键入所需仿真的管脚名,也可点击 Node Finder.按钮,将所有需仿真的管脚一起导入。在 Pins下拉列表框中选择合适的选项,点击
35、List 按钮,将所需仿真的管脚移至 Select Noder 框中。点击 OK 进入波形。 给输入管脚指定仿真波形 :分别选中输入管脚,使用波形编辑器对其输入波形进行编辑。最后保存波形文件。 点击按钮,进行波形仿真。3. 引脚配置及测试数据选择 Assignment 菜单的 pins 选项,进入管脚分配界面。在管脚分配之前确定类别栏按钮,管脚过滤栏和分色显示按钮都处于有效状态,按下类别栏的 Pin 按钮。管脚分配也与实际电路密切相关,在管脚分配栏中,将程序中的输入输出脚分配到管脚上,并保存。并进行整体编译文件。4、 下载。实验电路板接电源,确保其供电正常;连接下载电缆;点击进入下载界面,进行下载。击 Start 按钮开始下载。五、思考题