文章来源 Macnica Engineer

在 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 Nios® V 系统开发流程图
图1 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)。

图2 在 Quartus Prime 工程目录下创建 software 文件夹及 app、hal_bsp 子文件夹
图2 在 Quartus Prime 工程目录下创建 software 文件夹及 app、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。

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

此时将显示 BSP Editor 的图形用户界面。在本示例中,我们不进行编辑,而是点击 GUI 右下角的 [Generate]。确认“Information”选项卡中显示“Finished generating BSP files.”后,点击 [Exit]。

图4 BSP 生成 (BSP 编辑器)
图4 BSP 生成 (BSP 编辑器)

8. 生成应用项目

将预先准备好的 Nios® V 启动程序 (C 源文件) 移动到 software/app 文件夹中。

presspb_led_niosv.c 示例描述

在这个示例中,将文件名保存为 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 的图形用户界面将启动。

图5 Workspace Launcher / RiscFree IDE
图5 Workspace Launcher / RiscFree IDE

在 RiscFree IDE 中,依次选择文件 File 菜单NewProject,在弹出的窗口中选择“C/C++ 项目” (位于 C/C++ 文件夹内) ,然后点击 [Next] 按钮。 

图6 New Project
图6 New Project

在显示的“New C/C++ Project”窗口中,从左侧窗格中选择“All”,从右侧窗格中选择“C++ Managed Build”,然后单击 [Next] 按钮。

图7 New C/C++ Project
图7 New C/C++ Project

在显示的 C++ Project 窗口中,设置以下项目:

 Project name: app

 Project type:   CMake driven > Empty Project

 Toolchains:   CMake driven

图8 C++ Project
图8 C++ Project

10. 构建和调试应用程序

10-1. 构建应用程序

在 RiscFree IDE 的 Project Explorer 中,右键点击 app 项目,选择 Build Project

图9 Build Project
图9 Build Project

C 源代码构建完成后,会在 app/build/Debug/ 目录下生成可执行文件 .elf。

图10 生成的 elf 文件
图10 生成的 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

图11 Hardware Setup (Programmer)
图11 Hardware Setup (Programmer)

在“Programmer”窗口的“Mode”下拉列表中,选择“JTAG”。“File”栏中已注册了通过 Quartus Prime 编译生成的 niosv_led_c10lp.sof 文件,而“Device”栏中则显示了项目中指定的 FPGA 型号 (本示例中为 10CL025YU256)。

图12 Programmer 中下载 .sof 文件
图12 Programmer 中下载 .sof 文件

<注意>

如果 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)”时,下载完成。

图13 Configuration Successfully
图13 Configuration Successfully

10-2-2. 注册 juart-terminal

由于 RiscFree IDE 本身不具备作为 UART 终端的 JTAG 控制台,因此需要注册外部工具来使用 JTAG 控制台。请从以下菜单中启动“External Tools Configurations”。

 Run 菜单 ➤ External Tools Configurations...

图14 Run 菜单
图14 Run 菜单

在“External Tools Configurations”界面中,选中左侧的“Program”,然后点击左上角的“New launch confiurations”图标。

图15 External Tools Configurations
图15 External Tools Configurations

在显示的图形界面中,注册 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] 按钮执行操作。

图16 注册 juart-terminal
图16 注册 juart-terminal

10-2-3. 启动Run Configuration

要将软件的 elf 文件下载到 Cyclone® 10 LP 评估套件的 FPGA中,请右键点击应用项目并选择下方菜单。

 Run As  ➤ Run configurations...

图17 Run As > Run configurations
图17 Run As > Run configurations

在“Run configurations”窗口中,双击“Ashling RISC-V Hardware Debugging”。点击“Main”选项卡中的 [Search Project...] 按钮,在“Program Selection”窗口中选择 presspb_led_niosv.elf,然后点击 [OK] 按钮。

图18 选择 elf 文件
图18 选择 elf 文件

在“Main”标签页中,确保以下信息被反映出来。

Name:输入任意名称示例:app Debug)

Project:app

C/C++ 应用程序:build/Debug/presspb_led_niosv.elf

图19 Main 标签页 (Run Configurations)
图19 Main 标签页 (Run Configurations)

切换到“Debugger”标签页,点击 [Auto-detect Scan Chain] 按钮,确认“Device/Tap selection”栏中检测到了 10CL025(Y|Z),然后点击右下角的 [Apply] 按钮。

图20 Debugger 标签页 (Run Configurations)
图20 Debugger 标签页 (Run Configurations)

10-2-4. 运行程序

点击 Run Configuration 窗口右下角的 [Run] 按钮。程序运行后,RiscFree IDE 的控制台将显示 alt_printf 函数中指定的“Hello from Nios V !!”。此外,按下评估板上的按钮 [PB3] 会点亮四个 LED 灯,松开 [PB3] 则关闭所有 LED 灯。

图21 Console 输出与开发板 LED 状态
图21 Console 输出与开发板 LED 状态

确认操作完成后,在 RiscFree IDE 控制台点击 ■ 按钮关闭程序。选择 RiscFreeIDE 中的“File 菜单➤Exit”以结束 RiscFree IDE 进程。 

图22 RiscFree IDE 控制台关闭按钮
图22 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

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

接下来,输入以下命令,将 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。因此,请跳过步骤①~③。 

图24 On-Chip Memory 初始化文件设置
图24 On-Chip Memory 初始化文件设置

① 为了将刚才创建的 Nios® V 启动程序的 hex 文件作为 FPGA 内置内存 (Nios® V 系统的片上内存) 的初始值,请将以下约束条件填写到文本文件中。

set_global_assignment -name SEARCH_PATH $::quartus (qip_path)

(-  meminit.qip 示例描述)

② 将文件命名为 meminit.qip,并保存到与 Nios® V 启动程序中 hex 文件相同的文件夹中。

图25 工程中已添加 meminit.qip 的文件列表
图25 工程中已添加 meminit.qip 的文件列表

③ 在 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 应正常点亮和熄灭。

图26 在 Quartus® Prime 的 Programmer 中下载 .sof 文件
图26 在 Quartus® Prime 的 Programmer 中下载 .sof 文件

至此,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

图27 Update Memory Initialization File
图27 Update Memory Initialization File

⑦ Quartus® Prime 中的以下菜单生成更新后的 .sof 文件,包含 FPGA 内部内存的初始值数据部分。

Processing 菜单 ➤ Start ➤ Start Assembler

图28 Start Assembler
图28 Start Assembler

请使用生成的 (或更新的) .sof 文件,重新生成 .pof 和 .jic 文件。

示例项目

<注意>

· 本示例项目使用 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 篇)》

更多信息: