b. G233 Datasheet
基本介绍
G233 是为 QEMU 训练营定制的虚拟板卡,具体介绍如下:
板卡示意图:
+------------------------------------------------------------------------------+
| G233 Board Architecture Diagram |
| |
| +-----------------+ +--------------------+ +-----------------+ |
| | DRAM | <---> | riscv.g233.cpu | <---> | MROM | |
| | 0x8000_0000 | | - RVA23 | | 0x0000_1000 | |
| | 0xBFFF_FFFF | | - Other Extensions | | 0x0000_2FFF | |
| +-----------------+ +----------+---------+ +-----------------+ |
| | |
| +-------------------+-------------------+ |
| | | | |
| +-------v-------+ +-------v-------+ +-------v-------+ |
| | PLIC | | CLINT | | PL011 | |
| | 0x0C00_0000 | | 0x0200_0000 | | 0x1000_0000 | |
| | 0x0FFF_FFFF | | 0x0200_BFFF | | 0x1000_0FFF | |
| +--------+------+ +--------+------+ +---------------+ |
| | | |
| +--------v------+ +--------v------+ +---------------+ |
| | GPIO | | PWM | | | |
| | 0x1001_2000 | | 0x1001_5000 | | Other | |
| | 0x1001_20FF | | 0x1001_5FFF | | | |
| +---------------+ +---------------+ +---------------+ |
| |
| Bus Fabric / AXI/LIB |
| |
+------------------------------------------------------------------------------+
板卡基本参数:
| address space | name | desc |
|---|---|---|
| - | riscv.g233.cpu | RISC-V G233 CPU 核心 符合 RISC-V ISA RVA23 标准,并扩展了自定义指令集,用于 QEMU 训练营教学实践。 |
0x00001000 0x00002fff |
riscv.g233.mrom | Machine Read-Only Memory (MROM) 存储芯片启动时的固件或引导代码(Boot ROM),内容在出厂时固化,不可修改,用于初始化 CPU 和加载下一阶段引导程序。 |
0x02000000 0x02003fff |
riscv.aclint.swi | ACLINT Software Interrupts (MSWI) 用于核间通信和软件触发的中断,支持 RISC-V 的 Machine-mode 软件中断,常用于操作系统中核间调度或同步操作。 |
0x02004000 0x0200bfff |
riscv.aclint.mtimer | ACLINT Machine Timer (MTIME) 提供高精度定时器功能,用于实现 rdtime 指令、时间片调度、超时控制等,是 RISC-V 标准计时器模块(MTimer)的实现。 |
0x0c000000 0x0fffffff |
riscv.sifive.plic | SiFive Platform-Level Interrupt Controller (PLIC) 管理外部中断的优先级和分发,支持多个中断源和多个中断优先级,负责将外部设备中断路由到合适的 CPU 核心。 |
0x10000000 0x10000fff |
riscv.pl011 | PL011 UART 控制器 兼容 ARM PL011 的串行通信接口,用于调试输出、终端通信等,常用于打印日志和交互式调试。 |
0x10012000 0x100120ff |
sifive_soc.gpio | General Purpose Input/Output (GPIO) 通用输入输出接口,可用于控制 LED、按键、传感器等外设,支持配置引脚方向、电平读写等基本操作。 |
0x10015000 0x10015fff |
riscv.g233.pwm0 | Pulse Width Modulation (PWM) 控制器 用于生成可调占空比的方波信号,常用于控制电机速度、LED 亮度调节、电源管理等模拟信号控制场景。 |
0x80000000 0xbfffffff |
riscv.g233.ram | Main DRAM (Dynamic Random Access Memory) 主内存区域,用于运行操作系统、应用程序和存储运行时数据,是系统主要的可读写存储空间。 |
扩展指令
DMA 转置指令:dma
该指令将一个 FP32 精度的二维矩阵,从 rs1 指向的内存地址,转置以后,搬运到 rd 指向的内存地址。
该指令遵循 R-type 格式。
31 25 24 20 19 15 14 12 11 7 6 0
+---------+--------+--------+----------+-------------------+-------+
| func7 | rs2 | rs1 | funct3 | rd | opcode| R-type
+---------+--------+--------+----------+-------------------+-------+
6 6 0x7b
+---------+--------+--------+----------+-------------------+-------+
| 0000110 | rs2 | rs1 | 110 | rd |1111011| dma
+---------+--------+--------+----------+-------------------+-------+
rs1: 源矩阵在内存中的起始地址rs2: 矩阵的规模:为 0 时,MxN=8x8;为 1 时,MxN=16x16;为 2 时,MxN=32x32rd: 目的矩阵在内存中的地址
冒泡排序指令:sort
该指令将一个 INT32 类型的数组,进行冒泡排序,可以指定数组大小和参与排序的数量
该指令遵循 R-type 格式。
31 25 24 20 19 15 14 12 11 7 6 0
+---------+--------+--------+----------+-------------------+-------+
| func7 | rs2 | rs1 | funct3 | rd | opcode| R-type
+---------+--------+--------+----------+-------------------+-------+
22 6 0x7b
+---------+--------+--------+----------+-------------------+-------+
| 0010110 | rs2 | rs1 | 110 | rd |1111011| sort
+---------+--------+--------+----------+-------------------+-------+
rs1: 被排序数组在内存中的起始地址rs2: 数组的大小rd: 参与排序的数量
压缩指令:crush
将一个格式为 8bit 的数组中的每个元素的低 4bit 抽出来,两两打包进一个 8bit,然后存放到一个新的数组当中。
伪代码:
dst[0] = src[0] & 0xf;
dst[0] |= (src[1] & 0xf) << 4;
该指令遵循 R-type 格式。
31 25 24 20 19 15 14 12 11 7 6 0
+---------+--------+--------+----------+-------------------+-------+
| func7 | rs2 | rs1 | funct3 | rd | opcode| R-type
+---------+--------+--------+----------+-------------------+-------+
38 6 0x7b
+---------+--------+--------+----------+-------------------+-------+
| 0100110 | rs2 | rs1 | 110 | rd |1111011| crush
+---------+--------+--------+----------+-------------------+-------+
rs1: 被打包数组在内存中的起始地址rs2: 被打包数组的元素数量rd: 打包后新数组在内存的起始地址
解压指令:expand
将一个格式为 8bit 的数组中的每个元素,按照 4bit 大小拆分进两个 8bit 元素中,然后放到一个新的数组当中。
伪代码:
dst[0] = src[0] & 0xf;
dst[1] = (src[0] >> 4) & 0xf;
该指令遵循 R-type 格式。
31 25 24 20 19 15 14 12 11 7 6 0
+---------+--------+--------+----------+-------------------+-------+
| func7 | rs2 | rs1 | funct3 | rd | opcode| R-type
+---------+--------+--------+----------+-------------------+-------+
54 6 0x7b
+---------+--------+--------+----------+-------------------+-------+
| 0110110 | rs2 | rs1 | 110 | rd |1111011| expand
+---------+--------+--------+----------+-------------------+-------+
rs1: 被解包数组在内存中的起始地址rs2: 被解包数组的元素数量rd: 解包后新数组在内存的起始地址
扩展外设
SPI 控制器
SPI (Serial Peripheral Interface) 控制器提供全双工同步串行通信功能,支持主从模式操作,可用于连接各种外设如传感器、存储器、显示器等。
功能特性
- 支持主模式和从模式操作
- 全双工同步数据传输
- 8 位数据位宽
- 支持中断处理(TXE、RXNE、错误中断)
- 4 个 CS 片选信号控制(CS0-CS3)
- 错误检测和处理(溢出/下溢)
寄存器映射
| 偏移地址 | 寄存器名称 | 访问权限 | 复位值 | 描述 |
|---|---|---|---|---|
| 0x00 | SPI_CR1 | R/W | 0x00000000 | 控制寄存器 1 |
| 0x04 | SPI_CR2 | R/W | 0x00000000 | 控制寄存器 2 |
| 0x08 | SPI_SR | R/W | 0x00000002 | 状态寄存器 |
| 0x0C | SPI_DR | R/W | 0x0000000C | 数据寄存器 |
| 0x10 | SPI_CSCTRL | R/W | 0x00000000 | CS 控制寄存器 |
寄存器详细说明
SPI_CR1 - 控制寄存器 1 (0x00)
| 位域 | 名称 | 访问 | 复位值 | 描述 |
|---|---|---|---|---|
31:7 |
保留 | - | 0 |
保留位,必须保持为 0 |
6 |
SPE | R/W | 0 |
SPI 使能位0: SPI 禁用1: SPI 使能 |
5:3 |
保留 | - | 0 |
保留位,必须保持为 0 |
2 |
MSTR | R/W | 0 |
主模式选择位0: 从模式1: 主模式 |
1:0 |
保留 | - | 0 |
保留位,必须保持为 0 |
SPI_CR2 - 控制寄存器 2 (0x04)
| 位域 | 名称 | 访问 | 复位值 | 描述 |
|---|---|---|---|---|
31:8 |
保留 | - | 0 |
保留位,必须保持为 0 |
7 |
TXEIE | R/W | 0 |
TXE 中断使能位0: TXE 中断禁用1: TXE 中断使能 |
6 |
RXNEIE | R/W | 0 |
RXNE 中断使能位0: RXNE 中断禁用1: RXNE 中断使能 |
5 |
ERRIE | R/W | 0 |
错误中断使能位0: 错误中断禁用1: 错误中断使能 |
4 |
SSOE | R/W | 0 |
软件从设备选择输出使能0: SS 输出禁用1: SS 输出使能 |
3:0 |
保留 | - | 0 |
保留位,必须保持为 0 |
SPI_SR - 状态寄存器 (0x08)
| 位域 | 名称 | 访问 | 复位值 | 描述 |
|---|---|---|---|---|
31:8 |
保留 | R | 0 |
保留位 |
7 |
BSY | R | 0 |
忙标志位0: SPI 空闲1: SPI 忙 |
6:4 |
保留 | R | 0 |
保留位 |
3 |
OVERRUN | R/W | 0 |
溢出错误标志0: 无溢出1: 发生溢出(写 1 清除) |
2 |
UNDERRUN | R/W | 0 |
下溢错误标志0: 无下溢1: 发生下溢(写 1 清除) |
1 |
TXE | R | 1 |
发送缓冲区空标志0: 发送缓冲区满1: 发送缓冲区空 |
0 |
RXNE | R | 0 |
接收缓冲区非空标志0: 接收缓冲区为空1: 接收缓冲区非空,数据可读 |
SPI_DR - 数据寄存器 (0x0C)
| 位域 | 名称 | 访问 | 复位值 | 描述 |
|---|---|---|---|---|
31:8 |
保留 | - | 0 |
保留位,必须保持为 0 |
7:0 |
DATA | R/W | 0x0C |
数据位 写入:发送数据 读取:接收数据 |
SPI_CSCTRL - CS 控制寄存器 (0x10)
| 位域 | 名称 | 访问 | 复位值 | 描述 |
|---|---|---|---|---|
31:8 |
保留 | - | 0 |
保留位,必须保持为 0 |
7 |
CS3_ACT | R/W | 0 |
CS3 激活状态0: CS3 非激活1: CS3 激活 |
6 |
CS2_ACT | R/W | 0 |
CS2 激活状态0: CS2 非激活1: CS2 激活 |
5 |
CS1_ACT | R/W | 0 |
CS1 激活状态0: CS1 非激活1: CS1 激活 |
4 |
CS0_ACT | R/W | 0 |
CS0 激活状态0: CS0 非激活1: CS0 激活 |
3 |
CS3_EN | R/W | 0 |
CS3 使能位0: CS3 禁用1: CS3 使能 |
2 |
CS2_EN | R/W | 0 |
CS2 使能位0: CS2 禁用1: CS2 使能 |
1 |
CS1_EN | R/W | 0 |
CS1 使能位0: CS1 禁用1: CS1 使能 |
0 |
CS0_EN | R/W | 0 |
CS0 使能位0: CS0 禁用1: CS0 使能 |
操作说明
1. 初始化 SPI 控制器
设置 SPI_CR1 寄存器的 MSTR 位选择主/从模式,设置 SPI_CR1 寄存器的 SPE 位使能 SPI,配置 SPI_CR2 寄存器设置中断使能(可选)。
2. CS 控制
通过 SPI_CSCTRL 寄存器控制 CS0-CS3 的使能和激活状态,在传输前激活对应的 CS 信号,传输完成后取消激活 CS 信号。
3. 数据传输
检查 SPI_SR 寄存器的 TXE 位确认发送缓冲区为空,向 SPI_DR 寄存器写入要发送的数据,检查 SPI_SR 寄存器的 RXNE 位确认接收缓冲区有数据,从 SPI_DR 寄存器读取接收到的数据。
4. 中断处理
TXEIE:发送缓冲区空中断使能; RXNEIE:接收缓冲区非空中断使能; ERRIE:错误中断使能(溢出/下溢)。
5. 错误处理
OVERRUN:接收溢出错误,写 1 清除; UNDERRUN:下溢错误,写 1 清除。