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, //晶振时钟,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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VGGNet剪枝实战:使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型

摘要 本文讲解如何实现VGGNet的剪枝操作。剪枝的原理:在BN层网络中加入稀疏因子,训练使得BN层稀疏化,对稀疏训练的后的模型中所有BN层权重进行统计排序,获取指定保留BN层数量即取得排序后权重阈值thres。遍历模型中的BN层权重&am…

MySQL事务管理

MySQL事务管理 MySQL增删查改时的问题一.什么是事务?二.为什么会出现事务?三.事务的其他属性1. 事务的版本支持2. 事务的提交方式 四.事务的准备工作五.事务的操作1. 事务的正常操作2. 事务的异常验证与产出结论 六.事务的隔离级别1. 事务隔离级别概念2.…

CentOS 安装 Jenkins

本文目录 1. 安装 JDK2. 获取 Jenkins 安装包3. 将安装包上传到服务器4. 修改 Jenkins 配置5. 启动 Jenkins6. 打开浏览器访问7. 获取并输入 admin 账户密码8. 跳过插件安装9. 添加管理员账户 1. 安装 JDK Jenkins 需要依赖 JDK,所以先安装 JDK1.8。输入以下命令&a…

如何打造属于自己的个人IP?

在当今信息爆炸的时代,个人 IP 已经成为人们在网络世界中的独特标签。无论是在职场上、创业中,还是在社交生活中,拥有个人 IP 的人都能脱颖而出,吸引更多的关注和机会。那么,如何打造属于自己的个人 IP 呢?…

PowerShell 中,你可以使用以下命令来获取磁盘、内存、CPU、GPU、网卡和声卡的硬件信息

在 PowerShell 中,你可以使用以下命令来获取磁盘、内存、CPU、GPU、网卡和声卡的硬件信息: 获取磁盘信息: Get-PhysicalDisk | Select-Object DeviceID, MediaType, Model, Size获取内存信息: Get-CimInstance Win32_PhysicalM…

中兴服务器支持百度“文心一言”,助力AI产业发展

前段时间,中兴和百度正式对外宣布中兴服务器将会支持百度“文心一言”,为其提供更加强劲的算力支撑,从而加速“文心一言”的完事升级与更新迭代,助力AI产业化应用和生态的繁荣发展。   “文心一言”是百度基于文心大模型技术推出…

【docker】docker-compose服务编排

目录 一、服务编排概念二、docker compose2.1 定义2.2 使用步骤2.3 docker-compose安装2.4 docker-compose卸载 三、编排示例 一、服务编排概念 1.微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启…

0-1搭建vue项目工程

一、下载node.js 简单介绍: Node.js是一个基于V8引擎的JavaScript运行时环境,它允许开发者在服务器端使用JavaScript进行开发。Node.js是一个非常强大的工具,可以帮助开发者构建高性能、可扩展的Web应用程序,并且可以与各种技术…

Gitlab CI/CD笔记-第二天-GitOps的流水线常用关键词(1)

一、常用关键词 在Gitlab项目的根目录需要创建一个 .gitlab-ci.yaml的文件。 这个文件就是定义的流水线。Call :"Pipeline as code" 二、这条流水线怎么写? 一、掌握常用的关键词即可。 1.关键词分类 1.全局关键词 Global Keywards 2.任务关键词…

长度最小的子数组_力扣209

文章目录 题目描述法一 滑动窗口法题目描述 法一 滑动窗口法 int minSubArrayLen(int target, vector<int>&nums){int

HDFS小文件解决方案---archive归档文件命令

小文件解决方案 背景Archive概述创建archive查看归档文件查看归档之后的样子查看归档文件之前的样子 提取archivearchive注意事项 背景 hdfs并不擅长存储小文件&#xff0c;因为每个文件最少一个block&#xff0c;每个block的元数据都会在namenode占用内存&#xff0c;如果存在…

Spring接口ApplicationRunner的作用和使用介绍

在Spring框架中&#xff0c;ApplicationRunner接口是org.springframework.boot.ApplicationRunner接口的一部分。它是Spring Boot中用于在Spring应用程序启动完成后执行特定任务的接口。ApplicationRunner的作用是在Spring应用程序完全启动后&#xff0c;执行一些初始化任务或处…

【cluster_block_exception】写操作elasticsearch索引报错

【cluster_block_exception】操作elasticsearch索引b报错 背景导致原因&#xff1a;解决方法&#xff1a; 背景 今天线上elk的数据太多&#xff0c;服务器的空间不足了。所以打算删除一些没用用的数据。我是用下面的request&#xff1a; POST /{index_name}/_delete_by_query…

VSCode:人生苦短,我用扩展!

B站|公众号&#xff1a;啥都会一点的研究生 作为苦逼码农&#xff0c;每天花费大量时间使用VSCode来编写和调试代码​ 好消息是&#xff0c;VSCode有很多超酷扩展可以让效率直线上升&#xff0c;极大争取摸鱼时间&#xff0c;一起看看吧 1. CodeSnap 用 CodeSnap 轻松捕捉代…

Vue3_对响应式对象解构赋值之后失去响应性——toRefs()

官网toRefs() :响应式 API&#xff1a;工具函数 | Vue.js toRefs 在调用时只会为源对象上可以枚举的属性创建 ref。如果要为可能还不存在的属性创建 ref&#xff0c;请改用 toRef。 setup(){const state reactive({name:"张三"age:14})const stateAsToRefs toRef…

用C语言构建一个数字识别卷积神经网络

卷积神经网络的具体原理和对应的python例子参见末尾的参考资料2.3. 这里仅叙述卷积神经网络的配置, 其余部分不做赘述&#xff0c;构建和训练神经网络的具体步骤请参见上一篇: 用C语言构建一个手写数字识别神经网路 卷积网络同样采用简单的三层结构&#xff0c;包括输入层con…

Qt能跨多少个平台?Qt能支持多少个平台?

2023年8月5日&#xff0c;周日下午 目录 Qt所支持的平台更多关于Qt支持的信息 Qt所支持的平台 图中显示的平台都支持。 想要更详细的平台支持信息可以查看&#xff1a;Supported Platforms | Qt 5.15 更多关于Qt支持的信息 Qt - 支持的平台及语言

物联网||不一样的点灯实验(2)|通过使用CMSIS库函数实现点灯实验-学习笔记(12)

文章目录 通过使用CMSIS库函数实现点灯实验1 如何使用CMIS库2 如何利用CMSIS库操作IO 两种实现方法的比较课后作业:完整代码&#xff1a;LED.C:test.c:led.h:systick.h:systick.c: 通过使用CMSIS库函数实现点灯实验 1 如何使用CMIS库 #####如何使用此驱动#####[. .](#)启用GPI…

传染病学模型 | Python实现基于使用受控SIR模型数据平滑对参数估计的影响

效果一览 文章概述 传染病学模型 | Python实现基于使用受控SIR模型数据平滑对参数估计的影响 我们可以采用更多数据驱动的方法,而不是使用移动平均线进行数据平滑。 我们感兴趣的是了解疾病发作和报告疾病日期之间的延迟

九、pig安装

1.上传pig包 2.解压文件 3.改名 4.赋权 5.配置环境变量 export PIG_HOME/usr/local/pig export PATH$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$HBASE_HOME/bin:$SQOOP_HOME/bin:$PIG_HOME/bin 6.测试