文章来源 Macnica Engineer

在 Altera® FPGA 的 Nios® V 上实现 LED 控制 第 1 部分:硬件开发 (Quartus® Prime Standard Edition 篇)

本次实验将使用 Altera® FPGA 上的 Nios® V 处理器来实现 LED 点灯控制。目标是:当按下开发板上的按钮时,LED 点亮;松开按钮时,LED 熄灭。

整个开发过程分为硬件和软件两个部分。本文介绍硬件平台的搭建——将 Nios® V 处理器及其外围电路嵌入 FPGA;下一篇文章将介绍软件部分的开发——编写 C 语言程序并在 Nios® V 上运行。

   

一、准备工作

本次开发将使用以下工具和硬件:

Quartus® Prime 标准版或 Lite 版 (免费)

及 Risc Free 的 Altera IDE

Questa* - Altera® FPGA 版

 或 Questa - Altera® FPGA 入门版 (免费)

Cyclone® 10 LP 评估套件或 

如需考虑和购买,请联系我们。

   

二、Nios® V 开发流程

要让 Nios® V 实现“按下按钮时,LED 会亮; 松开则熄灭”的控制逻辑,主要包含两大步骤:

✔ 将 Nios® V 集成到 FPGA 中——硬件开发

✔ 为 Nios® V 创建一个程序 (C 语言) 来运行——软件开发

图1 Nios® V 系统开发流程图
图1 Nios® V 系统开发流程图

虽然这个功能用纯硬件描述语言 (HDL) 实现非常简单,但为了掌握嵌入式系统开发的标准流程,我们特意选用一个简单示例来学习 Nios® V 的使用,这也是基于 Nios® V 进行系统开发的第一步。

   

三、获取 Nios® V 许可证文件

在 Altera® FPGA 开发中使用 Nios® V 处理器IP时,无需支付许可费,但必须获得专用的许可证文件。

注意:Nios® V 包含 V/c、V/m、V/g 等多个型号。如果需要使用不同型号,请分别获取对应的许可证。

   

四、操作步骤

本次示例将完成以下硬件开发工作:

1. 在 Platform Designer 中设计 Nios® V 及其外围电路

2. 最终确定 FPGA 设计

3. 进行 RTL 仿真

4. 设置约束

5. 编译

6. 验证时序

(以下的软件部分请参考下一篇文章)

7. 生成 BSP 项目

8. 生成应用项目

9. 导入 RiscFree IDE

10. 构建/调试你的应用

11. 将 Nios® V 启动程序集成到 FPGA 的片上内存中

1. 在 Platform Designer 中设计 Nios® V 及其外围电路

1-1. 创建 Quartus® Prime 工程

在 Quartus® Prime 中选择下方菜单创建您的项目。

File 菜单 ➤ New Project Wizard

在这个示例中,我们将项目名称和顶层实体名称设置为 niosv_led_c10lp。目标设备选择了 Cyclone® 10 LP 评估套件中的10CL025YU256I7G。 

图2 Directory, Name, Top-Level Entity (New Project Wizard)
图2 Directory, Name, Top-Level Entity (New Project Wizard)

1-2. 创建 Nios® V 系统

在下方 Quartus® Prime 菜单中启动 Launch Platform Designer,开始设计 Nios® V 处理器和外围电路。

Tools 菜单 ➤ Platform Designer

本示例的的 Nios® V 系统配置如下图所示。在本示例中,Nios® V 的启动和运行内存都是片上内存。

图3 示例项目中的 Nios® V 系统配置
图3 示例项目中的 Nios® V 系统配置

1-2-1. 添加 Nios® V 处理器

从 Platform Designer 左上角的 IP Catalog 中,添加“Nios V/m Microcontroller” IP。

图4 Nios® V/m Microcontroller 参数
图4 Nios® V/m Microcontroller 参数

应用以下设置:

 • Enable Debug:On

 • Enable Reset from Debug Module:On

 • 其他选项:默认

点击 [Finish] 按钮。(此时 Messages 窗口可能会报错,请忽略,继续下一步。)

1-2-2. 添加片上内存

同样,从 IP Catalog 中添加 “On-Chip Memory (RAM or ROM)” IP,并应用以下设置:

 • Type: RAM (Writable)

 • Total memory size: 40960 bytes

 • Initialize memory content: On

 • 其他选项:默认

点击 [Finish]。

图5 片上内存 (RAM 或 ROM) 参数
图5 片上内存 (RAM 或 ROM) 参数

1-2-3. 添加 PIO

从 IP Catalog 中添加 PIO (并行 I/O),并指定总线宽度和输入/输出属性。请参考下图 (图6),分别创建用于读取按钮和驱动 LED 的两个 PIO 模块。

图6 PIO (并行输入输出) 参数
图6 PIO (并行输入输出) 参数

1-2-4. 添加 JTAG UART

调试 printf 时,创建一个 JTAG UART,通过 USB-Blaster™ II 与计算机和 JTAG 接口通信 UART。 保持默认设置的参数,然后点击 [Finish]。

图7 JTAG UART 参数
图7 JTAG UART 参数

1-2-5. 重命名每个组件

在 System Contents 选项卡中,右键点击组件的 Name 栏,选择 [Rename]。

图8 重命名每个组件
图8 重命名每个组件

本示例中的重命名方案如下:

更名前

更名后

intel_niosv_m_0

niosv_cpu

onchip_memory2_0

onchip_memory

pio_0

pb_pio

pio_1

led_pio

jtag_uart_0

jtag_uart

1-2-6. 连接组件

点击 Connections 中的白色圆圈 (〇),并将其改为黑色圆圈 (●),连接每个组件。在示例项目中,如下图所示连接:

图9 连接组件
图9 连接组件

1-2-7. 连接中断端口

要将 JTAG UART 的中断信号连接到 Nios® V,请点击 IRQ 列中 jtag_uart 的 Interrupt Sender 空心圆,使其变为实心(如上图所示)。因为只有一个中断源,其中断优先级值保持为 0 即可。

1-2-8. 配置 Nios® V 的复位矢量

双击niosv_cpu的名称部分,再次调出参数界面。在示例项目中,Nios® V 的启动和运行内存设置为片上 RAM(onchip_memory),如下图 (图10) 所示。

 • Reset Agent:onchip_memory.s1

 • Reset Offset:0x00000000

图10 在 Nios® V 中重置矢量设置
图10 在 Nios® V 中重置矢量设置

1-2-9. 将 PIO 导出到 Nios® V 系统外部端口

双击 pb_pio 和 led_pio 的 Export 栏中的 external_connection 节点,创建顶层端口。

图11 pio 的 Export
图11 pio 的 Export

1-2-10. 设定基地地址

为避免地址冲突,请执行以下菜单,让工具自动分配基地址:

 Platform Designer 中的 System 菜单 ➤ Assign Base Address

1-2-11. 保存 Nios® V 系统

要保存该平台设计的配置,选择 File 菜单 ➤ Save,命名文件,并将 qsys 文件保存到 Quartus Prime 项目文件夹。

在这个示例中,我们将保存为 niosv_system.qsys。 

图12 保存 qsys 文件
图12 保存 qsys 文件

1-2-12. 生成一个 Nios® V 系统模块

选择 Generate 菜单 ➤ Generate HDL,并在生成界面中指定合成 / 仿真 / 输出目录。 

图13 Nios® V 系统的生成
图13 Nios® V 系统的生成

[Synthesis]

Create HDL design files for synthesis:

规定了用于编译 Quartus® Prime 的逻辑合成 HDL 语言。

[Simulation]

Create simulation model:

为模型指定用于仿真的 HDL 语言。

(本例我们选择 Verilog)

<注意>

在某些版本的 Windows 中,当你选择仿真模型并运行生成时,可能会报错。

如需更多信息,请联系我们的技术支持。

[Output Directory]

Path:

指定你想生成文件的文件夹。

(本示例保持默认)

点击窗口右下角的 [Generate] 按钮,开始生成各种文件。生成完成后,关闭提示窗口,然后点击 Platform Designer 右下角的 [Finish] 关闭工具。

   

2. 最终确定 FPGA 设计

2-1. 将 Nios® V 系统应用于用户设计

将 Platform Designer 创建的系统模块集成到顶层 HDL 设计中。为了方便用户设计,Nios® V 系统在 Platform Designer 创建的文件夹里有实例辅助文件 (*_inst.vhd / *_inst.v)。 复制粘贴这些描述,然后编辑代码以完成连接。

图14 生成的 Nios® V 文件夹
图14 生成的 Nios® V 文件夹

例如,可以这样编写顶层文件:

VHDL 顶级设计示例描述    - Verilog HDL 顶级设计示例描述

在这个示例中,我们将将文件名保存为 niosv_led_c10lp.vhd / niosv_led_c10lp.v。

➤ 本示例中,将顶层文件保存为 niosv_led_c10lp.vhd 或 niosv_led_c10lp.v。

图15 保存文件 (例如 VHDL)
图15 保存文件 (例如 VHDL)

2-2. 将设计文件添加到工程

将顶层 HDL 文件和 Nios® V 系统都注册到 Quartus® Prime 工程中:

Project 菜单 ➤ Add/Remove Files in Project

请注册创建的顶层 HDL 设计 (niosv_led_c10lp.vhd 或 niosv_led_c10lp.v) 以及 Nios® V 系统的 .qip 文件 (niosv_system.qip)。

同样,为了后续在 NativeLink 中执行 RTL 仿真,请一并注册 Nios® V 系统的 .sip 文件。

图16 在项目中添加/删除文件
图16 在项目中添加/删除文件

此外,

.qip 文件生成在 Platform Designer 中创建的模块文件夹的 /synthesis 目录下。

.sip 文件生成在 Platform Designer 中创建的模块文件夹的 /simulation 目录下。

2-3. 运行分析

Processing 菜单 ➤ Start ➤ Start Analysis & Elaboration

   

3. 进行 RTL 仿真

在本示例中,我们将展示整个 Quartus Prime 项目的 RTL 仿真流程,包括 Nios® V 的软件运行。

3-1. 创建一个软件项目

首先,在 Quartus® Prime 工程目录下手动创建一个用于软件开发的文件夹,例如 software。

此外,在 software 文件夹内,可以创建一个用于应用项目 (app) 的文件夹,以及一个用于 BSP (hal_bsp) 的文件夹。 

图17 在 Quartus® Prime 项目文件夹内创建 software/app 和 software/hal_bsp 文件夹
图17 在 Quartus® Prime 项目文件夹内创建 software/app 和 software/hal_bsp 文件夹

3-1-1. 生成 BSP (板子支持包)

打开 Windows Start ➤ Altera <version.build_number> <Standard 或 Lite> Edition 文件夹,点击 Nios® V Command Shell (Quartus Prime <version>),然以启动 Nios® V 命令行界面。

在 Nios® V 命令行中输入以下命令,并指定 Quartus® Prime 项目文件夹为当前目录。

CCD:\AlteraFPGA_prj\niosv_sample

在 Nios® V 命令行中输入以下命令以启动 BSP 编辑器。

 niosv-bsp-editor

在 BSP 编辑器中,选择 File 菜单 ➤ New BSP...,然后点击“SOPC 信息文件名”栏旁边的按钮,将要使用的硬件信息 (.sopcinfo 文件) 指定给 BSP Editor。

图18 指定 BSP 编辑器/sopcinfo 文件
图18 指定 BSP 编辑器/sopcinfo 文件

编辑器界面会显示。本次示例无需修改任何配置,直接点击右下角的 [Generate]。

观察 Information 选项卡,看到 “Finished generating BSP files.” 后,点击 [Exit] 退出。

图19 BSP Generate (BSP Editor)
图19 BSP Generate (BSP Editor)

3-1-2. 生成应用项目

把预先创建的 Nios® V 启动程序 (C源文件) 移到你之前创建的 software/app 文件夹里。

presspb_led_niosv.c 示例代码 

在这个示例中,我们将文件名保存为 presspb_led_niosv.c。

然后在 Nios® V 指令行中输入以下命令:

# 生成应用项目文件
niosv-app --bsp-dir=software/hal_bsp --app-dir=software/app --srcs=software/app/presspb_led_ niosv.c --elf-name=presspb_led_niosv.elf

 

# 构建应用项目
 cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -B software/app/build/Debug -S software/app

make -C software/app/build/Debug

Nios® V 启动程序是以 .elf 形式生成的。

   

3-2. 生成 Hex 文件

在这个示例中,Nios® V 在启动时运行存储在 FPGA 内部存储器 (Nios® V 系统的片上内存) 中的程序。为了将此启动程序应用到 RTL 仿真中,请在 Nios® V 命令行中输入以下命令,将 elf 文件转换为 hex 文件: 

elf2hex app/build/<user_applicatio>.elf -o <hex_output_file>.hex -w < 片上 RAM 的数据位宽> -b <片上 RAM 的基址地址> -e <片上 RAM 的端地址>

图20 由 elf2hex 生成的 hex 文件
图20 由 elf2hex 生成的 hex 文件

示例:elf2hex software/app/build/Debug/presspb_led_niosv.elf -o software/app/niosv_system_onchip_memory.hex -w 32 -b 0x00010000 -e 0x00019FFF

<注意>

如果您在 Platform Designer 中将片上内存的初始化文件设置为默认 (Initialize memory content = On),则必须将生成的 hex 文件命名为 niosv_system_onchip_memory.hex。

如果您指定了自定义的初始化文件,请使用 -o 参数指定您需要的文件名和路径。

示例:elf2hex software/app/build/Debug/presspb_led_niosv.elf -o ocram_init/niosv_boot.hex -w 32 -b 0x00010000 -e 0x00019FFF

图21 Platform Designer 上的片上内存默认文件设置
图21 Platform Designer 上的片上内存默认文件设置

接下来,将生成的 niosv_system_onchip_memory.hex 文件复制到仿真模型的子模块目录中:

<Quartus工程目录>/<Platform Designer系统目录>/simulation/submodules

在这个示例中,我们将其复制到以下文件夹:

C:\AlteraFPGA_prj\niosv_sample\niosv_system\simulation\submodules

图22 复制 niosv_system_onchip_memory.hex 文件
图22 复制 niosv_system_onchip_memory.hex 文件

   

3-3. 配置 NativeLink 仿真

在 Quartus® Prime 上搭建一个环境来运行 NativeLink。

图23 EDA 工具选项
图23 EDA 工具选项

接下来,在下方 Quartus® Prime 菜单中配置 NativeLink 仿真。

 Assignments 菜单 ➤ Settings ➤ EDA Tool Settings ➤ Simulation

 项目名称 配置内容

 Tool name

选择用于仿真的 EDA 工具

(本示例使用 Questa-Altera FPGA 版)

 Format for output netlist

选择 Verilog HDL

(即使是 VHDL 设计,也请在此注明 Verilog)

 Output directory

保持默认 (simulation/<tool_name>)

图24 EDA Tool Settings - Simulation 上半部分

 Compile test bench

为用户搭建一个测试平台

VHDL测试台示例说明

Verilog HDL测试台示例说明

图25 EDA Tool Settings - Simulation 下半部分

   

3-4. 使用 NativeLink 运行 RTL 仿真

Tools 菜单 ➤ Run Simulation Tool ➤ RTL Simulation

图26 运行 RTL 仿真
图26 运行 RTL 仿真
  • 运行 RTL Simulation 之前,必须已经执行过 Analysis & ElaborationAnalysis & SynthesisFitter
  • 请勿执行 Start Compilation,因为它会自动调用 EDA Netlist Writer,可能导致无法生成正确的 RTL 仿真脚本。
  • 如果不小心运行了全编译,请在重新运行 RTL Simulation 之前,再次执行 Analysis & Elaboration 等步骤。

仿真启动后,会打开 Questa 软件的 Wave 窗口。

图27 Questa - Altera FPGA 版 Wave 窗口
图27 Questa - Altera FPGA 版 Wave 窗口

确认行为符合预期后,退出仿真并使用 Questa - Altera FPGA 版。

<注意>

在本示例中,通过仿真可以确认:按下按钮时,Nios® V 会向 LED 对应的 PIO 写入 0xF 以点亮 LED;松开按钮时,Nios® V 会向 LED 对应的 PIO 写入 0x0以熄灭LED。

此外,还可以确认在 presspb_led_niosv.c 中指定的 alt_printf 函数 “Hello from Nios V !!” 已显示在 Transcript 窗口中。

验证无误后,退出仿真:

➤➤Questa - Altera FPGA  Simulate 菜单 ➤ End Simulation,File 菜单 ➤ Quit

➤➤➤最后,回到 Quartus® Prime,将仿真工具改回 <none>:
Assignments 菜单 ➤ Settings ➤ EDA Tool Settings ➤ Simulation将 Tool name 设为 <none>。

[参考]

如果不使用 NativeLink,而是在 Questa (包括 Altera FPGA Edition) 中进行仿真,请自定义 Platform Designer 生成的文件夹中的仿真脚本文件 msim_setup.tcl。

Nios V系统目录/simulation/mentor/msim_setup.tcl

   

4. 设置约束

4-1. 设置引脚分配

启动 Quartus® Prime 的 Assignments 菜单➤ Pin Planner,将顶层设计中的端口分配到 FPGA 的物理引脚上。

对于 Cyclone® 10 LP 评估套件,引脚设置如下:

图28 Pin Planner: All Pins List
图28 Pin Planner: All Pins List

4-2. 设定时序约束

Nios® V 系统的 SDC 会在生成 qip 文件时 (操作 1-2-12. 生成 Nios® V 系统的模块) 自动生成,并在注册 qip 文件的同时应用于 Timing Analyzer (Assignments 菜单 ➤ Settings)。

图29 项目中注册的 Nios® V 的 SDC 文件
图29 项目中注册的 Nios® V 的 SDC 文件

此外,还需针对用户设计创建时序约束,并将其同样注册到项目中。

由于本次样品的规格要求在 50MHz 时钟供电下运行,因此需编写包含时钟定义命令的 SDC 文件,并将其添加到项目中。

niosv_led_c10lp.SDC 示例说明

在这个示例中,我们将文件名保存为 niosv_led_c10lp.sdc。

<注意>

虽然在此示例中,用户设计用的 SDC 文件原本也需要包含 I/O 约束,但由于输入信号 (用户按下或松开按钮) 和输出信号 (LED 点亮或熄灭)的速度极慢,因此此处省略了 I/O 时序约束。

图30 SDC 文件 (示例)
图30 SDC 文件 (示例)

   

5. 编译

执行以下菜单,开始编译:

Processing 菜单 ➤ Start Compilation

编译过程会进行逻辑综合、布局布线,并最终生成用于烧录到 FPGA 的比特流文件 (.sof)。编译结束后,请查看生成的 Compilation Report。

图31 Start Compilation
图31 Start Compilation

   

6. 验证时序

在 Compilation Report 中,展开 Timing Analyzer 文件夹,查看时序分析结果。你可以看到每个时序模型都已通过时钟频率约束。

图32 时序分析报告
图32 时序分析报告

至此,硬件设计部分已全部完成。即使将 Quartus Prime 编译生成的 sof 文件传输到 FPGA,由于内部的 Nios® V 尚无可执行的程序,因此即使按下评估板上的按钮 [PB3],LED 仍保持熄灭状态。

   

五、总结

本文主要介绍了基于 Altera FPGA 的 Nios® V 处理器硬件系统开发流程。我们使用 Platform Designer 完成了 Nios® V 处理器、片上内存、PIO 和 JTAG UART 等组件的系统集成,生成了顶层 HDL 设计,设置了引脚与时序约束,并通过 RTL 仿真验证了硬件与软件的联合行为,最终成功编译出 FPGA 配置文件 (.sof)。在下一篇文章中,我们将基于本文构建的硬件系统,进行 Nios® V 的软件开发。

 

欲了解关于更多 Altera 相关方案或技术信息,请与骏龙科技当地的办事处联系或点击下方「联系我们」,提交您的需求,骏龙科技公司愿意为您提供更详细的技术解答。

更多信息: