790 likes | 1.09k Views
计算机系统综合课程设计. 基于 MIPS32 的 SOC 设计实践 ( 上 ) (Verilog+Quartus Ⅱ+Cyclone 版 ) 主讲 杨全胜 东南大学计算机科学与工程学院. 主要内容. MiniSys 指令系统介绍 MiniSys CPU 的设计. 第 1 章 MiniSys 指令系统介绍. MiniSys 寄存器组 Minisys 指令的寻址方式 MiniSys 指令目录 MiniSys 指令格式 部分 MiniSys 指令详解. MiniSys 指令系统简介.
E N D
计算机系统综合课程设计 基于MIPS32的SOC设计实践(上) (Verilog+Quartus Ⅱ+Cyclone版) 主讲 杨全胜 东南大学计算机科学与工程学院
主要内容 • MiniSys 指令系统介绍 • MiniSys CPU的设计
第1章 MiniSys指令系统介绍 • MiniSys寄存器组 • Minisys指令的寻址方式 • MiniSys指令目录 • MiniSys指令格式 • 部分MiniSys指令详解
MiniSys指令系统简介 • MiniSys采用32位MIPS指令中最常用的31条指令,其寄存器组织,指令格式等均采用MIPS指令系统相同的格式。 • 共有32个32位寄存器 • 32位定长格式指令 • 4种寻址方式
Minisys指令的寻址方式 • 立即数寻址 • 指令中第3操作数可使用16位二进制立即数 • 相对寻址 • 操作数是下一条指令的PC值(PC+4)加上一个32位偏移量 • 寄存器寻址 • 操作数存放在寄存器中,指令里放的是寄存器号 • 寄存器相对寻址 • 操作数存放在数据存储器中,其有效地址由两部分组成,基地址放在一个寄存器中,偏移部分为一个16位的立即数
MiniSys指令目录 • 算术指令-add, addu, addi, addiu, sub, subu • 逻辑指令-and, andi, or, ori, xor, xori, nor, sll, srl, sra, sllv, srlv, srav • 数据传送指令-lw, sw, lui • 比较、条件转移指令-beq, bne, slt, slti, sltu, sltiu • 无条件转移指令-j, jr, jal
MiniSys指令格式 • (1)R-format add $1, $2, $3# $1=$2+$3 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit 000000 00010 00011 00001 00000 100000
MiniSys指令格式 • (2)I-format lw $1, 10($2) # $1=Memory[$2 +10] 6-bit 5-bit 5-bit 16-bit 100011 00010 00011 0000 0000 0000 1010
MiniSys指令格式 • (3)J-format j 10000 # go to 10000 6-bit 26-bit 000010 00000 00000 0000 1001 1100 0100
部分MiniSys指令详解 • 这里只介绍几个典型的指令格式,比较完整的指令格式请参看教材。
部分MiniSys指令详解 add $s1, $s2, $s3# $s1=$s2+$s3 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit 000000 10010 10011 10001 00000 100000 加法指令( R-format)
部分MiniSys指令详解 sub $s1, $s2, $s3# $s1=$s2-$s3 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit 000000 10010 10011 10001 00000 100010 减法指令(R-format)
部分MiniSys指令详解 and $s1, $s2, $s3# $s1=$s2 & $s3 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit 000000 10010 10011 10001 00000 100100 逻辑与指令(R-format)
部分MiniSys指令详解 or $s1, $s2, $s3# $s1=$s2 | $s3 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit 000000 10010 10011 10001 00000 100101 逻辑或操作(R-format)
部分MiniSys指令详解 addi $s1, $s2, 100 # $s1=$s2 + 100 6-bit 5-bit 5-bit 16-bit 001000 10010 10001 0000 0000 0110 0100 立即数做符号扩展 有符号立即数加(I-format)
部分MiniSys指令详解 andi $s1, $s2, 100 # $s1=$s2 & 100 6-bit 5-bit 5-bit 16-bit 001100 10010 10001 0000 0000 0110 0100 立即数做0扩展 立即数逻辑与指令(I-format)
部分MiniSys指令详解 ori $s1, $s2, 100 # $s1=$s2 | 100 6-bit 5-bit 5-bit 16-bit 001101 10010 10001 0000 0000 0110 0100 立即数做0扩展 立即数逻辑或指令(I-format)
部分MiniSys指令详解 sll $s1, $s2, 10# $s1= shift($s2)left logic 10 bits 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit 000000 00000 10010 10001 01010 000000 逻辑左移指令(R-format)
部分MiniSys指令详解 srl $s1, $s2, 10# $s1= shift($s2)right logic 10 bits 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit 000000 00000 10010 10001 01010 000010 逻辑右移指令(R-format)
部分MiniSys指令详解 sra $s1, $s2, 10# $s1= shift($s2)right arithmatic 10 bits 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit 000000 00000 10010 10001 01010 000011 算术右移指令(R-format)
部分MiniSys指令详解 lw $s1, 100($s2) # $s1=Memory[$s2 +100] 6-bit 5-bit 5-bit 16-bit 100011 10010 10001 0000 0000 0110 0100 立即数做符号扩展 存储器读(I-format)
部分MiniSys指令详解 sw $s1, 100($s2) # Memory[$s2 +100] = $s1 6-bit 5-bit 5-bit 16-bit 101011 10010 10001 0000 0000 0110 0100 立即数做符号扩展 存储器写(I-format)
部分MiniSys指令详解 beq $s1, $s2,100 # if $s1=$s2, goto PC+4+100 6-bit 5-bit 5-bit 16-bit 000100 10001 10010 0000 0000 0001 1001 立即数做符号扩展 相等则转移指令(I-format)
部分MiniSys指令详解 bne $s1, $s2,100 # if $s1 ≠ $s2, goto PC+4+100 6-bit 5-bit 5-bit 16-bit 000101 10001 10010 0000 0000 0001 1001 立即数做符号扩展 不相等则转移转移指令(I-format)
部分MiniSys指令详解 slt $s1, $s2, $s3# if $s2<$s3, $s1=1; else $s1=0 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit 000000 10010 10011 10001 00000 101010 小于则设置指令(R-format)
部分MiniSys指令详解 j 10000 # go to 10000 6-bit 26-bit 000010 00000 00000 0000 1001 1100 0100 无条件转移指令(J-format)
部分MiniSys指令详解 jal 10000 # $31=PC+4; go to 10000 6-bit 26-bit 000011 00000 00000 0000 1001 1100 0100 过程调用指令(J-format)
部分MiniSys指令详解 jr $ra# jump register $ra 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit 000000 11111 00000 00000 00000 001000 按寄存器内容转移指令(R-format)
部分MiniSys指令详解 lui $s1,100 # $s1=100 << 16 6-bit 5-bit 5-bit 16-bit 001111 00000 10001 0000 0000 0110 0100 立即数赋值指令(I-format)
第2章 MiniSys的设计 • MiniSys CPU设计架构 • MiniSys CPU中各个单元 • 指令执行的分析 • 设计流水线处理器的考虑 • 设计多核处理器的考虑
MiniSys CPU设计架构(1) • 指令执行的步骤 Control idecode ifetch Execute Write Dmemory
+ PC MemtoReg MIPS instruction format MemWrite R-format op op rs rt rd func Sftmd/sftm/I_format I-format Alusrc 控制单元 op rs rt immediate func jmp | jal J-format jrn address op nBranch jal Branch 1 Regdst Regwrite 0 4 PC+4 0 address 0 + 1 左移2位 左移2位 WE 1 rs readR1 程序ROM A readD1 Zero rt 读地址 readR2 WE Alu result readD2 Address 0 0 指令 [31-0] B writeR Mem data 寄存器 1 rd 1 1 ALU writeD 数据RAM 0 Write Data Clock Clock immediate 1 0 符号扩展
MiniSys CPU中各单元(1) • Fetch(取指单元) • 定义指令ROM存储器 • 到程序ROM中取指令 • 对PC值进行+4处理 • 完成各种跳转指令的PC修改功能 • 在有中断的情况下处理中断到来时的PC修改
取指单元的设计 Memtoreg Memwrite op Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch jal Branch 1 Regdst Regwrite 0 4 PC+4 + 0 addresst 0 + 1 左移2位 左移2位 WE 1 rs readR1 程序ROM A readD1 Zero PC rt 读地址 readR2 WE Alu result readD2 Address 0 0 指令 [31-0] B writeR Mem data 寄存器 1 rd 1 1 ALU writeD 数据RAM 0 Write Data Clock Clock immediate 1 0 符号扩展
指令ROM的例化 lpm_rom prgrom(.address(PC[11:2]),.inclock(clock),.q(Jpadr)); // 实际上给出的地址是PC除4的结果,因为MIF文件按0、1、2、 // 3排列的 defparam prgrom.lpm_width = 32; //数据(指令)宽度32位 defparam prgrom.lpm_widthad = 10; //地址线宽度10位 defparam prgrom.lpm_file = "prgmip32.mif"; defparam prgrom.lpm_outdata = "UNREGISTERED"; defparam prgrom.lpm_address_control = "REGISTERED";
指令ROM的初始化文件 • prgmip32.mif文件(自行创建) DEPTH = 1024; -- 10位地址线 210=1024 WIDTH = 32; -- 数据宽度32位 ADDRESS_RADIX = HEX; --地址采用16进制描述 DATA_RADIX = HEX; -- 数据采用16进制描述 CONTENT BEGIN 0 : 8c020000; --lw $2 0($0) 1 : 8c030002; --lw $3 2($0) [19..3FD] : 00000000; 3FE: 03400008; -- jr $1A 中断0返回 3FF: 03600008; -- jr $1B 中断1返回 END;
MiniSys CPU中各单元(2) • Decode(译码单元) • 定义寄存器组 • 对寄存器组进行读写操作 • 根据指令译码结果,决定向其他部件(如运算器)送1路或两路数据
译码单元的设计 Memtoreg Memwrite op Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch jal Branch 1 Regdst Regwrite 0 4 PC+4 + 0 addresst 0 + 1 左移2位 左移2位 WE 1 rs readR1 程序ROM A readD1 Zero PC rt 读地址 readR2 WE Alu result readD2 Address 0 0 指令 [31-0] B writeR Mem data 寄存器 1 rd 1 1 ALU writeD 数据RAM 0 Write Data Clock Clock immediate 1 0 符号扩展
MiniSys CPU中各单元(3) • Control(控制单元) • 根据指令中的指令码(op)和功能码(funct)的不同组合输出相应的控制信号。
控制单元的设计 Memtoreg Memwrite op Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch jal Branch 1 Regdst Regwrite 0 4 PC+4 + 0 addresst 0 + 1 左移2位 左移2位 WE 1 rs readR1 程序ROM A readD1 Zero PC rt 读地址 readR2 WE Alu result readD2 Address 0 0 指令 [31-0] B writeR Mem data 寄存器 1 rd 1 1 ALU writeD 数据RAM 0 Write Data Clock Clock immediate 1 0 符号扩展
MiniSys CPU中各单元(4) • Exe(执行单元) • 完成逻辑运算 • 完成算术运算 • 完成移位运算 • 完成比较转移的PC值计算 • 完成比较后赋值
执行单元的设计 Memtoreg Memwrite op Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch jal Branch 1 Regdst Regwrite 0 4 PC+4 + 0 addresst 0 + 1 左移2位 左移2位 WE 1 rs readR1 程序ROM A readD1 Zero PC rt 读地址 readR2 WE Alu result readD2 Address 0 0 指令 [31-0] B writeR Mem data 寄存器 1 rd 1 1 ALU writeD 数据RAM 0 Write Data Clock Clock immediate 1 0 符号扩展
MiniSys CPU中各单元(5) • Dmemory(存储单元) • 定义数据存储单元RAM • 实际完成对数据存储器的读写操作
存储单元的设计 Memtoreg Memwrite op Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch jal Branch 1 Regdst Regwrite 0 4 PC+4 + 0 addresst 0 + 1 左移2位 左移2位 WE 1 rs readR1 程序ROM A readD1 Zero PC rt 读地址 readR2 WE Alu result readD2 Address 0 0 指令 [31-0] B writeR Mem data 寄存器 1 rd 1 1 ALU writeD 数据RAM 0 Write Data Clock Clock immediate 1 0 符号扩展
时序关系 • 器件固有延迟维持的流水
数据RAM的例化 • 数据存储器的实现 lpm_ram_dq ram(.data(write_data) , .address(address[11:2]), .we(Memwrite ), .inclock(clk),.q(read_data)); //在 // Verilog中使用Altera的RAM单元, 注意地址要除2 defparam ram.lpm_width =32; //数据宽32位 defparam ram.lpm_widthad = 10; //地址线宽10位 defparam ram.lpm_outdata = "UNREGISTERED"; defparam ram.lpm_indata = "REGISTERED"; defparam ram.lpm_address_control = "REGISTERED"; defparam ram.lpm_file = “dmem32.mif”; //存储体初始化文件 // 以双字为单位,所以地址都是4的倍数 教材中,P56页程序的12行 assign lpw_write(Memwrite && clk 删除 13行中的lpm_write 改成 Memwrite
数据RAM初始化文件 • dmem32.mif文件(自行创建) DEPTH = 1024; --10 位地址线 WIDTH = 32; -- 数据宽度32位 ADDRESS_RADIX = HEX; --地址采用16进制描述 DATA_RADIX = HEX; -- 数据采用16进制描述 CONTENT BEGIN 0 : 00000055; -- 行号是地址除以4的结果 1 : 000000AA; [2..3FF] : 00000000; END;
MiniSys CPU中各单元(6) • MiniSys (顶层设计) • 顶层整合模块 • 前面已经给出了MiniSys cpu 的5大部件的设计,最后需要将这5大部件组合成一个完整的CPU,可以用GDT图,也可以用Verilog的元件例化的方法来完成。 • 在元件例化的时候特别注意字母大小写一定要一致。