修订历史

版本号 修订日期 修订的章节 修订的内容
1.0 2019/11/20 N/A 初始版本

1. N100系列内核配套SoC简介

N100系列内核配套SoC为N100系列内核配套的MCU级别SoC,其特性概述如下:

  • 使用N100系列内核。

  • 配备片上SRAM。

  • 配备自定义的SoC总线。

  • 配备常用的开源外设IP。

注意:该配套SoC仅仅作为一个非常简单的原型参考SoC,以便于用户快速进行仿真和FPGA原型测试,但不建议直接作为量产SoC采用。

2. N100系列内核配套SoC框图

N100系列内核配套SoC的框图如图 2‑1所示。图中除了N100系列内核和总线之外,还包含常见的开源外部设备IP。有关N100系列内核配套SoC中的各外设的详细介绍,请参见第10章。

图 2‑1 N100内核配套SoC框图

3. N100系列内核配套SoC总线

N100系列内核配套SoC定义了一种自定义总线协议ICB(Internal Chip Bus)。ICB总线的初衷是为了能够尽可能地结合AXI总线和AHB总线的优点,兼具高速性和易用性,它具有如下特性:

  • 相比AXI和AHB而言,ICB的协议控制更加简单,仅有两个独立的通道,如图 3‑1所示,读和写操作共用地址通道,共用结果返回通道。

  • 与AXI总线一样采用分离的地址和数据阶段。

  • 与AXI总线一样采用地址区间寻址,支持任意的主从数目,譬如一主一从,一主多从,多主一从,多主多从等拓扑结构。

  • 与AHB总线一样每个读或者写操作都会在地址通道上产生地址,而非像AXI中只产生起始地址。

  • 与AXI总线一样支持地址非对齐的数据访问,使用字节掩码(Write Mask)来控制部分写操作。

  • 与AXI总线一样支持多个滞外交易(Multiple Oustanding Transaction)。

  • 与AHB总线一样不支持乱序返回乱序完成。反馈通道必须按顺序返回结果。

  • 与AXI总线一样非常容易添加流水线级数以获得高频的时序。

  • 协议非常简单,易于桥接转换成其他总线类型,譬如AXI,AHB,APB或者TileLink等总线。

图 3‑1 ICB总线示意图

3.1. ICB总线协议信号

ICB总线主要包含2个通道。ICB总线信号列表如表 3‑1所示:

  • 命令通道(Command Channel):Command Channel主要用于主设备向从设备发起读写请求。

  • 返回通道(Response Channel):Response Channel主要用于从设备向主设备返回读写结果。

表 3‑1 ICB总线信号

通道 方向 宽度 信号名 介绍
Command Channel Output 1 icb_cmd_valid 主设备向从设备发送读写请求信号
Input 1 icb_cmd_ready 从设备向主设备返回读写接受信号
Output 32 icb_cmd_addr 读写地址
Output 1 icb_cmd_read 读或是写操作的指示。读则以总线宽度(譬如32位)为单位读回一个数据。写则靠字节掩码(icb_cmd_wmask)控制写数据的大小(Size)。
Output 32 icb_cmd_wdata 写操作的数据,数据的摆放格式与AXI协议一致
Output 4 icb_cmd_wmask 写操作的字节掩码,掩码的摆放格式与AXI协议一致
Reponse Channel Input 1 icb_rsp_valid 从设备向主设备发送读写反馈请求信号
Output 1 icb_rsp_ready 主设备向从设备返回读写反馈接受信号
Input 32 icb_rsp_rdata 读反馈的数据,数据的摆放格式与AXI协议一致
Input 1 icb_rsp_err 读或者写反馈的错误标志

3.2. ICB总线协议时序

有关ICB总线协议时序的细节请参见中文书籍《手把手教你设计CPU——RISC-V处理器篇》的第12章。

3.3. 本SoC总线结构

本SoC总线结构如图 2‑1中所示:

  • 通过系统存储总线,访问SoC中的若干存储组件,譬如ROM,Flash的只读区间等。

  • 通过私有设备接口访问SoC中的若干设备,譬如UART,GPIO等等。

有关SoC的结构和组件以及地址分配,请参见后文。

4. N100系列内核配套SoC存储资源

如图2‑1中所示,N100系列内核配套SoC中的存储器资源分为片上存储资源和片外Flash存储资源,下面分别予以介绍。

4.1. 片上存储资源

N100系列内核配套SoC的片上存储资源主要有ILM和DLM,以及挂载在系统存储总线上的ROM。

  • ILM为处理器内核的指令存储器,其特性如下:

    • 大小可配置。

    • 可配置的地址区间(默认起始地址为0x8_0000),见第5章中SoC的完整地址分配。

    • 在此配套SoC中,ILM SRAM虽然主要用于存放指令,但是其地址区间也可以被用来存放数据。处理器核可以通过SoC的系统存储总线访问到ILM。

  • DLM为处理器内核的数据存储器,其特性如下:

    • 大小可配置。

    • 可配置的地址区间(默认起始地址为0x9_0000),见第5章中SoC的完整地址分配。

    • 在此配套SoC中,DLM SRAM虽然主要用于存放数据,但是其地址区间也可以被用来存放指令。处理器核可以通过SoC的系统存储总线访问到DLM。

  • ROM挂载在系统存储总线上,其特性如下。

    • 大小为4KB。

    • 默认仅存放了一条跳转指令,将直接跳转至ILM的起始地址位置开始执行。

4.2. 片外Flash存储资源

N100系列内核配套SoC的片外存储资源主要为Flash存储器,其要点如下:

  • 外部Flash可以利用其XiP(Execution in Place)模式,通过QSPI0被映射为一片只读的地址区间,地址区间为0x2_0000 \~ 0x3_FFFF。

  • 用户可以通过调试器将开发的程序烧写在Flash中,然后利用Flash的XiP模式,程序可以直接从Flash中被执行。见中文书籍《RISC-V架构与嵌入式开发快速入门》第6章,了解QSPI0和Flash XiP模式的更多信息。

5. N100系列内核配套SoC地址分配

N100系列内核配套SoC的总线地址分配如表 5‑1所示。

表 5‑1 N100系列内核配套SoC地址分配表

总线分组 组件 地址区间 描述
Core内部私有 DEBUG 0x0_0000 \~ 0x0_0FFF 注意:调试模块(Debug Module)主要供调试器使用,普通软件程序不应该使用此区间
系统存储(MEM)接口 ROM 0x0_1000 \~ 0x0_1FFF 片上ROM模块
ILM 0x8_0000 \~ ILM地址区间,区间大小取决于ILM配置的大小。
DLM 0x9_0000 \~ DLM地址区间,区间大小取决于ILM配置的大小。
Off-Chip QSPI0 Flash Read 0x2_0000 \~ 0x3_FFFF QSPI0处于Flash XiP模式时将外部Flash映射的只读地址区间。
系统外设 GPIO 0x1_3000 \~ 0x1_3FFF GPIO地址区间。
UART0 0x1_4000 \~ 0x1_4FFF 第一个UART模块地址区间
QSPI0 0x1_5000 \~ 0x1_5FFF 第一个QSPI模块地址区间
PWM0 0x1_6000 \~ 0x1_6FFF 第一个PWM模块地址区间
UART1 0x1_7000 \~ 0x1_7FFF 第二个UART模块地址区间
QSPI1 0x1_8000 \~ 0x1_8FFF 第二个QSPI模块地址区间
PWM1 0x1_9000 \~ 0x1_9FFF 第二个PWM模块地址区间
QSPI2 0x1_A000 \~ 0x1_AFFF 第三个QSPI模块地址区间
PWM2 0x1_B000 \~ 0x1_BFFF 第三个PWM模块地址区间
I2C Master 0x1_F000 \~ 0x1_FFFF I2C Master模块地址区间
其他地址区间 表中未使用到的地址区间,均为写忽略,读返回0

6. N100系列内核配套SoC的上电流程控制

N100系列内核配套SoC中处理器核上电复位之后,可以从如下两个不同的地址进行执行程序。

  • 从外部Flash开始执行。

    • 由于映射的外部Flash(Off-Chip QSPI0 Flash Read)的地址区间位于0x2_0000 \~ 0x3_FFFF,因此如果从外部Flash开始执行,则RISC-V处理器核的PC复位值为0x20000。

    • 用户可以通过调试器将开发的程序烧写在Flash中,利用Flash的XiP模式,程序可以直接从Flash中被执行。见中文书籍《RISC-V架构与嵌入式开发快速入门》第6章,了解QSPI0和Flash XiP模式的更多信息。

    • 注意:在FPGA版本中(代码中包含了`ifdef FPGA_SOURCE),处理器会以该模式(从外部Flash开始执行)进行启动。

  • 从内部ROM开始执行。

    • 由于在N100系列内核配套SoC中内部ROM的地址区间位于0x0000_1000 \~ 0x0_1FFF,因此如果从内部ROM开始执行,则RISC-V处理器核的PC复位值为0x0_1000。

    • 在ROM中存放的代码为固定代码,执行完固定代码后,直接跳转至ILM(地址为0x8_0000)中继续执行。

    • 注意:在仿真版本中(代码中包含了`ifndef FPGA_SOURCE),处理器会以该模式(从内部ROM开始执行)进行启动。

7. N100系列内核配套SoC顶层引脚表

N100系列内核配套SoC的顶层引脚如表 7‑1所示。

表 7‑1 N100系列内核配套SoC顶层引脚

端口方向 IOF0 IOF1
Input JTAG TCK JTAG TCK信号
Output JTAG TDO JTAG TDO信号
Output JTAG_DRV_TDO JTAG TDO的输出端口使能信号
Input JTAG TMS JTAG TMS信号
Input JTAG TDI JTAG TDI信号
Bidir QSPI DQ 3 Quad SPI数据线
Bidir QSPI DQ 2 Quad SPI数据线
Bidir QSPI DQ 1 Quad SPI数据线
Bidir QSPI DQ 0 Quad SPI数据线
Output QSPI CS Quad SPI使能信号
Output QSPI SCK Quad SPI时钟信号
Bidir GPIO_0 32根GPIO 引脚
Bidir GPIO_1
Bidir GPIO_2
Bidir GPIO_3
Bidir GPIO_4
Bidir GPIO_5
Bidir GPIO_6
Bidir GPIO_7
Bidir GPIO_8
Bidir GPIO_9
Bidir GPIO_10
Bidir GPIO_11
Bidir GPIO_12
Bidir GPIO_13
Bidir GPIO_14
Bidir GPIO_15
Bidir GPIO_16
Bidir GPIO_17
Bidir GPIO_18
Bidir GPIO_19
Bidir GPIO_20
Bidir GPIO_21
Bidir GPIO_22
Bidir GPIO_23
Bidir GPIO_24
Bidir GPIO_25
Bidir GPIO_26
Bidir GPIO_27
Bidir GPIO_28
Bidir GPIO_29
Bidir GPIO_30
Bidir GPIO_31

8. N100系列内核配套SoC的GPIO引脚分配

N100系列内核配套SoC有32根GPIO引脚,这是SoC与外界连接的主要通用接口。GPIO可以通过IOF0和IOF1功能,使得SoC中的外设能够复用GPIO的32根引脚与外界进行通信,GPIO的32个I/O被SoC内部模块的复用分配如表 10‑1所示。

9. N100系列内核配套SoC的中断处理

9.1. N100系列内核的异常和中断处理

请参见《Nuclei_N100系列内核指令架构手册》了解N100系列内核的异常和中断处理机制。

9.2. IRQC管理多个外部中断

请参见《Nuclei_N100系列内核指令架构手册》了解N100系列内核的IRQC单元。

IRQC理论上可以支持高达29个外部中断源,在具体的SoC中连接的中断源个数可能不一样。IRQC在此SoC中连接了GIPO生成的29根中断作为外部中断源,其中断分配如表 9‑1所示。

表 9‑1 IRQC中断分配表

IRQC中断源编号 来源
0 gpio_0
29 gpio_28

10. N100系列内核配套SoC外设介绍

本章将对挂载在SoC的私有设备总线上的外设模块进行介绍。

10.1. GPIO

GPIO全称为General Purpose I/O,其要点如下:

  • GPIO用于提供一组32 I/O的通用输入输出接口。每个I/O可用被软件配置为输入或者输出,如果是输出可以设置具体的输出值。

  • 每个GPIO的I/O均作为一个中断源连接到IRQC的中断源接口上。

  • 每个I/O还可以被配置为IOF(Hardware I/O Functions),也就是将I/O供SoC内部的其他模块复用,譬如SPI,UART,PWM等等。GPIO的32个I/O被SoC内部模块的复用分配如表 10‑1所示,其中每个I/O均可以供两个内部模块复用,软件可以通过配置每个I/O使其选择IOF0或者IOF1来选择信号来源。

表 10‑1 GPIO接口的内部模块复用分配表

GPIO Pin 编号 IOF0 IOF1
0 PWM0_0
1 PWM0_1
2 QSPI1:SS0 PWM0_2
3 QSPI1:SD0/MOSI PWM0_3
4 QSPI1:SD1/MISO
5 QSPI1:SCK
6 QSPI1:SD2
7 QSPI1:SD3
8 QSPI1:SS1
9 QSPI1:SS2
10 QSPI1:SS3 PWM2_0
11 PWM2_1
12 I2C:SDA PWM2_2
13 I2C:SCL PWM2_3
14
15
16 UART0:RX
17 UART0:TX
18
19 PWM1_1
20 PWM1_0
21 PWM1_2
22 PWM1_3
23
24 UART1:RX
25 UART1:TX
26 QSPI2:SS
27 QSPI2:SD0/MOSI
28 QSPI2:SD1/MISO
29 QSPI2:SCK
30 QSPI2:SD2
31 QSPI2:SD3

有关此GPIO的详细介绍请参见中文书籍《RISC-V架构与嵌入式开发快速入门》第6章。

10.2. QSPI

在本SoC中,有三个QSPI 主接口,分别是:

  • Quad-SPI Flash:

    • 专用于连接外部Flash的Quad-SPI(QSPI)接口,有专用的SoC顶层引脚。

    • 并且该QSPI接口还可以被软件配置成为eXecute-In-Place(简称XIP)模式,在此模式下,Flash可以被当作一段只读区间直接被当做存储器读取。在默认上电之后,QSPI即处于该模式之下,由于Flash掉电不丢失的特性,因此可以将系统的启动程序存放于外部的Flash中,然后处理器核通过eXecute-In-Place模式的QSPI接口直接访问外部Flash加载启动程序启动。

  • QSPI:

    • 除了上述专用于Flash的QSPI接口之外,SoC还有两个独立的QSPI接口控制器。一个QSPI使用四个片选信号(Chip Selects),一个QSPI使用一个片选信号。两个QSPI均复用GPIO的顶层引脚与外界通信。

有关此QSPI的详细介绍请参见中文书籍《RISC-V架构与嵌入式开发快速入门》第6章。

10.3. UART

UART全称为Universal Asynchronous Receiver-Transmitter(通用异步接收-发射器),本SoC有两个独立的UART,两个UART均复用GPIO的顶层引脚与外界通信。

有关此UART的详细介绍请参见中文书籍《RISC-V架构与嵌入式开发快速入门》第6章。

10.4. PWM

PWM全称为Pulse-Width Modulator(脉宽调节器)。本SoC有三个独立的PWM,其中两个是16比特的精度,另外一个是8比特的精度,三个PWM均复用GPIO的顶层引脚与外界通信。

有关此PWM的详细介绍请参见中文书籍《RISC-V架构与嵌入式开发快速入门》第6章。

10.5. I2C

本SoC有一个I2C主接口,复用GPIO的顶层引脚与外界通信。有关此I2C的详细介绍请参见中文书籍《RISC-V架构与嵌入式开发快速入门》第6章。