项目地址:CalebChen768/8bits-model-cpu (github.com)
1. 设计任务
1.1 系统功能
- 系统构成: 存储器模块、CPU模块、外设输入模块和输出模块;
- 总线: 地址总线和数据总线,总线位宽为8位;
- 指令集: 加、减、乘、除、进位加、借位减算数运算,左移、右移、与、或、非、补逻辑运算,数据转移指令(立即数到寄存器、内存到寄存器、寄存器到寄存器、寄存器写入内存),无条件跳转,有条件跳转JA、JB、JE,比较指令CMP,停机指令HALT共计22条;
- 存储器容量: 64×8位;
- 时钟频率: 100MHz;
- 输入方式: 开关1个: rst全局复位;
- 输出方式: LED和数码管显示输出。
1.2 设计要求
根据模型计算机的工作原理,要求10个以上功能模块设计、仿真和调试,系统设计、仿真和调试。功能模块举例如下: 算术逻辑运算单元、累加器、控制器、地址寄存器、程序计数器、数据寄存器、存储器、节拍发生器、时钟信号源、指令寄存器和译码器等。
2. 设计思路
2.1 组成模块
系统功能模块主要有: SG
节拍发生器; PC
程序计数器; ALU
算术逻辑单元; IR
指令寄存器; Decoder
指令译码器; Controller
控制器; RAM
随机读写存储器(调用Vivado IP核,已经整合了DR
数据暂存器); MAR
地址寄存器; RA
寄存器阵列;
时钟由开发板100MHz时钟分频后驱动,并通过SG
节拍器产生工作对应的节拍。
2.2 整体框图
3. 指令集设计
3.1 支持的指令
算术运算指令ADD ADC SUB SBB MUL DIV
; 逻辑运算指令AND OR NOT NEG
; 移位指令SHL SHR
; 比较指令 CMP
; 跳转指令JMP JA JB JE
; 内存读写指令、数据转移指令 MOV
; 停机指令 HALT
。
3.2 指令集设计
在模型计算机中,指令用于验证模型机能否正常工作。该模型机所实现的指令如下表所示。
由于本模型使用了多寄存器,因此下表指令用Rx指代目标寄存器编号,xx(yy)为两位二进制数,00,01,10,11分别表示R0,R1,R2,R3寄存器。
指令码 | 指令 | 内容 |
---|---|---|
0010xxyy | ADD Rx,Ry | 将Rx、Ry寄存器的内容相加并保存到Rx |
0011xxyy | ADC Rx,Ry | 将Rx、Ry寄存器的内容及标志CF相加并保存到Rx |
0100xxyy | SUB Rx,Ry | 将Rx、Ry寄存器的内容相减并保存到Rx |
0101xxyy | SBB Rx,Ry | 将Rx、Ry寄存器的内容及标志CF相减并保存到Rx |
110100xx | MUL Rx | R0*Rx,结果高8位保存在R0中,低8位保存在R1 |
110101xx | DIV Rx | R0/Rx,整数部分保存到R0,余数保存到R1 |
0110xxyy | SHL Rx,Ry | Rx内容左移Ry位 |
0111 xxyy | SHR Rx,Ry | Rx内容左移Ry位 |
1000 xxyy | AND Rx,Ry | 将Rx、Ry寄存器的内容相与并保存到Rx |
1001 xxyy | OR Rx,Ry | 将Rx、Ry寄存器的内容相或并保存到Rx |
1010 xxyy | CMP Rx,Ry | 计算Rx-Ry,不保存结果,仅改变标志位 |
111001xx | NOT Rx | Rx取反 |
111010xx | NEG Rx | Rx取补 |
110110xx | MOV Rx,[aaaa] | 将aaaa号指定内存单元的数据复制到Rx寄存器中 |
110111xx | MOV [aaaa],Rx | 将Rx寄存器的数据复制到aaaa号指定内存单元中 |
111000xx | MOV Rx, In | 将下一个内存单元给定的数保存到Rx寄存器 |
0001xxyy | MOV Rx,Ry | 将Ry的值复制到Rx中 |
00001111 | HALT | 停机 |
111100xx | JMP Rx | 无条件调转到Rx指定的地址 |
111101xx | JA Rx | CF=0&ZF=0时调转到Rx指定的地址 |
111110xx | JB Rx | CF=1时调转到Rx指定的地址 |
111111xx | JE Rx | ZF=1时调转到Rx指定的地址 |
4. 功能模块设计与仿真
4.1 节拍发生器 SG
节拍发生器(Signals Generator)用于产生八个节拍脉冲信号T0~T7,以便控制计算机按固定节拍有序地工作。节拍发生器是一个环形移位寄存器,产生的波形如图3-1-1所示。当CLR=0时,将初始节拍置为00000001,检测到时钟信号的上升沿时,变换到下一个节拍,即将节拍循环右移,以实现特定的功能。
节拍发生器可以用8个D触发器组成移位寄存器,初始值为00000001。
4.2 指令寄存器 IR
指令寄存器(Instruction Register)从总线中读取指令,保存,并传递给指令译码器进行译码。指令寄存器让一条指令在下一条指令去除之前能一直被指令译码器和操作控制器使用,保障微操作的正确控制。
指令寄存器由一个八位触发器LS377(非标准,经过改造)构成,具有清零rst和IIR读取指令控制线,包含8位输入输出线。
4.3 指令译码器Decoder
指令译码器(Decoder)用于将8位指令译码为独热的编码,同时将指令中的目标寄存器翻译为4位独热码,使操作控制器能根据不同的指令做出不同的命令,并且控制对应的寄存器。
4.4 操作控制器Controller
操作控制器根据指令译码器的指令编号、目标寄存器的数值以及节拍发生器的8个节拍,根据预设的微操作控制表,控制各个控制线工作。
4.5 地址寄存器 MAR
地址寄存器(Memory Address Register)为RAM主存提供地址,接受来自程序计数器PC或者数据暂存器DR的数据,由指令IMAR/IMARB分别控制,MAR的输出传入RAM。
4.6 程序计数器 PC
程序计数器记录cpu工作的进度,为地址寄存器MAR提供地址数据;PC具有自加一控制信号,同时也能从总线中读取跳转地址,由跳转控制信号操控
程序计数器可以用6位触发器构成。编译成功后程序计数器的RTL如图3-6-1所示。
4.7 随机读写存储器(IP核) RAM+DR
随机读写存储器调用了Vivado提供的ram ip核,ip核对外提供了数据暂存器,因此本次设计无需再单独设计DR模块。
RAM- IP包含系统RAM IP核以及一个8位三态门,用于保证连接到总线的设备都是三态的。编译成功的RAM- IP RTL如图3-7-2所示。
4.8 寄存器阵列RA
寄存器阵列(Registers Array)包含4个通用寄存器R0~R3和1个标志位寄存器。R0到R3通用寄存器均有一条从数据总线输入的数据线和向总线输出的数据线,并且有8位三态门控制通断;同时R1寄存器作为乘法低8位和除法余数专用寄存器有专门的输入线与ALU相连,并有2选1数据选择器进行控制;标志为寄存器仅向ALU传递数据、从ALU接受数据。
4个通用寄存器和1个标志为寄存器均由8位触发器组成,R1包含2选1数据选择器,所有寄存器输出均有三态门。编译成功后寄存器阵列的RTL如图3-8-2所示。
4.9 算术逻辑单元 ALU
算术逻辑单元(Arithmetic and Logic Unit)主要负责加减乘除算术运算,移位、与或非补逻辑运算,比较指令,以及有条件跳转指令的判断。ALU由数据选择单元、运算器和输出三态门构成。数据选择单元输入为R0~R3共4个寄存器,控制信号为指令译码器的Tgt1[3:0],Tgt2[3:0],输出结果为两个8进制操作数直接作为运算器的输入。