Nios初体验之——Hello world!

文章目录

  • 前言
  • 一、系统设计
    • 1、系统模块框图
    • 2、系统涉及到的模块
      • 1、时钟
      • 2、nios2_qsys
      • 3、片内存储(onchip_rom、onchip_ram)
      • 4、串行通信(jtag_uart)
      • 5、System ID(sysid_qsys)
  • 二、硬件设计
    • 1、创建Qsys
    • 2、重命名IP核&连线
    • 3、集成 Qsys 系统
    • 4、顶层文件实例化:
    • 5、编译下载操作:
  • 三、软件设计
  • 四、下载验证
  • 五、总结
  • 六、参考资料


前言

环境:
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文件夹中,并添加到工程里设置为顶层文件。

module qsys_hello_world(input sys_clk, //晶振时钟,50Mhzinput sys_rst_n //按键复位,低电平有效);//wire definewire 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/82792.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全 Day27-运维安全项目-堡垒机部署

运维安全项目-堡垒机部署 1. 运维安全项目-架构概述2. 运维安全项目之堡垒机2.1 堡垒机概述2.2 堡垒机选型2.3 环境准备2.4 部署Teleport堡垒机2.4.1 下载与部署2.4.2 启动2.4.3 浏览器访问teleport2.4.4 进行配置2.4.5 安装teleport客户端 2.5 teleport连接服务器 1. 运维安全…

opencv基础48-绘制图像轮廓并切割示例-cv2.drawContours()

绘制图像轮廓:drawContours函数 在 OpenCV 中,可以使用函数 cv2.drawContours()绘制图像轮廓。该函数的语法格式是: imagecv2.drawContours( image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]…

openGauss学习笔记-31 openGauss 高级数据管理-索引

文章目录 openGauss学习笔记-31 openGauss 高级数据管理-索引31.1 语法格式31.2 参数说明31.3 示例 openGauss学习笔记-31 openGauss 高级数据管理-索引 索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。 索引可以用来提高数据库查询性能&…

2023河南萌新联赛第(五)场:郑州轻工业大学 --Kruskal

题目描述 给定一张nnn个点的无向完全图,其中两点之间的路径边权为两点编号的按位与(编号为 (1,2,...,n)(1,2,...,n)(1,2,...,n)),即w(u,v)u&v(1≤u,v≤n)w\left(u, v \right )u\&v \left( 1 \le u, v \le n \right)w(u,v…

CSS:盒子模型 与 多种横向布局方法

目录 盒子模型块级盒子内联级盒子内联块级盒子弹性盒子display 改变模型区域划分text 内容区padding 填充区border 边框区margin 外边距直接设置盒子大小 布局横向布局方法一 float 浮起来方法二 内联块级元素实现方法三 弹性盒子模型 盒子模型 块级盒子 独占一行&#xff0c…

layui的基本使用-日期控件的业务场景使用入门实战案例一

效果镇楼; 1 前端UI层面; <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" conten…

【前端】html

HTML标签&#xff08;上&#xff09; 目标&#xff1a; -能够说出标签的书写注意规范 -能够写出HTML骨架标签 -能够写出超链接标签 -能够写出图片标签并说出alt和title的区别 -能够说出相对路径的三种形式 目录&#xff1a; HTML语法规范HTML基本结构标签开发工具HTML常用标…

Android SystemServer中Service的创建和启动方式(基于Android13)

Android SystemServer创建和启动方式(基于Android13) SystemServer 简介 Android System Server是Android框架的核心组件&#xff0c;运行在system_server进程中&#xff0c;拥有system权限。它在Android系统中扮演重要角色&#xff0c;提供服务管理和通信。 system …

浅析 C 语言的共用体、枚举和位域

前言 最近在尝试阅读一些系统库的源码&#xff0c;但是其中存在很多让我感到既熟悉又陌生的语法。经过资料查阅&#xff0c;发现是 C 语言中的共用体和位域。于是&#xff0c;趁着课本还没有扔掉&#xff0c;将一些相关的知识点记录在本文。 文章目录 前言共用体 (union)枚举…

zookeeper常用命令

zookeeper常用命令 1. 下载安装2. 配置说明2.1 配置 3. zookeeper的常见命令3.1 server端启动停止等命令3.2 客户端连接等命令3.3 客户端简单常用命令3.3.1 查看目录&#xff08;查看数据结构&#xff09;3.3.2 删除目录3.3.3 创建目录3.3.4 创建目录并写入值 查看节点值3.3.5…

原型链污染,nodejs逃逸例子

文章目录 原型链污染原型链污染原理原型链污染小例子 原型链污染题目解析第一题第二题 Nodejs沙箱逃逸方法一方法二 原型链污染 原型链污染原理 原型链 function test(){this.a test; } b new test;可以看到b在实例化为test对象以后&#xff0c;就可以输出test类中的属性a…

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio构建SpringSecurity权限框架

1.Cloud Studio&#xff08;云端 IDE&#xff09;简介 Cloud Studio 是基于浏览器的集成式开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器就能在线编程。 Clou…

XSS漏洞原理及利用跨站请求伪造CSRF

XSS漏洞原理及利用&跨站请求伪造CSRF XSS一、案例二、什么是XSS三、XSS危害四、XSS的分类4.1、反射型XSS4.1.1、介绍4.1.2、利用过程 4.2、存储型XSS4.2.1、介绍4.2.2、利用过程4.2.3、案例 4.3、DOM型XSS4.3.1、介绍4.3.2、常用的DOM方法4.3.3、案例4.3.3.1、代码分析4.3.…

如何快速完成MySQL数据的差异对比|NineData

在现代商业环境中&#xff0c;数据库是企业存储核心数据的重要工具&#xff0c;而 MySQL 作为最受欢迎的关系型数据库管理系统&#xff0c;广泛应用于各行各业。在容灾、数据迁移、备份恢复等场景下&#xff0c;为了确保两端或多端之间数据的一致性&#xff0c;通常需要对数据进…

Android 实现 RecyclerView下拉刷新,SwipeRefreshLayout上拉加载

上拉、下拉的效果图如下&#xff1a; 使用步骤 1、在清单文件中添加依赖 implementation ‘com.android.support:recyclerview-v7:27.1.1’ implementation “androidx.swiperefreshlayout:swiperefreshlayout:1.0.0” 2、main布局 <LinearLayout xmlns:android"http…

渐进式云渲染和模块式云渲染:二者的区别与选择

云渲染是一种利用云计算技术&#xff0c;将本地的渲染任务分配到远程的服务器上进行高效、快速、低成本的渲染的服务。云渲染可以帮助用户节省时间、资金和硬件资源&#xff0c;提高工作效率和质量。但是&#xff0c;在使用云渲染时&#xff0c;用户需要面对一个重要的选择&…

SpringBoot 底层机制分析[上]

文章目录 分析SpringBoot 底层机制【Tomcat 启动分析Spring 容器初始化Tomcat 如何关联Spring 容器】[上]搭建SpringBoot 底层机制开发环境Configuration Bean 会发生什么&#xff0c;并分析机制提出问题&#xff1a;SpringBoot 是怎么启动Tomcat &#xff0c;并可以支持访问C…

【iOS】autoreleasepool

来说一下最近在了解的autoreleasepool吧&#xff0c;我们可能平时书写过许多脑残代码&#xff0c;其有很多的缺陷但是我们可能当时学的比较浅就也不太了解&#xff0c;就像下面这样的&#xff1a; for (int i 0; i < 1000000; i) {NSNumber *num [NSNumber numberWithInt…

matlab使用教程(10)—脚本和函数

1.概述 MATLAB 提供了一个强大的编程语言和交互式计算环境。您可以使用此语言在 MATLAB 命令行中一次输入一个命令&#xff0c;也可以向某个文件写入一系列命令&#xff0c;按照执行任何 MATLAB 函数的相同方式来执行这些命令。使用 MATLAB 编辑器或任何其他文件编辑器可以创建…

HCIP实验

实验题目如下&#xff1a; 实验拓扑如下&#xff1a; 实验要求如下&#xff1a; 【1】两个协议间进行多点双向重发布 【2】R7的环回没有宣告在OSPF协议中&#xff0c;而是后期重发布进入的 【3】解决环路&#xff0c;所有路径选择最优&#xff0c;且存在备份 实验思路如下&…