在 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 入门版 (免费)
如需考虑和购买,请联系我们。
二、Nios® V 开发流程
要让 Nios® V 实现“按下按钮时,LED 会亮; 松开则熄灭”的控制逻辑,主要包含两大步骤:
✔ 将 Nios® V 集成到 FPGA 中——硬件开发
✔ 为 Nios® V 创建一个程序 (C 语言) 来运行——软件开发
虽然这个功能用纯硬件描述语言 (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。
1-2. 创建 Nios® V 系统
在下方 Quartus® Prime 菜单中启动 Launch Platform Designer,开始设计 Nios® V 处理器和外围电路。
Tools 菜单 ➤ Platform Designer
本示例的的 Nios® V 系统配置如下图所示。在本示例中,Nios® V 的启动和运行内存都是片上内存。
1-2-1. 添加 Nios® V 处理器
从 Platform Designer 左上角的 IP Catalog 中,添加“Nios V/m Microcontroller” IP。
应用以下设置:
• 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]。
1-2-3. 添加 PIO
从 IP Catalog 中添加 PIO (并行 I/O),并指定总线宽度和输入/输出属性。请参考下图 (图6),分别创建用于读取按钮和驱动 LED 的两个 PIO 模块。
1-2-4. 添加 JTAG UART
调试 printf 时,创建一个 JTAG UART,通过 USB-Blaster™ II 与计算机和 JTAG 接口通信 UART。 保持默认设置的参数,然后点击 [Finish]。
1-2-5. 重命名每个组件
在 System Contents 选项卡中,右键点击组件的 Name 栏,选择 [Rename]。
本示例中的重命名方案如下:
更名前 | 更名后 |
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 中的白色圆圈 (〇),并将其改为黑色圆圈 (●),连接每个组件。在示例项目中,如下图所示连接:
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
1-2-9. 将 PIO 导出到 Nios® V 系统外部端口
双击 pb_pio 和 led_pio 的 Export 栏中的 external_connection 节点,创建顶层端口。
1-2-10. 设定基地地址
为避免地址冲突,请执行以下菜单,让工具自动分配基地址:
Platform Designer 中的 System 菜单 ➤ Assign Base Address
1-2-11. 保存 Nios® V 系统
要保存该平台设计的配置,选择 File 菜单 ➤ Save,命名文件,并将 qsys 文件保存到 Quartus Prime 项目文件夹。
在这个示例中,我们将保存为 niosv_system.qsys。
1-2-12. 生成一个 Nios® V 系统模块
选择 Generate 菜单 ➤ Generate HDL,并在生成界面中指定合成 / 仿真 / 输出目录。
[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)。 复制粘贴这些描述,然后编辑代码以完成连接。
例如,可以这样编写顶层文件:
- VHDL 顶级设计示例描述 - Verilog HDL 顶级设计示例描述
在这个示例中,我们将将文件名保存为 niosv_led_c10lp.vhd / niosv_led_c10lp.v。
➤ 本示例中,将顶层文件保存为 niosv_led_c10lp.vhd 或 niosv_led_c10lp.v。
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 文件。
此外,
.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) 的文件夹。
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。
编辑器界面会显示。本次示例无需修改任何配置,直接点击右下角的 [Generate]。
观察 Information 选项卡,看到 “Finished generating BSP files.” 后,点击 [Exit] 退出。
3-1-2. 生成应用项目
把预先创建的 Nios® V 启动程序 (C源文件) 移到你之前创建的 software/app 文件夹里。
在这个示例中,我们将文件名保存为 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 的端地址>
示例: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
接下来,将生成的 niosv_system_onchip_memory.hex 文件复制到仿真模型的子模块目录中:
<Quartus工程目录>/<Platform Designer系统目录>/simulation/submodules
在这个示例中,我们将其复制到以下文件夹:
C:\AlteraFPGA_prj\niosv_sample\niosv_system\simulation\submodules
3-3. 配置 NativeLink 仿真
在 Quartus® Prime 上搭建一个环境来运行 NativeLink。
接下来,在下方 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 | 为用户搭建一个测试平台 |
图25 EDA Tool Settings - Simulation 下半部分 | |
3-4. 使用 NativeLink 运行 RTL 仿真
Tools 菜单 ➤ Run Simulation Tool ➤ RTL Simulation
- 运行 RTL Simulation 之前,必须已经执行过 Analysis & Elaboration、Analysis & Synthesis 或 Fitter。
- 请勿执行 Start Compilation,因为它会自动调用 EDA Netlist Writer,可能导致无法生成正确的 RTL 仿真脚本。
- 如果不小心运行了全编译,请在重新运行 RTL Simulation 之前,再次执行 Analysis & Elaboration 等步骤。
仿真启动后,会打开 Questa 软件的 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 评估套件,引脚设置如下:
4-2. 设定时序约束
Nios® V 系统的 SDC 会在生成 qip 文件时 (操作 1-2-12. 生成 Nios® V 系统的模块) 自动生成,并在注册 qip 文件的同时应用于 Timing Analyzer (Assignments 菜单 ➤ Settings)。
此外,还需针对用户设计创建时序约束,并将其同样注册到项目中。
由于本次样品的规格要求在 50MHz 时钟供电下运行,因此需编写包含时钟定义命令的 SDC 文件,并将其添加到项目中。
在这个示例中,我们将文件名保存为 niosv_led_c10lp.sdc。
<注意>
虽然在此示例中,用户设计用的 SDC 文件原本也需要包含 I/O 约束,但由于输入信号 (用户按下或松开按钮) 和输出信号 (LED 点亮或熄灭)的速度极慢,因此此处省略了 I/O 时序约束。
5. 编译
执行以下菜单,开始编译:
Processing 菜单 ➤ Start Compilation
编译过程会进行逻辑综合、布局布线,并最终生成用于烧录到 FPGA 的比特流文件 (.sof)。编译结束后,请查看生成的 Compilation Report。
6. 验证时序
在 Compilation Report 中,展开 Timing Analyzer 文件夹,查看时序分析结果。你可以看到每个时序模型都已通过时钟频率约束。
至此,硬件设计部分已全部完成。即使将 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 相关方案或技术信息,请与骏龙科技当地的办事处联系或点击下方「联系我们」,提交您的需求,骏龙科技公司愿意为您提供更详细的技术解答。
更多信息: