Skip to content

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=32x32
  • rd: 目的矩阵在内存中的地址

冒泡排序指令: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 清除。