多周期CPU设计(verilog)

您所在的位置:网站首页 cup世界时钟 多周期CPU设计(verilog)

多周期CPU设计(verilog)

2023-08-12 09:45| 来源: 网络整理| 查看: 265

文章目录 一、设计思路**1.主要参照:****2.多周期处理器**:**3.指令周期:****4.MIPS指令:** 二、主要模块设计**1.总体模块构成****2. MultiCycleCPU.v****3. PCctr.v**3. ControlUnit.v**控制信号的生成**状态转换输入、输出端口声明: **3. 其他模块** 四、模块间主要信号传递五、功能仿真**1. 仿真文件****2. 存储的指令****3. 测试** 六、模块代码1. MultiCycleCPU2. PCctr3. PC_in_out4. InstructionMem5. ControlUnit6. RegisterFile7. Extender8. ALUSrc_select9. ALU3210. DataMem11. Data_select

一、设计思路 1.主要参照:

计算机组成与系统结构(第2版)(袁春风)中央处理器及所学知识

2.多周期处理器:

把每条指令的执行分成多个大致相等的阶段,每个阶段在一个时钟周期内完成;各阶段内最多完成一次访存或一次寄存器读写或一次ALU操作;各阶段的执行结果在下一次时钟到来时保存到相应存储单元或稳定的保持在组合电路中;时钟周期的宽度以最复杂阶段所用时间为准,通常取一次存储器读写的时间。

3.指令周期: 取指令(IF):根据程序计数器PC中的指令地址,从存储器中取出一条指令。同时,PC根据指令子长度自动递增产生下一条指令所需要的指令地址,但遇到地址转移指令时,则控制器把转移地址送入PC,得到的地址做些变换送入PC。指令译码(ID):对取指令操作中得到的指令进行分析和译码,确定这条指令需要完成的操作,从而产生相应的操作控制信号,用于驱动执行状态中的各种操作。指令执行(EXE):跟据指令译码得到的操作控制信号,具体的执行指令动作,然后转移到结果写回状态。存储器访问(MEM):所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出存储器的数据地址,把数据写入到存储器中数据地址所指定的存储单元或者从存储器中得到数据地址单元中的数据。结果写回(WB):指令执行的结果或者访问存储器中得到的数据写回相应的目的寄存器中。

在这里插入图片描述

4.MIPS指令:

MIPS指令可以分为三种类型,每种类型的指令需要不同的时钟周期数。

寄存器型(R型)指令

oprsrtrdshamtfunct6位5位5位5位5位6位

立即数型(I型)指令

oprsrtimmediate6位5位5位16位

跳转型(J型)指令

opaddr6位26位

op:操作码

rs:第1个源操作数寄存器

rt:第2个源操作数寄存器,或目的操作数寄存器

rd:目的操作数寄存器

shamt:位移量,移位指令用于指定移多少位

func:功能码,在R类型指令中用来指定指令的功能

immediate:16位立即数

addr:地址

二、主要模块设计 1.总体模块构成

在这里插入图片描述

2. MultiCycleCPU.v

MultiCycleCPU作为顶层模块,只有一个CLK(时钟信号)作为输入,时钟周期在仿真模块中设置。

MultiCycleCPU通过调用每个模块,并控制信号在相应模块间的传递来实现多周期CPU的功能。

在这里插入图片描述

3. PCctr.v

PCctr计算下一条指令的地址,并对pc在刚开始进行置0初始化。

对于pc的改变有三种形式,beq指令,jump指令,其他。

要实现pc地址的正确计算,需要在取一条指令后,进行+4指向下一条指令,但是对于jump指令并不需要进行+4的操作。所以增加PCWre信号,当不为jump指令时设置位1。当PCWre为1时进行pc+4,对于jump指令则不进行这个操作。对于beq指令,则在译码产生Branch信号后在已经+4的pc基础上在加上扩展后的立即数即可。

PCctr模块设计如下,左侧是输入信号,右侧是输出信号。

端口名称说明pc_in输入pc值PCWrepc写使能imm取自指令后26位,对于beq则在此基础上截取后16位Zero控制信号,用于beq指令Branch控制信号,用于beq指令Jump控制信号,用于jump指令pc_out输出pc值

在这里插入图片描述

3. ControlUnit.v

ControlUnit模块主要根据当前指令的op和func生成对应的控制信号,同时根据当前状态和操作码确定下一状态。

控制信号的生成

在这里插入图片描述

参照书上的11条MIPS指令,加上addu指令,共兼容12条MIPS指令。

funcopALUctraddu000000100001000 ALUctr(ALU控制信号)编码方案:

addiu、lw、sw、addu的ALU控制信号取值一样,都是进行加法运算并不判溢出,记为addu操作。

subu和beq判0操作的ALU控制信号可看成一样,都做减法运算并不判溢出,记为subu操作。

ALU操作类型funcALUctraddu100001000add100000001or010subu100011100sub100010101sltu101011110slt101010111

对于R-type型指令,除了ALUctr信号以外,其余控制信号的取值都相等

R—型指令的ALUctr信号的取值由其func字段决定

由上面func与ALUctr的对应关系,可得:

ALUctr[2]=!func[2] & func[1] ALUctr[1]=func[3] & func[2] & func[1] ALUctr[0]=!func[3] & !func[2] & !func[1] & !func[0] + !func[2] + func[1] + !func[0]

I—型指令,J—型指令的ALUctr控制信号的取值由op字段决定,可得编码方案:

ALUctr[2]=beq= !op[5] & !op[4] & !op[3] & op[2] & !op[1] & !op[0] ALUctr[1]=ori= !op[5] & !op[4] & op[3] & op[2] & !op[1] & op[0] ALUctr[0]=R-type= !op[5] & !op[4] & !op[3] & !op[2] & !op[1] & !op[0]

对于其他控制信号,采用编码方案有些复杂,采用判断的形式来生成它们的信号。

状态转换

有限状态机控制器思想:

用一个有限状态机描述指令执行过程,由当前状态和操作码确定下一状态,每来一个时钟发生一次状态改变,不同状态输出不同的控制信号值,然后送到数据通路来控制指令的执行。

在设计时采用与书上的有限状态机控制器思想有些不同的思路,不采用不同状态输出不同控制信号。控制信号在ID(指令译码)阶段同时生成,增加输出信号IF_clk、ID_clk、ALU_clk、MEM_clk、WB_clk区分指令的不同阶段,根据不同的状态来修改这些信号的值。通过这些信号来触发指令的不同执行阶段。

在多周期CPU中,不同的指令分别占用不同的周期数。查阅资料,不同的指令参照如下的状态转移图:

在这里插入图片描述

最后,ControlUnit模块设计如下(具体实现代码太多,只选取端口声明部分):

module ControlUnit( clk,Opcode,func, Branch,Jump,RegDst,ALUSrc,ALUctr,MemorReg,RegWr,MemWr,ExtOp,PCWre, IF_clk,ID_clk,ALU_clk,MEM_clk,WB_clk, state_out ); input clk; input [5:0] Opcode; input [5:0] func; output reg Branch; output reg Jump; output reg RegDst; output reg ALUSrc; output reg [2:0] ALUctr; output reg MemorReg; output reg RegWr; output reg MemWr; output reg ExtOp; output reg PCWre; output reg [2:0] state_out; output reg IF_clk; output reg ID_clk; output reg ALU_clk; output reg MEM_clk; output reg WB_clk; 输入、输出端口声明: 端口名称说明clk时钟周期Opcode操作码func功能码,在R类型指令中用来指定指令的功能BranchbeqJumpjumpRegDst选择写回结果的寄存器编号ALUSrcALU输入来源ALUctrALU操作码MemorReg数据来自存储器还是ALU结果RegWrRegisterFile写使能MemWr存储器写使能ExtOp扩展方式PCWre修改pc值state_out状态输出IF_clk取指信号ID_clk指令译码信号ALU_clk指令执行信号MEM_clk存储器访问信号WB_clk结果写回信号 3. 其他模块

ALU32.v总体与第一次课程设计相同,根据此次多周期CPU进行适当修改。

其他模块的实现也比较简单,前面总体模块构成已大概介绍。比较难实现的是考虑各种信号在不同模块间的传递,以及将模块组合后可以协调工作顺利实现多周期CPU的功能。

四、模块间主要信号传递

这里只标识了主要信号的传递,别的信号大致采用同名表示同一信号传递。

除MultiCycleCPU外,主要模块大致都是左侧是输入信号,右侧是输出信号。

在这里插入图片描述

五、功能仿真 1. 仿真文件

每1ps个时间单位时钟信号反转一次,即时钟周期为2ps

module MultiCycleCPU_test( ); // module MultiCycleCPU( // CLK, // Opcode,ALU_in1,ALU_in2,ALU_result,STATE_out,PC_out, // IF_clk,ID_clk,ALU_clk,MEM_clk,WB_clk // ); reg CLK; wire IF_clk,ID_clk,ALU_clk,MEM_clk,WB_clk; wire [5:0] Opcode; wire [31:0] ALU_in1; wire [31:0] ALU_in2; wire [31:0] ALU_result; wire [31:0] PC_out; MultiCycleCPU cpu32( .CLK(CLK), .Opcode(Opcode), .ALU_in1(ALU_in1), .ALU_in2(ALU_in2), .ALU_result(ALU_result), .PC_out(PC_out), .IF_clk(IF_clk), .ID_clk(ID_clk), .ALU_clk(ALU_clk), .MEM_clk(MEM_clk), .WB_clk(WB_clk) ); initial begin CLK=0; end always #0.001 CLK=~CLK; endmodule 2. 存储的指令 memory[0]=32'b000000_00111_00010_00010_00000_100000;//add reg[2]=reg[7]+reg[2] memory[1]=32'b000000_00010_00111_00100_00000_100011;//subu reg[4]=reg[2]-reg[7] memory[2]=32'b000000_00000_00001_00010_00000_101011;//sltu reg[0]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3