Nios初体验之——Hello world!

文章目录


前言

环境:

1、Quartus18.0

2、vscode

3、板子型号:原子哥开拓者2(EP4CE10F17C8)
要求:

通过Nios输出Hello world!


一、系统设计

1、系统模块框图


Nios II 处理器通过 Avalon 总线与 ROM 和RAM 连接,其中 Avalon 总线用来传输指令与数据。除此之外,Qsys 系统还提供了一个 JTAG 接口,供用户下载和调试程序。

2、系统涉及到的模块

1、时钟

clk IP 核的全称是 Clock Source,在这里设定我们整个系统的工作时钟频率。

2、nios2_qsys

这是我们之前对Qsys介绍时了解到,这是整个Qsys的控制中心,起着分配中断、管理地址、调度内存等主要的控制作用,相当于大脑的低位吧,通过Avalon与外界进行通信。

3、片内存储(onchip_rom、onchip_ram)

这里我们创建了两个片内存储器,ROM和RAM。这两个片内存储器都是利用FPGA的片上存储资源进行实现,除了用于存储指令和数据外,还是程序的运行空间。需要注意的是ROM的实现,在FPGA内部并没有专用的ROM资源,我们通过对 RAM 赋初值,并始终保持该值,使其变得只读,从而实现片内 ROM(只读存储器)。

4、串行通信(jtag_uart)

JTAG UART IP 核使用 JTAG 接口来实现上位机与 Qsys 系统之间的串行通信。JTAG UART IP 核为用户提供了 Avalon-MM 接口映射,屏蔽了复杂的 JTAG 接口协议。

5、System ID(sysid_qsys)

System ID IP核是一个具有Avalon接口的只读设备,它给每个Nios II系统生成一个唯一的标识符(ID),并将其写入 System ID 核的寄存器中。编译器和用户可以利用该 IP 核来验证编译后的可执行程序与配置到FPGA 中的硬件环境是否匹配。如果可执行程序中的 ID 与 FPGA 中 System ID 核所存储的 ID 不一致,那么程序在运行时可能会出错

二、硬件设计

在开始Qsys系统设计之前我们需要先根据我们的芯片型号创建Quartus 工程,这里前面已经介绍过这里不在赘述。不同的是我们需要多创建一个qsys文件夹,下面新建hardware 和 software 文件夹,分别存放 qsys设计的硬件部分和软件部分。然后我们需要在prj文件夹下新建一个ipcore 文件夹,用于存放 Quartus II 工程 IP 核。

1、创建Qsys

  • 点击tools->platfrom Desiger进入设计界面:
  • 修改时钟频率为100M:

修改为100MHZ,并点击finish完成,否则修改失败。

  • 添加Nios II IP 核:

  • 双击Nios II IP 核进入配置界面:

这里我们保持默认选择"Nios II/f‖内核",报错我们后面再进行解决,点击finish。

  • 添加成功:
  • 添加片内存储ROM IP核:
  • 同样双击进入配置界面:

我们需要将其设置为ROM(只读),大小设置为10240,为10KB,其余默认。

  • 同样的方法,配置RAM:

将"Type"选项设置为"RAM(Writable)",然后将"Total memory size"修改为"20480",也就是 20KB。其他的选项保持默认设置,最后点击 Finish

  • 添加 JTAG UART IP 核:
  • 这里保持默认:
  • 添加 System ID IP 核:
  • 这里保持默认,点击finish:

2、重命名IP核&连线

为了方便我们的理解,以及后面的软件程序中可能会使用到,所以我们尽量重命名为简单易理解的名字。

  • 右击点击rename重命名:
  • 修改过后的名称:
  • 连线:将IP核进行连接:

连接时,用鼠标点击"Connections‖一栏中相应的结点,连接后各结点处的空心圆会变成实心的点,同时相应的连线由浅灰色变成黑色。

  • 将复位信号与时钟信号接入到各IP核下:
  • 数据主端口―data_master‖和指令主端口―instruction_master‖的连线:
  • 注意:

这两个端口的连线遵循以下规则:数据主端口与所有的外设 IP 核连接,而指令主端口只连接存储器 IP 核。

  • 连接"jtag_debug_module_reset‖信号:
  • 注意:

在连完线后,我们需要在"IRQ"一栏将 jtag_uart IP 核的中断信号与 Nios II 处理器连接起来。在连接中断的时候,Qsys 会自动为中断分配一个优先级。

  • 双击Nios II IP核设置复位地址和异常地址:

这个时候finish会报错,我们先设置一下下面的自动分配

  • 设置基地址分配:

    设置完了以后,之前的爆红就会消失,然后可以finish,Generate生成Qsys 系统了。
  • 生成过程:

3、集成 Qsys 系统

  • 将Qsys生成的.qip文件添加到工程:
  • 配置Pll锁相环:
    这里因为我们前面设计Qsys系统时,配置的是100Mhz,所以这里我们需要创建一个PLL IP 核实现二倍频,这里由于前面文章已经介绍过,就不在赘述。
    IP核简介及PLL_IP核的调用

4、顶层文件实例化:

  • 打开我们的Qsys设计界面,在Qsys文件夹找到qsys文件打开:


  • 自动生成Qsys系统例化代码:

但是这里不知道咋的不能生成,那没事我们自己例化顶层模块,例化完放到rtl文件夹中,并添加到工程里设置为顶层文件。

cpp 复制代码
module qsys_hello_world(
 input sys_clk, //晶振时钟,50Mhz
 input sys_rst_n //按键复位,低电平有效
 );
 
 //wire define
 wire clk_100m; //Qsys 系统时钟,100Mhz
 
 //例化 pll IP 核
 pll u_pll(
 .inclk0 (sys_clk),
 .c0 (clk_100m)
 );

 //例化 Qsys 系统
 hello u_qsys(
 .clk_clk (clk_100m),
 .reset_reset_n (sys_rst_n)
 );

 endmodule

5、编译下载操作:

  • Assignment→Device:

  • 将未使用的引脚设置为高阻输入:

  • 将"Value‖一栏全部设置为 ―Use as regular I/O":

  • 下面就是分析综合然后分配引脚全编译:

编译通过,下一部分是软件的设计阶段。

三、软件设计

  • 点击Toos下的Nios II SBT for Eclipse:

  • 修改工作空间到 software 文件夹:

  • 点击ok进入后选择file→New→Nios II Application and BSP from Template用于新建Nios II工程:

  • 设置Nios II工程:

  • 系统默认帮我们创建一个BSP(板级支持包)、保持默认、点击finish:

  • 点击finish完成过后,我们会发现左边增加了两个文件:

  • 点击c/c++的点c文件,修改输出内容并保存:

  • 右击hello_world选择Build Project进行编译:

报错:

解决:
选中hello_world_bsp,右击,进行下面操作:

  • 添加勾选:

enable_reduced_device_drivers

BSP 为处理器的外设提供了两个版本的驱动库:一种是执行速度快,但代码量比较大的版本;另一种是封装小的版本。默认使用的是代码量大的版本, 这里通过
enable_reduced_device_drivers: 选项来选择封装小的版本,从而减少代码量。enalbe_small_c_library:完整的 ANSI C 标准库通常不适用于嵌入式系统,BSP 提供了一系列经过裁剪的 ANSI C 标准库,占用资源比较少,我们可以通过【enalbe_small_c_library】选项来选择精简的 ANSI C 标准库。

  • 取消勾选:

enable_c_plus_plus: 我们使用 C 语言来编写软件程序,因此不需要使能 C++。
enable_clean_exit: 当选中该选项时,系统库在主函数 main()返回时会调用 exit()。调用 exit()时,首先会清理 I/O 的缓冲区,然后再调用_exit()。当不选中该选项时,系统库会只调用_exit(),这样将会节省程序空间。对于嵌入式系统程序来说,一般都不会从 main()返回,所以可以不勾选该选项。

然后我们先点击Generate,再exit。

  • 编译整个工程:
  • 编译成功:

四、下载验证

这里我们需要下载两个文件,先下载sof,再下载elf。这里我们只介绍elf文件的下载。

  • 右击我们的工程名--->run as--->Nios II Hardware:

如果一步成功,那么你的控制台就会打印成功,否则跳出下面弹窗。

提示我们找不到与Nios II硬件系统的连接

如果你这一步成功,那么你的控制台就会打印成功,否则跳出下面弹窗。

上面这个问题博主寻找了许久也没有发现问题,或者解决方法,丢弃了几天,在周末打开时他又行了,真是玄学,如果有友友了解的可以在评论区发表一下想法,一起学习。

  • 在下载完成之后,控制台会输出相应信息:

五、总结

总结的话就一句话,杀猪焉用牛刀哈,这里我们在实现简单输出时发现我们的步骤稍显复杂,这里的话为了方便我们后续的查看步骤,博主这里写的较为详细。在后面大的一些工程的话就能体会到Nios的魅力了。大家在配置的时候要细心,尤其连线那里,加油!最近在搞DHT11的温湿度读取和基于openvino的车牌识别,敬请期待。

六、参考资料

以上资料均来自正点原子的教学视频或开拓者2开发教程:原子官方

源码:https://github.com/no1jiangjiang/Nios_hello

相关推荐
DS小龙哥8 小时前
基于Zynq FPGA的雷龙SD NAND存储芯片性能测试
fpga开发·sd nand·雷龙·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
上理考研周导师17 小时前
第二章 虚拟仪器及其构成原理
fpga开发
FPGA技术实战19 小时前
《探索Zynq MPSoC》学习笔记(二)
fpga开发·mpsoc
bigbig猩猩1 天前
FPGA(现场可编程门阵列)的时序分析
fpga开发
Terasic友晶科技1 天前
第2篇 使用Intel FPGA Monitor Program创建基于ARM处理器的汇编或C语言工程<二>
fpga开发·汇编语言和c语言
码农阿豪1 天前
基于Zynq FPGA对雷龙SD NAND的测试
fpga开发·sd nand·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
江山如画,佳人北望1 天前
EDA技术简介
fpga开发
淘晶驰AK1 天前
电子设计竞赛准备经历分享
嵌入式硬件·fpga开发
最好有梦想~1 天前
FPGA时序分析和约束学习笔记(4、IO传输模型)
笔记·学习·fpga开发