本教程演示如何在DE1-SOC开发板上创建一个基于C5 FPGA的SOPC系统,并在系统上运行Nios V软件工程。具体会使用Quartus软件中的Platform Designer系统集成工具创建一个基于Nios V的FPGA硬件系统工程,将sof编程文件下载到FPGA 中,然后使用Ashling RiscFree IDE创建Nios v软件工程——my_first_niosv,最后将.elf可执行文件下载到DE1-SOC开发板观察执行结果。然后将Nios V软件程序要打印的信息通过JTAG UART传输到PC上,并在Nios V terminal进行打印显示。
一、Nios V简介
Nios V处理器是基于RISC-V规范的软知识产权(IP)处理器。
Nios V处理器系统相当于一个微控制器(或“芯片级计算机”),其中包括处理器以及单芯片上的外设和内存组合。Nios®V处理器系统由一个Nios V处理器内核、一组片内外设、片内存储器和片外存储器的接口组成,所有这些都集成在Intel FPGA芯片上进行实现。与微控制器类似,所有的Nios V处理器系统都使用一致的指令集和编程模型。
目前Intel推出了三款Nios® V处理器(图片来自Intel 官网):
从截图可以看到这里面功能最强的是Nios V/g IP,用户可根据实际需求选择对应的软核。不过对于Cyclone V器件目前只支持Nios V/m软核。Agilex V等器件则支持以上三种软核。
Nios V/m处理器性能:
Nios®V/m处理器是Intel基于RISC-V指令集开发的微控制器核心。
Nios®V/m处理器支持两种不同的配置:
- 流水线
- 应用RV32IZicsr指令集。
- 支持五阶段流水线数据通路。
2. 非流水线
- 应用RV32IZicsr指令集。
- 支持非流水线数据通路。
二、SOPC开发流程
在Quartus Prime完成嵌入式系统的硬件部分,在RiscFree IDE中完成NiosV软件部分。基于Nios V 的SOPC 的开发流程其实和Nios II 的流程是一样的,以下是Nios II 的开发流程:
三、开发工具下载
目前Quartus Prime Standard版从 22.1及以上版本都支持Nios V了,而且这些版本也支持Cyclone V器件。Quartus Prime Pro版从22.2及以上版本都支持Nios V ,但专业版不支持Cyclone V器件。
这里以22.1.2版本为例进行操作演示。
2. Quartus以及Nios® V/m Embedded Processor的license,在Intel [Self Service Licensing Center]可免费申请,申请步骤可参考链接(点击跳转),使用期限是90天。
3. 设置license环境变量。将Intel发送过来的license文件保存到本地盘,然后将其具体路径添加到计算机的环境变量窗口。
同时,也在Quartus工具中点击菜单Tools——License setup设置license文件路径:
四、Quartus工程设计
首先在FPGA里会定制一个包含Nios V处理器、On-Chip Memory、JTAG UART和PIO的嵌入式系统。这个系统中使用的Nios V核是整个系统的核心,其他组件都会通过Avalon总线连接到这个系统核心上。
On-Chip Memory (RAM or ROM) Intel FPGA IP:Intel FPGA包含了可以在Platform Designer系统中当作RAM或ROM使用的片上存储器。片上存储器有以下优势:与片外存储器相比,片上存储器的访问时间更快;Platform Designer自动例化片上存储器,不需要进行任何手动连接; FPGA上电时,某些存储块可具有初始化的内容,这一特性在存储数据常量或处理器引导代码时很重要;片上存储器支持双端口访问,允许两个主设备同时访问同一内存;有RAM和ROM之分,容量大小不超过FPGA最大可用容量。
JTAG UART IP:是PC与FPGA通信电缆的控制台。PC可以将数据通过JTAG电缆传输到FPGA,也能将FPGA产生的数据回传到PC。
PIO(Parallel I/O) Intel FPGA IP
或者直接参考Nios V 的handbook手册截图。(截图来自Nios® V 嵌入式处理器设计手册,点击可以跳转)
1. 点击Quartus菜单File——New Project Wizard——Next。
2. 在桌面创建一个my_first_niosv的文件夹,并将工程路径指向这里,且工程的名称也命名为my_first_niosv:
3. 连续点击3次Next得到如下界面,通过器件过滤器筛选选中DE1-SoC的Cyclone V 5CSEMA5F31C6器件。
4. 最后点击Next和Finish完成工程创建。
5.点击Platform Designer 图标打开qsys系统界面。
6.
7. 用同样的方法
8. 继续搜索并添加JTAG UART Intel FPGA IP到系统,默认参数设置不变。
9. 最后
10.
11.
13. 这时Message栏仍然有错误提示,请将My_NiosV的ndm_reset_in信号与系统rest信号连接起来。最后点击窗口右下角的Generate HDL按钮生成qsys文件。
14. 点击OK。(虽然这里截图是提醒添加.qip和.sip文件到工程,但其实也可以添加my_first_niosv/niosv.qsys文件,结果是一样的。)
15. 点击菜单Project——Add/remove Files in Project...。
16. 在弹出的对话框里面点击...双击niosv.qsys文件就可以将该文件添加进工程里面去。
17. 最后得到结果如下,然后点击Apply按钮后,就可以关闭该窗口了。
18. 点击Quartus菜单File——New——Verilog HDL File——OK,创建my_first_niosv.v顶层文件。
module my_first_niosv ( CLOCK_50, LEDR ); input CLOCK_50; output [9:0] LEDR; niosv u0 ( .clk_clk (CLOCK_50), //clk.clk .led_external_connection_export (LEDR) // led_external_connection.export ); endmodule
20. 点击Analysis & Synthesis进行分析与综合。
21. 分析综合完成以后,点击Quartus菜单Assignments——Pin Planner。
22. 按DE1-SoC开发板的相关引脚进行引脚分配,具体内容如如下。
23.
四、创建Nios V 软件工程
1. 点击电脑左下角的开始菜单打开Nios V Command Shell。
2. 将路径切换到my_first_niosv工程文件夹路径下,然后新建software文件。
3. 先来看看niosv-app的用法(更多具体内容请自行阅读)。
3. 运行niosv-bsp -c -t=hal --sopcinfo=niosv.sopcinfo software/bsp/settings.bsp命令在software文件夹创建Nios V BSP。
4. 在software文件夹路径下再创建app文件夹,并在app文件夹下创建空白led.c文件。
5. 运行niosv-app -a=software/app -b=software/bsp -s=software/app/led.c命令在app文件夹生成CMakeLists.txt文件。(后面会在RIscFree IDE 中通过“Create a New Project” wizard创建软件工程,然后通过CMakeList.txt 来把APP project 导入进去。)
6.
7. workspace指向software文件夹路径。然后点击Launch启动IDE软件。
8. 点击Create a project,在New Project窗口,选择C/C++下的C Project,点击Next以打开C Project窗口。
9. 在C Project窗口,Project name命名为app,Location指向app所在文件夹,Project Type选择CMake driven下的Empty Project。
10. 接下来的Select Configurations窗口保持默认设置不变,点击Finish即可。
11. 在led.c文件里面敲入如下代码:
#include <stdio.h> #include "system.h" #include "alt_types.h" #include "altera_avalon_pio_regs.h" /* 流水灯控制数组,高电平点亮 */ const alt_u32 LED_TBL[] = { 0x201, //10 0000 0001 0x102, //01 0000 0010 0x84, //00 1000 0100 0x48, //00 0100 1000 0x30, //00 0011 0000 0x48, //00 0100 1000 0x84, //00 1000 0100 0x102, //01 0000 0010 0x201 //10 0000 0001 }; ////////////////////////////////////////////////////////// // // function: main // description: perform cyclically lighting the LED // parameter: none // return: 0 // ////////////////////////////////////////////////////////// int main(){ printf("Realize the function of cyclically lighting the LED\n"); //在console窗口打印信息 alt_u8 i; alt_u32 delay; while(1){ for(i = 0; i<9; i++){ //流水灯花样数组共有 9种状态 IOWR(LED_BASE, 0, LED_TBL[i]); //流水灯花样显示 delay = 0; while(delay < 500000) //延时大约1秒 delay++; } } return 0; }
12. 左键选中app,点击Build Project编译led.c,编译完成可以看到生成app.elf文件。
五、下板测试
进度条显示100%代表FPGA 配置成功。
5.2 配置软件
1. 在Nios V Command Shell里运行juart-terminal。(以前的Nios terimal tool 改为juart-termial了。)
2. 在RiscFree IDE窗口左键选中app,依次选择菜单里的Run As-->3 Ashling RISC-V(auto-detect)Hardware Debugging。
3. 在C Local Application窗口选择app.elf再点OK按钮。
4. 运行完成后即可在DE1-SoC开发板上看到led.c程序的流水灯现象。
视频参考: 【DE1-SOC 开机测试演示视频】https://www.bilibili.com/video/BV1wD421T7yU/?spm_id_from=333.999.0.0
5. 同时,在Teminal会打印:Realize the function of cyclically lighting the LED