【 Intel/Altera FPGA技术实战 】Stratix 10 Nios V 工程搭建(一)
一、前言
最近使用Altera Stratix 10 SOC器件做项目开发,需要用Nios软核CPU做一些寄存器控制操作,结果Quartus Prime24.1之后版本的工具已经不支持Nios II processor IP,具体请参考:1. AN 1009: Preserving Nios II Processor IP for Quartus Prime Version 24.1 and Newer • AN 1009: Preserving Nios II Processor IP for Quartus Prime Version 24.1 and Newer • Altera Documentation and Resources Center,后续版本必须使用Nios V,而且Altera所有类型的FPGA都支持Nios V,那么我们就有必要了解和练习使用Nios V,这样才能加速我们的项目开发。
这里先给大家简要介绍Nios V,再手把手搭建Nios V的demo工程,希望对大家有所帮助。
二、前期准备
- 系统:Windows 11;
- 安装EDA工具:Quartus Prime Pro 25.1.1;
- Ashling RiscFree IDE,Quartus安装时选择即可,具体请见下图;

三、Nios V介绍
这部分内容具体请参考:1. Overview • Nios V Processor Reference Manual • Altera Documentation and Resources Center
1. Nios V processor IP是什么:Altera FPGA通过逻辑电路实现的RISC_V架构的软核CPU,该IP不包括外设和外设的连接逻辑,只有软核CPU的电路部分,Nios V与FPGA的关系如下图所示:

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

3. 由上图可知,由左至右性能越来越强,相应的生成软核IP所需的FPGA逻辑资源也随之增多,所以需要根据实际场景选择合适的Nios V,如果需要跑系统或者控制交互的性能要求比较高,建议选择Nios V/g或者HPS;如果是裸板程序实现简单控制功能,建议选择Nios V/m;
4. 接下来我们就来搭建一个Nios V/m IP的demo工程,一起熟悉一下Nios V的使用;
四、Nios V工程搭建
1. Quartus工具:先新建工程,再打开Platform Designer,请参考下图,使用的器件型号是1SX110HN2,Quartus工程是niosv_top.qpf,在工程路径下创建niosv_top.qsys;

2. 在Platform Designer界面搜索并添加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. 在Platform Designer界面搜索并添加Nios V/m Processor IP,Reset Agent选择onchip_memory_0.s1,其余保持默认;

4. 在Platform Designer界面搜索并添加JTAG UART IP,设置保持默认,该IP可以通过JTAG输出log信息,便于系统调试;

5. 在Platform Designer界面搜索并添加Reset Release IP,选择Reset interface,Altera建议使用该IP来控制系统上电到系统IDLE之间的复位;

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


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

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

9. 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 ); endmodule10. 添加时序约束文件niosv_top.sdc,该工程比较简单,只需要告诉EDA工具主时钟即可,最终的工程文件列表如下图:
create_clock -name clk -period 20.0 [get_ports clk_clk]
11. 进行Analysis & Synthesis,然后在Pin Planner界面分配管脚;
12. 在【Assignments】->【Device】-> 【Device and Pin Options】-> 【Configuration】配置SDM PIN,这里建议结合自己硬件板级资源进行设置;

13. 在【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_intel_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