Bonky
Neither believe nor reject anything, because any other person has rejected or believed it. Heaven has given you a mind for judging truth and error, Use it.
By Thomas Jefferson

计算机组成课设 – MIPS 和 Verilog HDL

MIPS32 指令集

数据类型

  • 位(b):长度是 1 bit
  • 字节(Byte):长度是 8 bit
  • 半字(Half Word):长度是 16 bit
  • 字(Word):长度是 32 bit
  • 双字(Double Word):长度是 64 bit

寄存器

RISC 的一大特点是:大量使用寄存器。这是因为寄存器的存取可以在一个时钟周期内完成,同时也简化了寻址方式。MIPS32 的指令中除加载(LDA)和存储(STO)指令外,都是使用寄存器或立即数作为操作数的。MIPS32 中的寄存器分为两类:通用寄存器(General Purpose Register, GPR)、特殊寄存器。

通用寄存器

MIPS32 架构定义了 32 个通用寄存器,使用美元符加数字 0-31表示,都是 32 位。其中 0 般用做常量 0。

实际使用中,一般遵循以下约定:

image-20200323120110380

特殊寄存器

  • PC – 程序计数器
  • HI – 乘除结果高位寄存器
  • LO – 乘除结果低位寄存器

字节次序

  • 大端模式(Big-Endian),也称为 MSB (Most Significant Byte)
  • 小端模式(Little-Endian),也称为 LSB (Least Significant Byte)

我们实现的处理器采用的是大端模式。

指令格式

MIPS32 有三种指令格式。其中 op 是指令码、func 是功能码。

  • R 类型:具体操作由 op、func 结合指定,rs 和 rt 是源寄存器的编号,rd 是目的寄存器的编号,MIPS32 架构中有 32 个通用寄存器,使用 5 位编码就可以全部表示,所以 rs、rt、rd 的宽度都是 5 位。sa 只有在移位指令中使用,用来指定移位位数。

  • I 类型:具体操作由 op 指定,指令的低 16 位是立即数,运算时要将其扩展至 32 位,然后作为其中一个源操作数参与运算。

  • J 类型:具体操作由 op 指定,一般是跳转指令,低 26 位是字地址,用于产生跳转的目标地址。

寻址方式

MIPS32 架构的寻址模式有寄存器寻址、立即数寻址、寄存器相对寻址和 PC 相对寻址四种。其中寄存器相对寻址、PC 相对寻址的介绍如下。

寄存器相对寻址

这种寻址模式主要是加载存储指令使用,其将一个 16 位的立即数做符号扩展,然后与指定通用寄存器的值相加,从而得到一个有效地址。

PC 相对寻址

这种寻址模式主要是转移指令使用,在转移指令中有一个 16 位的立即数,将其左移两位并作符号扩展,然后与程序计数寄存器 PC 的值相加,从而获得有效地址。

协处理器

协处理器一词通常用来表示处理器的一个可选部件,负责处理指令集的某个扩展,拥有与处理器相独立的寄存器。MIPS32 架构提供了最多 4 个协处理器。

协处理器 CP0 用作系统控制,CP1、CP3 用作浮点处理单元,而 CP2 被保留用于特定实现。除 CP0 外的协处理器都是可选的。

协处理器 CP0 的具体作用有:配置 CPU 工作状态、高速缓存控制、异常控制、存储管理单元控制等。CP0 通过配置内部的一系列寄存器来完成上述工作。

FPGA

FPGA 是可编程逻辑器件(Programmable Logic Device, PLD)的一种。PLD 主要有这么两类:

基于乘积项(Product-Term)结构的 PLD 器件

任何组合逻辑电路函数均可化为“与或”表达式,而任何时序电路又都可以由组合电路加上存储元件(触发器)构成。因此,从原理上说,与或阵列加上触发器的结构就可以实现任意的数字逻辑电路。

基于查找表(Look- Up Table, LUT)结构的 PLD 器件

基于与或阵列的 PLD 器件的规模不容易做得很大(因为要全连接)。于是设计人员又开发出查找表结构。

其原理类似于 ROM,物理结构基于 SRAM 和数据选择器 MUX,通过查表方式实现函数功能。函数值放在 SRAM 中,SRAM 的地址线即输入变量,不同的输入通过 MUX 找到对应的函数值并输出。N 个输入项的逻辑函数可以由一个 2^N^ 位容量的 SRAM 实现。

由于容量是随着输入量指数增长的。所以实际上,FPGA 器件查找表的输入变量一般不超过 5 个,多于 5 个输入变量的逻辑函数可由多个查找表通过组合或级联实现。

Verilog

模块

一个模块的基本结构如下:

端口一般这么定义:

数据类型

常数

如,8'b11000101 代表宽度为8位的二进制数,数值为11000101, 等于十进制的197。

变量

net 型变量

net 型相当于硬件电路中各种物理连接,其特点是输出的值紧跟输入值的变化而变化。我们只使用了 wire 类型,wire 型变量的取值可为 0、1、X、Z,其中 0 表示低电平、逻辑 0。1 表示高电平、逻辑 1。X 表示不确定或未知的逻辑状态。Z 表示高阻态。如果没有赋值,默认为高阻态 Z。

Variable 型变量

variable 型变量是可以保存上次写入数据的数据类型,一般对应硬件上的一个触发器或锁存器等存储元件。我们只使用了 reg 类型。

向量

变量声明格式中的位宽如果为 1,那么对应的变量为标量,如果不为 1,那么对应的变量为向量,默认为标量。向量的位宽用 [MSB:ISB] 形式定义。

运算符

注意几个特殊的:

符号 含义
^ 按位异或
~^ 按位同或
{ } 位拼接
=== 全等于

等式运算符中的 ===== 的区别

对于运算 ==,参与比较的两个操作数必须逐位相等,其结果才为 1,如果某些值是不定态 X 或高阻态 Z,那么得到的结果是不定值 X。

而对于 === 运算,则要求对参与运算的操作数中为不定态 X 或高阻态 Z 的位也进行比较,两个操作数必须完全一致,其结果才为 1, 否则结果为 0。

缩位运算与位运算

两者的运算符号、逻辑运算法则都是一样的,但是缩位运算符是对单个操作数进行与、或、异或的递推运算,它放在操作数的前面,能够将一个矢量减为一个标量。例如。

过程

Verilog 定义的模块一般包括过程语句,过程语句有两种:initial、always。其中 initial 常用于仿真中的初始化,其中的语句只执行一次,而 always 中语句则是不断重复执行的。

always 过程语句

always 过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,敏感信号表达式又称为事件表达式或牧感信号列表,当该表达式中变量的值改变时,就会引发其中语句序列的执行。因此,敏感信号表达式中应列出影响块内取值的所有信号。

下面是一个例子:

Init 过程语句

initial 过程语句不带触发条件,并且其中的语句序列只执行一次。initial 过程语句通常用于仿真模块中对激励向量的描述,或用于给寄存器赋初值。

Share

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注