基于Vivado平台使用VHDL设计实现一个单周期CPU(HBU硬件描述语言实验大作业)
CPU架构
基本架构
参考课程给出的推荐架构,具体如下:
- 哈佛结构RISC,字长为16位
- 单周期
- 指令字长为16位
- 数据字长为16位
- 程序存储空间为65536字
- 数据存储空间为65536字
寄存器
- 16个16位通用寄存器r0-r15 ,r0总为零,r15为链接寄存器;
- 1个4位标志寄存器,V溢出,C进位,N负,Z零;
指令集说明
指令集分类如下:
- 立即寻址加载指令
- 寄存器寻址运算指令
- 立即寻址跳转指令
- 偏移寻址条件分支指令
- 寄存器间接寻址加载/存储指令
- 链接寄存器寻址跳转指令
立即寻址加载指令
指令中的8位立即数加载到指定的通用寄存器低8位。 Imm8为8位立即数,rd为通用寄存器。
LI rd, Imm8
寄存器寻址运算指令
通用寄存器rs和rd中的两个操作数进行运算操作码alu_op指定运算Fx ,结果赋值到寄存器rd中。寄存器寻址运算指令的运算操作码为4位,可以指定16种运算。每种运算都将改变标志位寄存器的内容。
Fx rd, rs
运算指令 | 操作码 | 说明 |
---|---|---|
ADD | 0000 | 加法 |
SUB | 0001 | 减法 |
MOV | 0100 | 拷贝 |
AND | 0101 | 与运算 |
OR | 1010 | 或运算 |
NOT | 0111 | 非运算 |
XOR | 1000 | 异或运算 |
SLL | 1001 | 逻辑左移 |
SRL | 1010 | 逻辑右移 |
SRA | 1011 | 算数右移 |
SCC | 1100 | 带进位循环一位右移 |
TST | 1101 | 比较运算,仅改变标志位 |
RDF | 1110 | 读标志位 |
WRF | 1111 | 写标志位 |
立即寻址跳转指令
跳转指令
14位立即数地址送PC低14位(程序跳转), PC高2位不变。
JMP addr14
带链接的跳转指令
当前 PC值送r15 ,14为立即数地址送 PC低14位。
JL addr14
偏移寻址条件分支指令
若指定条件为真,当前 PC 值加上有符号相对偏移地址立即数 addr8 送给 PC,程序跳转。条件码为4位,对应4位标志位,产生4个执行跳转条件。条件码某位为1,所对应的标志位为1,则该执行跳转条件为真。条件码某位为0,则该执行跳转条件总为真。
BX addr8
条件码 | 说明 |
---|---|
0000 | 直接跳转 |
0001 | Z为1(相等)则跳转 |
0010 | 标志位 N为1(小于)则跳转 |
0100 | 标志位 C为1(有进位或借位)则跳转 |
1000 | 标志位 V为1(溢出)则跳转 |
寄存器间接寻址
寄存器间接寻址加载指令
将 rs 所存的地址值指定的数据存储器单元中的数据加载到 rd
LM rd, rs
存器间接寻址存储指令
将 rd 中的数据保存到 rs 所存的地址值指定的数据存储器单元。
SM rd, rs
链接寄存器寻址跳转指令
r15送 PC,程序跳转
JR
设计框架
该CPU主要组成部件如下:
- 寄存器堆
- 标志寄存器
- ALU
- 译码器
- 数据存储器
- 指令存储器
组件设计
寄存器组
共16个16位寄存器,设置一个读端口和一个读写端口
library IEEE; |
标志位寄存器
ALU 算数逻辑运算单元
library IEEE; |
数据存储器
基于IP核blk_mem_gen_0
封装
|
指令存储器
基于IP核dist_mem_gen_0
封装
library IEEE; |
控制器
主要完成指令译码,生成控制信号,计算PC值等任务
library IEEE; |
整体封装
将CPU、数据存储器、指令存储器封装到一起
library IEEE; |
测试验证
编写顶层仿真模块
library IEEE; |
初步仿真测试
使用老师给出的测试指令进行仿真
memory_initialization_radix = 16; |
经过不断地调试改错后,完成了此测试,整个测试过程中的寄存器值变化如下表:
寄存器 | 数据 |
---|---|
0 | 00h |
1 | 12h->1200h->1234h->56h->5600h->5678h->12h->1200h->1234h->56h->5600h->5678h->7fh->7f00h->7fffh->00h->02h |
2 | 08h |
3 | 34h->78h->34h->78h->ffh->02h |
4 | 1234h->bbbch->1234h->7fffh->8001h |
5 | 5678h->5678h->4444h->02h |
6 | 04h |
7 | a0h->50h |
8 | 01h |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | 22h->23h |
仿真结果与人工计算结果完全一致,仿真如下:
但分析发现,此测试集中缺少分支跳转、数据存储等指令,因此在此基础上进行了修改,增加了TST
,BS
,SM
指令,以测试相关指令的执行。
改进仿真测试
memory_initialization_radix = 16; |
在1d35
指令处,进行相等判断,写入标志寄存器,21f4
处根据标志位寄存器进行跳转,第一次经过时由于r3
与r5
均为02h
所以进行跳转,PC在原基础上减13
实际是加上-13
(注意应该写成补码!),跳转到0ff3
指令处
,修改r3
为ffh。第二次经过分支跳转时,不满足相等条件,继续执行最后一条存储指令。
仿真结果与预期一致,如下: