CPU
CPU功能简介
- 该CPU支持32条基础MIPS汇编指令(包含mfc0, mtc0, syscall三条中断相关的特权指令)。支持32位加减运算、逻辑判断、内存操作等操作。
- 对于各种外设的控制是由lw,sw两条命令对于特定地址空间操作来实现
- 支持16个中断设备,并且支持中断嵌套。
支持指令
指令类型 | 指令名 |
---|---|
R-type | add |
R-type | sub |
R-type | and |
R-type | or |
R-type | xor |
R-type | nor |
R-type | slt |
R-type | sll |
R-type | srl |
R-type | sllv |
R-type | srlv |
R-type | jr |
R-type | mfc0 |
R-type | mtc0 |
I-type | addi |
I-type | andi |
I-type | ori |
I-type | xori |
I-type | lui |
I-type | lw |
I-type | sw |
I-type | lh |
I-type | sh |
I-type | lb |
I-type | sb |
I-type | beq |
I-type | bne |
I-type | slti |
J-type | j |
J-type | jal |
J-type | syscall |
J-type | eret |
中断
中断相关指令
- 读CP0指令 mfc0 rt, rd : GPR[rt] <= CP0[rd]
- 写CP0指令 mtc0 rd, rt : GPR[rd] <= CP0[rt]
- 异常返回 eret : PC <= EPC
- 系统调用 syscall : EPC = PC + 4 ; PC <= 异常处理位置 ; CP0中Cause和Status寄存器变化
- $v0=系统调用号
- $a0~$a3、$f12, 返回值在$v0
CP0主要寄存器说明
寄存器 | 编号 | 作用 |
---|---|---|
Status | 12 | 状态寄存器、特权、中断屏蔽位及使能可控位 |
Cause | 13 | 中断异常类型及中断持起位 |
EPC | 14 | 中断返回地址 |
CP0中断协处理数据通路
- mfc0 读cp0指令
control模块控制mfc0(1:0)信号选择Cause_out, Status_out, EPC_out中的一个选择输出作为CP0_out - mtc0 写cp0指令
control模块控制mtc0=1,将CP0中的寄存器输入数据都选择为data(31:0)。同时控制器会控制wcau、wsta、wepc三个信号中的一为1,来控制写入哪一个寄存器。 - syscall 系统调用
- control模块控制exc=1,mtc0=0,wsta=1。使得status=sta_left,也就是让status左移16位保护其中断(如果中断过程嵌套中断,那么后续可以软件用mtc0来写入);control模块控制inta,wpc根据具体场景将当前pc或者pc+4存入EPC中;control模块控制wcau=1将cause存入cause模块中。
- 在主CPU中,根据Cause取得中断向量表的值,存入PC中。
- eret 系统调用返回
- control模块控制exc=1,mtc0=0,wsta=1。使得status=sta_right,也就是右移恢复status,重新接受中断
- 将EPC_out输出到主CPU的PC中
- int 硬件中断
在CP0中的做法同syscall。只是CPU时序状态上有差别。
CPU数据通路实现
- 控制方式
在这个数据通路下,我们支持的指令都是可以通过control模块来控制信号来实现。 - 控制信号输入
图示左边一列是所有的输入控制信号,这些信号用于控制数据通路中的各种各样的选择器来达到数据通路控制的效果。 - 数据输出
图示右边一列是所有的输出信号,根据不同的数据输入将输出不同的数据(data_out)、总线地址(M_addr)、PC地址(PC_current),用于沟通外设或执行动作。
CPU时序状态转移
- 其中蓝色的正常的指令。红色的中断CP0相关指令。
- mfc0,设置好控制信号,在该周期结束的上升沿即可将cp0寄存器中的数据存入CPU寄存器中
- mtc0,设置好控制信号,在该周期结束的上升沿即可将CPU寄存器中的数据存入cp0寄存器中
- int_mem_read,设置好控制信号,在该时钟周期结束的上升沿,根据Cause查找中断向量表中的地址存入EPC中
- Store_cp0,设置好控制信号,在该时钟周期上升沿,将EPC的地址(刚才中断向量返回的地址)写入PC中,同时将pc或npc的值写入EPC中(即保存放回值),结束后即进入中断处理程序。
- eret,设置好控制信号,在该时钟周期的上升沿,将EPC的地址写入到PC中。恢复程序的进行。
- 附注
- syscall指令执行的时候,要经过IF->ID->int_Mem_read->WB_int
- 硬件中断的时候,运行到当前指令结束,直接跳到int_Mem_read阶段。
CPU数据通路信号控制
这些控制信号直接地对应于上面那个时序状态图。也就是在某个状态的时候控制数据通路的控制信号输入的值。那么数据通路就会根据输入的值执行不同的操作即可执行相应的结果。
RAM
RAM简介
- 性能参数
该RAM为Kintex-7片上的一块block memory,RAM的大小为256KB。最小存取周期为10ns,需要时钟进行同步操作。
VGA外设
VGA显示接口模块简介
- 该VGA支持支持字符模式:每个字符占32bit,高24位为颜色,低8位为字符ascii
- 显存vram为双端口block memory,大小为8*2400 = 2400byte。可以同时供时钟和vram进行独立地读写。
显示器接口模块
VGA显示器接口模块的核心是vgac也就是controller模块,controller模块根据扫描时钟送出行/场同步信号hsync/vsync给VGA显示器,同时送出已经转化好的该时钟周期内扫描像素点的行/列位置row_addr/col_addr。将行/列位置进行计算后得到一个内存的地址,通过选择器与CPU_DATA经过条件选择后送入vram,取得当前像素的显示数据,包括颜色和ascii码。将ascii码送入font_dev得到点阵的数据data,在和之前的color进行与运算将最终的RGB送入VGA显示器,这样就完成了整个VGA接口模块的显示过程。
键盘外设
键盘简介
键盘模块可以接受键盘发来的扫描码,并且内部具有32位的硬件缓冲区。当缓冲区中有数据的时候将会将int位置位高,表示当前存在中断,用于通知CPU进行处理。
键盘外设模块
Ps2键盘模块的核心为ps2_kbd模块。Ps2_kbd模块根据扫描时钟clk不断地对PS2C,PS2D进行扫描并存入队列中,如果队列中非空,那么ready=1也就是处于有键盘输入,通知CPU中断。当wea置为0的时候,也就是表示为读取状态,其内部的FIFO队列将在当前时钟周期结束时弹出一个扫描码,如果FIFO队列为空,那么重新将ready置为0,表示已经读完数据,不对CPU进行中断。