前言
最近使用 Altera Stratix 10 SOC 器件做项目开发,需要用 Nios 软核 CPU 做一些寄存器控制操作。Quartus Prime 24.1 之后版本的工具已不支持 Nios II processor IP,具体请参考:AN 1009: Preserving Nios II Processor IP for Quartus Prime Version 24.1 and Newer。后续版本必须使用 Nios V,且 Altera 所有类型的 FPGA 都支持 Nios V。
前期准备
- 系统:Windows 11;
- EDA 工具:Quartus Prime Pro 25.1.1;
- Ashling RiscFree IDE:Quartus 安装时选择即可。

Nios V 介绍
详细内容请参考:Overview • Nios V Processor Reference Manual
1. Nios V processor IP 是什么
Altera FPGA 通过逻辑电路实现的 RISC-V 架构的软核 CPU,该 IP 不包括外设和外设的连接逻辑,只有软核 CPU 的电路部分。

2. Nios V processor IP 分类
分为 Nios V/c、Nios V/m 和 Nios V/g 三种 IP。
- Nios V/c Processor:基于 RISC-V RV32I 指令集的紧凑型软核 CPU,指令和数据公用 128 KB on-chip memory;
- Nios V/m Processor:基于 RISC-V 指令集的微控制器软核 CPU,支持五级 Pipelined 和 Non-pipelined 两种配置,指令和数据公用 128 KB on-chip memory;
- Nios V/g Processor:基于 RISC-V RV32IMZicsr 指令集的通用软核 CPU,支持五级 Pipelined,指令和数据公用 128 KB on-chip memory,指令和数据各有 4KB 的 cache。

由上图可知,由左至右性能越来越强,相应的生成软核 IP 所需的 FPGA 逻辑资源也随之增多。如果需要跑系统或者控制交互的性能要求比较高,建议选择 Nios V/g 或者 HPS;如果是裸板程序实现简单控制功能,建议选择 Nios V/m。
Nios V 工程搭建
1. Quartus 工具
先新建工程,再打开 Platform Designer。使用的器件型号是 1SX110HN2,Quartus 工程是 niosv_top.qpf,在工程路径下创建 niosv_top.qsys。

2. 添加 On-Chip Memory II (RAM or ROM) IP
该 IP 就是 Nios V 的 on-chip memory,需要存放指令和数据以保证系统的性能和实时性。

这里 memory size 配置为 256KB,选择'Enable non-default initialization file'并把 initialization file 更改为 hello.hex(软件 demo 工程为 hello.c),其余设置保持默认。
3. 添加 Nios V/m Processor IP
Reset Agent 选择 onchip_memory_0.s1,其余保持默认。

4. 添加 JTAG UART IP
设置保持默认,该 IP 可以通过 JTAG 输出 log 信息,便于系统调试。

5. 添加 Reset Release IP
选择 Reset interface,Altera 建议使用该 IP 来控制系统上电到系统 IDLE 之间的复位。

6. 设置默认的时钟 Clock Bridge IP 和复位 Reset Bridge IP
这里设置时钟为 50MHz(建议结合板载硬件资源设置),复位为低有效。

7. 连接各组件的接口信号
具体请参考下图。

8. 分配外设基地址
连接完成后,在【System】-> 【Assign Base Address】分配外设基地址,整个系统的连接如下图所示。

9. 搭建系统顶层 top 模块
Generate HDL 完成后,又搭建了系统顶层 top 模块。因为我的硬件板载无复位信号,且不想引入 PLL 模块,若大家板级有复位输入可以不用搭建顶层模块。
module top(
input clk_clk // 50MHz
);
niosv_top u0 (
.clk_clk(clk_clk), // input, width = 1, clk.clk
.reset_reset_n(1'b1) // input, width = 1, reset.reset_n
);
endmodule
10. 添加时序约束文件 niosv_top.sdc
该工程比较简单,只需要告诉 EDA 工具主时钟即可,最终的工程文件列表如下图。
create_clock -name clk -period 20.0 [get_ports clk_clk]

11. 管脚分配与综合
进行 Analysis & Synthesis,然后在 Pin Planner 界面分配管脚。
12. 配置 SDM PIN
在【Assignments】->【Device】-> 【Device and Pin Options】-> 【Configuration】配置 SDM PIN,这里建议结合自己硬件板级资源进行设置。

13. 配置 VID 信息
在【Assignments】->【Device】-> 【Device and Pin Options】-> 【Power Management & VID】配置 VID 信息,下面配置是 bypass VID,这里建议结合自己硬件板级资源进行设置。

14. 检查工程配置文件
配置完成后,打开工程根目录下 niosv_top.qsf 文件,该文件是 Quartus Settings File,包含了 Quartus 工程的综合、布局布线、时序、引脚、IP、文件列表等全部配置信息。
// 工程基本信息
set_global_assignment -name TOP_LEVEL_ENTITY top
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 25.1.1
set_global_assignment -name PROJECT_CREATION_TIME_DATE "16:14:38 JANUARY 26, 2026"
set_global_assignment -name LAST_QUARTUS_VERSION "25.1.1 Pro Edition"
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name MIN_CORE_JUNCTION_TEMP "-40"
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 100
set_global_assignment -name DEVICE 1SX110HN2F43I2VG
set_global_assignment -name FAMILY "Stratix 10"
set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 256
set_global_assignment -name EDA_TIME_SCALE "1 ps" -section_id eda_simulation
set_global_assignment -name EDA_OUTPUT_DATA_FORMAT "VERILOG HDL" -section_id eda_simulation
// 源文件 & IP & Platform Designer
set_global_assignment -name IP_FILE ip/niosv_top/niosv_top_clock_in.ip
set_global_assignment -name IP_FILE ip/niosv_top/niosv_top_reset_in.ip
set_global_assignment -name QSYS_FILE niosv_top.qsys
set_global_assignment -name IP_FILE ip/niosv_top/niosv_top_intel_niosv_m_0.ip
set_global_assignment -name IP_FILE ip/niosv_top/niosv_top_onchip_memory_0.ip
set_global_assignment -name IP_FILE ip/niosv_top/niosv_top_jtag_uart_0.ip
set_global_assignment -name IP_FILE ip/niosv_top/niosv_top_s10_user_rst_clkgate_0.ip
set_global_assignment -name BOARD default
set_global_assignment -name SDC_FILE niosv_top.sdc
set_global_assignment -name VERILOG_FILE src/top.v
// 引脚分配 & SDM & VID
set_location_assignment PIN_K8 -to clk_clk -comment IOBANK_3K
set_instance_assignment -name IO_STANDARD "1.8-V" -to clk_clk -entity top
set_global_assignment -name POWER_APPLY_THERMAL_MARGIN ADDITIONAL
set_global_assignment -name USE_PWRMGT_SCL SDM_IO14
set_global_assignment -name USE_PWRMGT_SDA SDM_IO11
set_global_assignment -name PWRMGT_SLAVE_DEVICE0_ADDRESS 3F
set_global_assignment -name PWRMGT_SLAVE_DEVICE1_ADDRESS 3F
set_global_assignment -name PWRMGT_SLAVE_DEVICE2_ADDRESS 3F
set_global_assignment -name PWRMGT_SLAVE_DEVICE3_ADDRESS 3F
set_global_assignment -name PWRMGT_SLAVE_DEVICE4_ADDRESS 3F
set_global_assignment -name PWRMGT_SLAVE_DEVICE5_ADDRESS 3F
set_global_assignment -name PWRMGT_SLAVE_DEVICE6_ADDRESS 3F
set_global_assignment -name PWRMGT_SLAVE_DEVICE7_ADDRESS 3F
15. 生成 sof 文件
最后综合 + 实现,在 ./output_files 路径下生成 sof 文件,说明 Nios V 工程已经搭建完成,即可开始软件开发。