在 Altera® FPGA 的 Nios® V 上实现 LED 控制 第 2 部分:软件开发 (Quartus® Prime Standard Edition 篇)
在《在 Altera® FPGA 的 Nios® V 上实现 LED 控制 第 1 部分:硬件开发 (Quartus® Prime Standard Edition 篇)》中,我们完成了硬件平台的搭建,包括在 Platform Designer 中设计 Nios® V 系统、完成 FPGA 顶层设计、设置约束并编译生成硬件配置文件 (.sof)。本文将继续介绍软件开发部分。
一、Nios® V 开发流程
二、操作步骤
1. 在 Platform Designer 中设计 Nios® V 及其外围电路
2. 最终确定 FPGA 设计
3. 进行 RTL 仿真
4. 设置约束
5. 编译
6. 验证时序
<*本文将介绍以下步骤 >
7. 生成 BSP 项目
8. 生成应用项目
9. 导入 RiscFree IDE
10. 构建/调试你的应用
11. 将 Nios® V 启动程序集成到 FPGA 的片上内存中
说明:步骤 7、8 及步骤 10 (仅构建部分) 在上篇的“3. RTL 仿真”中已经部分执行。考虑到硬件开发和软件开发可能由不同人员完成,这里仍然完整介绍整个流程。如果您已按照上篇流程执行过,可根据实际情况自行判断是否跳过。
7. 生成 BSP
首先,在 Quartus® Prime 工程目录下手动创建一个用于软件开发的文件夹,在本示例中,将创建名为 software 的文件夹。此外,还需在 software 文件夹内分别创建应用程序项目文件夹 (app) 和 BSP 文件夹 (hal_bsp)。
要生成 BSP (板子支持包),请打开 Windows 的“开始”菜单 ➤ Altera <version.build_number> <Standard or Lite> Edition 文件夹,然后单击“Nios V Command Shell (Quartus Prime <版本>)”以启动 Nios V 命令行界面。
在 Nios V 命令行界面中输入以下命令,并指定 Quartus® Prime 项目文件夹为当前目录。
cd C:\AlteraFPGA_prj\niosv_sample
在 Nios V 命令行界面中输入以下命令,并启动 BSP 编辑器。
niosv-bsp-editor
在 BSP 编辑器中,选择 File 菜单 ➤ New BSP...,点击 SOPC Information File Name 旁的按钮,选择硬件信息文件 (.sopcinfo),然后点击 OK。
此时将显示 BSP Editor 的图形用户界面。在本示例中,我们不进行编辑,而是点击 GUI 右下角的 [Generate]。确认“Information”选项卡中显示“Finished generating BSP files.”后,点击 [Exit]。
8. 生成应用项目
将预先准备好的 Nios® V 启动程序 (C 源文件) 移动到 software/app 文件夹中。
在这个示例中,将文件名保存为 presspb_led_niosv.c。
接着,在 Nios V Command Shell 中输入以下命令:
# 生成应用项目文件
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=调试 -B 软件/应用/构建/调试 -S 软件/应用
完成后,输入 exit 关闭命令行窗口。
9. 导入 RiscFree IDE
打开 Windows 的“开始”菜单 ➤ 打开 Altera <version.build_number> <Standard 或 Lite> Edition文件夹,点击 Ashling RiscFree IDE for Altera (Quartus Prime <版本>),启动 RiscFree IDE。
通过 [Browse] 按钮指定软件开发的工作区 software 文件夹,然后单击 [Launch] 按钮。RiscFree IDE 的图形用户界面将启动。
在 RiscFree IDE 中,依次选择文件 File 菜单 ➤ New ➤ Project,在弹出的窗口中选择“C/C++ 项目” (位于 C/C++ 文件夹内) ,然后点击 [Next] 按钮。
在显示的“New C/C++ Project”窗口中,从左侧窗格中选择“All”,从右侧窗格中选择“C++ Managed Build”,然后单击 [Next] 按钮。
在显示的 C++ Project 窗口中,设置以下项目:
Project name: app
Project type: CMake driven > Empty Project
Toolchains: CMake driven
10. 构建和调试应用程序
10-1. 构建应用程序
在 RiscFree IDE 的 Project Explorer 中,右键点击 app 项目,选择 Build Project。
C 源代码构建完成后,会在 app/build/Debug/ 目录下生成可执行文件 .elf。
10-2. 调试应用程序
在评估板上通过 FPGA 运行由“Build Project”生成的 elf 文件,并验证其运行情况。
10-2-1. FPGA 配置
将硬件程序 sof 文件下载到 FPGA 中。
<注意>
使用 Cyclone® 10 LP 评估套件的用户,请预先将 DIP 开关 SW1 中的 SW1.4 设置为“On”。此外,使用该板时,请先安装 USB-Blaster II 的设备驱动程序。
对于 Cyclone® 10 LP 评估套件附带的线缆,请先将 mini USB (Type-B) 接口连接至评估板,然后将 USB 线缆中的黑色连接器连接至计算机。此时,评估板将获得电源供电。
在 Quartus® Prime 的菜单中启动 Programmer:Tools 菜单 ➤ Programmer。点击 Programmer 窗口中的 Hardware Setup 按钮,选择Cyclone 10 LPEvaluation Kit。
在“Programmer”窗口的“Mode”下拉列表中,选择“JTAG”。“File”栏中已注册了通过 Quartus Prime 编译生成的 niosv_led_c10lp.sof 文件,而“Device”栏中则显示了项目中指定的 FPGA 型号 (本示例中为 10CL025YU256)。
<注意>
如果 sof 文件没有注册,点击 Add File 按钮,选择 //Quartus® Prime 项目文件夹 /output_files/niosv_led_c10lp.sof,然后点击 Open 按钮将其注册到 File 栏中。或者,如果注册了另一个 sof 文件,选择该文件并点击 Change File 按钮,重新指定 //Quartus® Prime 项目文件夹 /output_files/niosv_led_c10lp.sof。
在“Programmer”窗口中,勾选“niosv_led_c10lp.sof”行右侧的“Program/Configure”选项,然后单击 [Start] 按钮,下载硬件程序。
当进度条达到 100%,且 Quartus 的 Messages 窗口中显示“Info: Successfully performed operation(s)”时,下载完成。
10-2-2. 注册 juart-terminal
由于 RiscFree IDE 本身不具备作为 UART 终端的 JTAG 控制台,因此需要注册外部工具来使用 JTAG 控制台。请从以下菜单中启动“External Tools Configurations”。
Run 菜单 ➤ External Tools Configurations...
在“External Tools Configurations”界面中,选中左侧的“Program”,然后点击左上角的“New launch confiurations”图标。
在显示的图形界面中,注册 juart-terminal。
Name:juart-terminal
Location:juart-terminal.exe (使用 [Browse File System...] 按钮)
例如 C:\altera\24.1std\quartus\bin64\juart-terminal.exe
Working Directory:点击 [Browse Workspace...] 按钮,在文件夹选择窗口中选择应用
点击“External Tools Configurations”右下角的 [Apply] 按钮以保存设置,然后点击 [Run] 按钮执行操作。
10-2-3. 启动Run Configuration
要将软件的 elf 文件下载到 Cyclone® 10 LP 评估套件的 FPGA中,请右键点击应用项目并选择下方菜单。
Run As ➤ Run configurations...
在“Run configurations”窗口中,双击“Ashling RISC-V Hardware Debugging”。点击“Main”选项卡中的 [Search Project...] 按钮,在“Program Selection”窗口中选择 presspb_led_niosv.elf,然后点击 [OK] 按钮。
在“Main”标签页中,确保以下信息被反映出来。
Name:输入任意名称示例:app Debug)
Project:app
C/C++ 应用程序:build/Debug/presspb_led_niosv.elf
切换到“Debugger”标签页,点击 [Auto-detect Scan Chain] 按钮,确认“Device/Tap selection”栏中检测到了 10CL025(Y|Z),然后点击右下角的 [Apply] 按钮。
10-2-4. 运行程序
点击 Run Configuration 窗口右下角的 [Run] 按钮。程序运行后,RiscFree IDE 的控制台将显示 alt_printf 函数中指定的“Hello from Nios V !!”。此外,按下评估板上的按钮 [PB3] 会点亮四个 LED 灯,松开 [PB3] 则关闭所有 LED 灯。
确认操作完成后,在 RiscFree IDE 控制台点击 ■ 按钮关闭程序。选择 RiscFreeIDE 中的“File 菜单➤Exit”以结束 RiscFree IDE 进程。
11. 将 Nios® V 启动程序集成到 FPGA 的片上内存上
程序运行正常后,可以将其固化到片上内存中,使 FPGA 配置后自动运行。
11-1. 将 Nios® V 启动程序转换为 hex 文件
打开 Windows Start ➤ Altera <version.build_number> <Standard 或Lite> Edition 文件夹,点击 Nios V Command Shell (Quartus Prime <版本>),重新启动 Nios V command shell。
在 Nios Vcommand shell 中输入以下命令,并指定 Quartus® Prime 项目文件夹为当前目录。
cd C: \AlteraFPGA_prj\niosv_sample
接下来,输入以下命令,将 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。
如果“Enable non-default initialization file = On”且指定了非默认文件,请在 elf2hex 命令中使用 -o 选项指定目标文件名及路径。
例如) elf2hex software/app/build/Debug/presspb_led_niosv.elf -o ocram_init/niosv_boot.hex -w 32 -b 0x00010000 -e 0x00019FFF
11-2. 创建 meminit.qip,添加到 Quartus® Prime 项目中并编译
<注意>
如果在 Platform Designer 中创建的片上内存初始值设置指定了一个非默认文件 (即 Enable non-default initialization file = On) ,则无需创建meminit.qip。因此,请跳过步骤①~③。
① 为了将刚才创建的 Nios® V 启动程序的 hex 文件作为 FPGA 内置内存 (Nios® V 系统的片上内存) 的初始值,请将以下约束条件填写到文本文件中。
set_global_assignment -name SEARCH_PATH $::quartus (qip_path)
(- meminit.qip 示例描述)
② 将文件命名为 meminit.qip,并保存到与 Nios® V 启动程序中 hex 文件相同的文件夹中。
③ 在 Quartus® Prime 中使用下方菜单,将 meminit.qip 添加到项目中。
Project 菜单 ➤ Add/Remove Files in Project
④ 在 Quartus® Prime 执行编译。
Processing 菜单 ➤ Start Compilation
编译完成后,会生成包含 Nios® V Boot 程序的 .sof 文件。
11-3. 烧录并验证
使用 Quartus Prime Programmer 烧录新的 .sof 文件。再次按下按钮 [PB3],LED 应正常点亮和熄灭。
至此,Nios® V 的启动程序已成功固化到 FPGA 中。如需生成用于配置 ROM 的编程文件 (.pof 或 .jic),可使用 Quartus Prime 的 Convert Programming Files 工具从 .sof 转换。
三、Nios® V 启动程序快速更新方法
如果 FPGA 的硬件设计没有变化,仅需更新 Nios® V 的启动程序 (即片上内存的初始化数据),则必须重新执行 Quartus® Prime 的编译。不过,其实有一种方法无需进行完整编译,仅需更新片上内存的初始化数据即可!
请注意,这种方法需满足以下三个条件。
・ 已通过 Memory Initialization 参数设置 Platform Designer 中创建的片上存储器的初始值
・ 在“Project 菜单 ➤ Add/Remove Files in Project”中已注册 meminit.qip 文件 (※仅当 Initializememory content = On 时)
・ 已在 Quartus® Prime 中执行了完整编译
快速更新步骤
① 更改 Nios® V 启动程序的内容。
② 打开 Windows 的“开始”菜单 ➤ Altera <version.build_number> <Standard 或 Lite> Edition 文件夹,点击 Nios V Command Shell (Quartus Prime <version>),启动 Nios V 命令行界面。
③ 输入下面的命令,指定 Quartus® Prime 项目文件夹为当前目录。
cd C:\AlteraFPGA_prj\niosv_sample
④ 输入下面的命令,运行 C 源代码构建,生成 .elf 文件。
make -C software/app/build/Debug
⑤ 输入下面的命令,将 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 中设置片上内存 (On-Chip Memory) 的初始值时,如果通过“Enable non-default initialization file = On”指定了非默认文件,请在 elf2hex 命令中使用 -o 选项指定目标文件名及路径。
例如) elf2hex software/app/build/Debug/presspb_led_niosv.elf -o ocram_init/niosv_boot.hex -w 32 -b 0x00010000 -e 0x00019FFF
⑥ 在 Quartus® Prime 中,使用下方菜单仅更新 FPGA 内置内存的初始数据部分。
Processing 菜单 ➤ Update Memory Initialization File
⑦ Quartus® Prime 中的以下菜单生成更新后的 .sof 文件,包含 FPGA 内部内存的初始值数据部分。
Processing 菜单 ➤ Start ➤ Start Assembler
请使用生成的 (或更新的) .sof 文件,重新生成 .pof 和 .jic 文件。
示例项目
为了方便参考,我们提供了已执行步骤 1~2 (硬件设计) 的 Quartus Prime 工程文件 (.qar)。请根据需要下载。
- Cyclone® 10 评估套件 Nios® V 搭配 L-Chika Quartus® Prime 示例项目 [VHDL] (Quartus® Prime 标准版)
- Cyclone® 10 评估套件 Nios® V 搭配 L Chika Quartus® Prime 示例项目 [Verilog HDL] (Quartus® Prime 标准版)
<注意>
· 本示例项目使用 Quartus® Prime 标准版 24.1 创建。
· 使用前请在 Platform Designer 中打开 niosv_system.qsys,运行生成 HDL,再进行后续操作。
四、总结
本文主要介绍了基于上篇已完成的 Nios® V 硬件系统,进行软件开发的完整流程。我们使用 Nios® V Command Shell 生成了 BSP 和应用程序项目,在 RiscFree IDE 中完成了代码的构建、调试与运行验证,最后将 Nios® V 启动程序固化到 FPGA 片上内存中,并介绍了仅更新软件程序的快速方法。
至此,从硬件系统搭建到软件程序固化,完整的 LED 点灯实验已经全部完成。您可以在自己的 FPGA 开发板上复现这一流程,并以此为基础扩展更复杂的 Nios® V 应用。
欲了解关于更多 Altera 相关方案或技术信息,请与骏龙科技当地的办事处联系或点击下方「联系我们」,提交您的需求,骏龙科技公司愿意为您提供更详细的技术解答。
相关阅读
《在 Altera® FPGA 的 Nios® V 上实现 LED 控制 第 1 部分:硬件开发 (Quartus® Prime Standard Edition 篇)》
更多信息: