修订历史
版本号 | 修订日期 | 修订的章节 | 修订的内容 |
---|---|---|---|
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章。
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总线协议信号
ICB总线主要包含2个通道。ICB总线信号列表如表 3‑1所示:
-
命令通道(Command Channel):Command Channel主要用于主设备向从设备发起读写请求。
-
返回通道(Response Channel):Response Channel主要用于从设备向主设备返回读写结果。
通道 | 方向 | 宽度 | 信号名 | 介绍 |
---|---|---|---|---|
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所示。
总线分组 | 组件 | 地址区间 | 描述 |
---|---|---|---|
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所示。
端口方向 | 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所示。
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来选择信号来源。
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章。