5. 接着我们按照实验一的步骤进行综合与实现以及管脚的约束。其中时钟信号clk和重置信号rst与实验一绑定管脚相同。管脚绑定之后按照实验一的步骤进行比特流的生成并将比特流文件下载到开发板上,观察结果。
实验三 控制器实验
控制器是计算机的核心部件,计算机的所有硬件都是在控制器的控制下,
完成程序规定的操作。控制器的基本功能就是把机器指令转换为按照一定时序控制机器各部件的工作信号,使各部件产生一系列动作,完成指令所规定的任务。
3.1 实验目的
(1)掌握单周期CPU控制器的工作原理及其设计方法。 (2)掌握各个控制信号的作用和生成过程。
3.2 实验设备
PC机一台,Digilent Nexys 4TM开发板,Xilinx Vivado开发套件。
3.3实验原理
控制器的基本任务是完成当前指令的翻译和执行,即将当前指令的功能
转换成可以控制的硬件逻辑部件工作的命令序列,完成数据传送和各种处理操作。本实验根据MIPS的31种类型的指令以及根据该指令结构所设计出的数据通路模拟其中控制单元生成控制信号的过程。其中MIPS的31条指令类型如表3.1所示:
表3.1 MIPS的31种指令 助记符 BIT # 31..26 R-类型 add addu sub op 000000 000000 000000 指 令 格 式 25..21 rs rs rs rs 20..16 rt rt rt rt 15..11 rd rd rd rd 10..6 shamt 5..0 func 示 例 示例含义 $1=$2+S3 $1=$2-S3 操作及解释 (rd)←(rs)+(rt); rs=$2,rt=$3,rd=$1 (rd)←(rs)+(rt); rs=$2,rt=$3,rd=$1,无符号数 (rd)←(rs)-(rt); rs=$2,rt=$3,rd=$1 00000 100000 add $1,$2,$3 00000 100010 sub $1,$2,$3 00000 100001 addu $1,$2,$3 $1=$2+S3 subu and or xor nor slt sltu sll srl sra sllv srlv srav jr I-类型 addi andi ori xori lui lw sw beq bne slti sltiu J-类型 j jal 000000 000000 000000 000000 000000 000000 000000 rs rs rs rs rs rs rs rt rt rt rt rt rt rt rt rt rt rt rt rt 00000 rt rt rt rt rt rt rt rt rt rt rt rt rt rd rd rd rd rd rd rd rd rd rd rd rd rd 00000 00000 100011 subu $1,$2,$3 $1=$2-S3 00000 100100 and $1,$2,$3 00000 100101 or $1,$2,$3 00000 100110 xor $1,$2,$3 00000 100111 nor $1,$2,$3 00000 101010 slt $1,$2,$3 00000 101011 sltu $1,$2,$3 shamt 000000 sll $1,$2,10 shamt 000010 srl $1,$2,10 shamt 000011 sra $1,$2,10 00000 000100 sllv $1,$2,$3 00000 000110 srlv $1,$2,$3 $1=$2&S3 $1=$2|S3 $1=$2^S3 (rd)←(rs)-(rt); rs=$2,rt=$3,rd=$1,无符号数 (rd)←(rs)&(rt); rs=$2,rt=$3,rd=$1 (rd)←(rs) | (rt); rs=$2,rt=$3,rd=$1 (rd)←(rs)^(rt); rs=$2,rt=$3,rd=$1 $1= ~($2 | S3) (rd)←~((rs) | (rt)); rs=$2,rt=$3,rd=$1 if($2<$3) $1=1 else if (rs< rt) rd=1 else rd=0;rs=$2,rt=$3, rd=$1 $1=0 if($2<$3) if (rs< rt) rd=1 else rd=0;rs=$2,rt=$3, rd=$1, $1=1 else 无符号数 $1=0 $1=$2<<10 $1=$2>>10 $1=$2>>10 $1=$2<<$3 $1=$2>>$3 (rd)←(rt)<
图3.1单周期CPU数据通路
本次实验是主要模拟指令生成控制信号的过程,由于控制单元生成的控制信号较多,本次实验只取其中的一部分信号组成16位控制信号以供输出,这十六位控制信号的作用如表3.2所示:
表3.2控制信号具体表示 信号名称 所在位置 含义 ALUSrc 0 需要进行立即数的32位扩展作为第二操作数 Sftmd 7 是R-类型的移位指令 RegWrite 1 需要写寄存器的指令 ALUOp 2-3 是R-类型或需要立即数作32位扩展的指令1位为1, beq、bne指令则0位为1 Jmp 9 是j指令 I_format 4 是I-类型指令 Branch 5 是beq指令 nBranch 6 是bne指令 信号名称 所在位置 含义 Jal 8 是jal指令 Sftm 10-12 移位指令所对应的具体移位控制信号 ALU_ctl 13-15 R-类型运算指令对应具体的运算,+、-、|、&等命令 本次实验根据输入指令从寄存器堆中选取相应的寄存器,然后读取该寄存器获得相应32位指令,取其高5位和低5位送入控制器单元,由控制单元进行译码,输出相应的控制信号。该控制器组成原理图如下图所示:
ALUSrcled[0]RegWriteLed[1]ALUOpLed[3:2]Led[4]Opcode[5:0]I_formatBranchsw[3:0][31:26]Led[5]寄存器堆ins[31:0][5:0]控制器led[15:0]nBranchLed[6]SftmdLed[7]Function_opcode[5:0]JalLed[8]JmpLed[9]SftmLed[12:10]ALU_ctlLed[15:13]
图3.2 控制器组成原理图
该控制器的寄存器堆中有16个寄存器,每一个寄存器都预先分配了一条指令信息,根据4位输入读取寄存器堆中相应的一个寄存器。控制器主要实现对输入的10位指令操作码的解析,生成16位控制信号,然后以led灯显示每条指令对应的控制信号。
3.4实验步骤
1.编写寄存器堆模块。该模块有4位输入和32位输出,首先将16种类型的16条指令写入寄存器堆的寄存器中,然后根据4位输入选择相应的寄存器,将寄存器中数据写入到输出变量中。开关输入数据、寄存器编号与指令的对应规则如下表所示:
表3.3寄存器堆模块约束
开关输入 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 寄存器编号 0 1 2 3 4 5 6 7 8 9 10 寄存器数据 00000000001000100001100000100000 00000000001000100001100000100001 00000000001000100001100000101010 00000000001000100001100000101011 00000000001000000000000000001000 00100000001000100001100000101010 00100100001000100001100000101010 00111100000000100001100000101010 10001100001000100001100000101010 10101100001000100001100000101010 00010000001000100001100000101010 含义 R-类型add R-类型addu R-类型slt R-类型sltu R-类型jr I-类型addi I-类型addiu I-类型lui I-类型lw I-类型sw I-类型beq 1011 1100 1101 1110 1111 11 12 13 14 15 00010100001000100001100000101010 00101000001000100001100000101010 00101100001000100001100000101010 00001000001000100001100000101010 00001100001000100001100000101010 I-类型bne I-类型slti I-类型addi J-类型j J-类型jal
2.将已经提供的控制器模块文件封装成IP核。
3.编写主模块,主模块有4位输入和16位输出,主模块首先调用寄存器堆模
块生成32位指令信号,然后调用控制器模块生成相应的控制信号,将这16位控制信号赋值到输出变量中。
4.依次按照图3.3的步骤综合项目源文件、实施活动的设计合成的网表。综合的目的是检查代码是否存在语法错误,生成网表后可以绑定相应的管脚。
图3.3
5.绑定输入输出变量对应的开发板的引脚,将输入变量对应的端口绑定到开关的低4位,将输出变量的对应端口绑定到LED灯对应的十六位,如原理图所示,并保存生成的约束文件。然后按照图3.3的第3步骤生成编码文件。
6.连接开发板,并打开开发板开关,将程序下载到开发板上,观察输入不同类型的指令对应的LED灯的明暗情况。