写在前面:本博客内容为本人老师原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!
本博客全网唯一合法URL:http://www.cnblogs.com/acm-icpcer/p/9291767.html
1.指令集设计:
CPU的指令类型根据其操作的不同,可以分为下面七类。
(1)计算类指令(Computational)
计算类指令用于执行算术操作,乘/除,逻辑操作和对寄存器进行移位操作。这些指令有两种类型:寄存器类型和立即数类型。寄存器类型的指令使用两个源寄存器的值作为源操作数,立即数类型使用一个寄存器和立即数作为源操作数。根据操作的不同,这些指令分为下面4种:
(2)Load/Store指令
Load和Store指令都为立即数(I-type)类型,用来在存储器和通用寄存器之间的储存和装载数据。值得一提的是MIPS指令集只有该类指令访问内存,而其他指令都在寄存器之间进行,所以指令的执行速度较高。该类指令只有基址寄存器的值加上扩展的16位有符号立即数一种寻址模式,数据的存取方式可以是字节(byte)、字(word)和双字(Double word)。
指令格式:
(3)跳转/分支指令(jump & branch)
跳转和分支指令改变程序流。所有的跳转和分支指令都会产生的一个延迟槽(delay slot)。紧跟着跳转/分支指令后的指令(delay slot中的指令)也被执行,然后在跳转目的的第一条指令从存储器中取出并执行,这是在指令的流水线执行时获得更高效率。
(4)寄存器传送指令
寄存器传送指令用来在系统的通用寄存器(GPR)、乘除法专用寄存器(HI、LO)之间传送数据,这些指令分为有条件传送和无条件传送2种类型。
(5)专用指令
专用指令用来产生软件中断,当执行这类指令的时候,CPU产生异常并转入中断处理程序。这些指令有系统调用(Syscall),暂停(Break)和Trap指令等,主要用于软件的异常处理。
(6)协处理器指令
协处理器指令对协处理器进行操作。协处理器的Load和Store指令是立即数类型,每个协处理器指令的格式依协处理器不同而不同。
(7)系统控制协处理器(CP0)指令
系统控制协处理器(CP0)指令执行对CP0寄存器的操作来控制处理器的存储器并执行异常处理。
本实验设计只选取了20条典型的MIPS指令来描述CPU逻辑电路的设计方法。下表列出了本实验的所涉及到的20条MIPS指令。
20条MIPS指令
R型指令 | |||||||
指令 | [31:26] | [25:21] | [20:16] | [15:11] | [10: 6] | [5:0] | 功能 |
Add | 000000 | rs | rt | rd | 000000 | 100000 | 寄存器加 |
Sub | 000000 | rs | rt | rd | 000000 | 100010 | 寄存器减 |
And | 000000 | rs | rt | rd | 000000 | 100100 | 寄存器与 |
Or | 000000 | rs | rt | rd | 000000 | 100101 | 寄存器或 |
Xor | 000000 | rs | rt | rd | 000000 | 100110 | 寄存器异或 |
Sll | 000000 | 00000 | rt | rd | sa | 000000 | 左移 |
Srl | 000000 | 00000 | rt | rd | sa | 000010 | 逻辑右移 |
Sra | 000000 | 00000 | rt | rd | sa | 000011 | 算术右移 |
Jr | 000000 | rs | rt | rd | 000000 | 001000 | 寄存器跳 |
I型指令 | |||||||
Addi | 001000 | rs | rt | immediate | 立即数加 | ||
Andi | 001100 | rs | rt | immediate | 立即数与 | ||
Ori | 001101 | rs | rt | immediate | 立即数或 | ||
Xori | 001110 | rs | rt | immediate | 立即数异或 | ||
Lw | 100011 | rs | rt | offset | 取数据 | ||
Sw | 101011 | rs | rt | offset | 存数据 | ||
Beq | 000100 | rs | rt | offset | 相等转移 | ||
Bne | 000101 | rs | rt | offset | 不等转移 | ||
Lui | 001111 | 00000 | rt | immediate | 设置高位 | ||
J型指令 | |||||||
J | 000010 | address | 跳转 | ||||
Jal | 000011 | address | 调用 |
R型指令的op均为0,具体操作由func指定。rs和rt是源寄存器号,rd是目的寄存器号。移位指令中使用sa指定移位位数。
I型指令的低16位是立即数,计算时需扩展到32位,依指令的不同需进行零扩展和符号扩展。
J型指令的低26位是地址,是用于产生跳转的目标地址。
2.总体电路设计:
本实验所设计的单周期CPU的总体电路结构如图所示。
本实验所设计的CPU主要组成部分有:运算器(ALU)、控制器(Control Unit)、寄存器堆(Register Files)、取指电路及相关基础部件(如选择器)等构成。
具体的代码实现请看:
Verilog HDL语言实现的单周期CPU设计(全部代码及其注释)
tz@COI HZAU
2018/7/10