本教程演示如何在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处理器支持两种不同的配置:

  1. 流水线
  • 应用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版本为例进行操作演示。

1. Quartus Prime v22.1.2 Standard Edition 和对应的Ashling  RiscFree IDE下载链接:https://www.intel.com/content/www/us/en/software-kit/785052/intel-quartus-prime-standard-edition-design-software-version-22-1-2-for-windows.html

 

(点击Individual Files找到QuartusSetup-22.1std.2.922-windows.exe文件并下载,然后点击Additional Software找到RiscFreeSetup-22.1std.2.922-windows.exe文件并下载)

 

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总线连接到这个系统核心上。

 

 

Clock Source:时钟源组件,提供时钟信号,驱动其他组件。

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 :该IP是具有Avalon接口的并行输入/输出(parallel input/output)核,在Avalon存储器映射(Avalon Memory-Mapped Avalon-MM)从端口和通用I/O端口之间提供了一个存储器映射接口。I/O端口既可以连接片上用户逻辑,也可以连接到FPGA与外设连接的I/O引脚。每个PIO核可以提供最多32个I/O端口。像微处理器这样的智能主机通过读/写寄存器映射的Avalon-MM接口控制PIO端口。在主机控制下,PIO核捕获输入端口的数据,并驱动数据到输出端口。当PIO端口直接与I/O引脚相连时,主机通过写PIO核中的控制寄存器对I/O引脚进行三态控制。

或者直接参考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. 在IP Catalog搜索NiosV,双击Nios V/m Processor Intel FPGA IP以添加此IP到qsys系统,暂时保持默认参数设置不变,直接点击Finish。

 

7. 用同样的方法搜索并添加On-Chip Memory (RAM or ROM) Intel FPGA IP,Total Memory Size修改为131072(对应128K),其余参数不变。

 

 8. 继续搜索并添加JTAG UART Intel FPGA IP到系统,默认参数设置不变。

 

 9. 最后搜索添加PIO (Parallel I/O) Intel FPGA IP,Width设置为10,Direction设置为Output。

 

10. 按下图所示连接各IP,并按照下图重命名每个IP,最后双击箭头处将LED PIO导出。

 

 11. 修改Nios V/m IP的参数设置,勾选Enable Reset from Debug Module,Reset Agent选择SRAM.s1。

 

12.点击Platform Designer的菜单System—— Assign Base Addresses给每个模块分配地址空间。

 

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顶层文件。

 

19. 在该.v文件里面输入如下代码并保存为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. 最后再点击Start Compilation图标编译Quartus工程,最终生成.sof文件。

 

四、创建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. 在PC开始菜单栏打开Quartus v22.1.2下的RiscFree IDE。

 

 

 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文件。

 

 

五、下板测试

5.1 配置硬件

1. 将DE1-SOC开发板和电脑用板子自带的白色USB type B 线缆连接起来。给DE1-SOC插上电源并开机。

 

2. 打开Quartus的Programmer工具,点击Hardware Setup,选择DE-SOC[USB-1]端口。

 

2. 点击Auto Detect,选择DE1-SOC对应的FPGA器件5CSEMA5。

 

3. 这时会出现两个器件(5CSEMA5和SOCHPS),右击器件5CSEMA5,选择Change File...,然后选择C:\Users\terasic_002\Desktop\my_first_niosv\output_files路径下的my_first_niosv.sof文件,点击Start按钮开始配置FPGA。

 

 进度条显示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