基于Nios软件实现流水灯+串口输出

基于NIOS-II软核实现流水灯+串口输出

引言:

​ 在现代电子设计领域,FPGA(现场可编程门阵列)因其灵活性和并行处理能力而成为实现复杂数字系统的首选平台。Nios II,作为Altera(现为Intel旗下)提供的软核处理器,为FPGA提供了强大的处理核心,使得FPGA的应用领域得以进一步扩展到嵌入式系统设计。
·
本次实验的核心目标是利用Nios II软核处理器的软件编程能力,结合硬件描述语言(HDL)的硬件实现,完成两个基础而经典的任务:流水灯控制和串口数据输出。这不仅将加深对Nios II处理器编程的理解,也将熟悉FPGA硬件的串口通信接口。

  1. 流水灯控制部分将通过编写C代码,控制FPGA上的LED灯依次点亮,形成流水灯效果,以此来练习基本的输入输出操作和时间控制逻辑。
  2. 串口数据输出部分则要求我通过编写串口通信程序,实现通过串口终端与FPGA之间的数据传输,这将涉及到串口配置、数据发送和接收等关键技术点。

希望你在本次学习过后,能够有一定的收获!!!

推荐歌曲—Call of Silence-Haru&CHANYEONG KIM

​ 冲啊!!!! ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶

文章目录

  • 基于NIOS-II软核实现流水灯+串口输出
    • 一、任务介绍
      • 1) 了解Nios II软核
      • 2) 了解Qsys
      • 3) 实现流水灯
      • 4) 实现串口输出
    • 二、Nios II软核
      • 2.1 Nios II软核概述
      • 2.2 Nios II软核特性
      • 2.3 Nios II软核开发工具
      • 2.4 Nios II软核在FPGA设计中的应用
      • 2.5 Nios II软核的学习和使用
    • 三、Qsys
    • 四、实验流程
      • 4.1 硬件设计
        • 4.1.2 创建工程
        • 4.1.2 使用Qsys
        • 4.1.3 IP核的连接
        • 4.1.4使用FPGA资源
      • 4. 2软件设计
        • 4.2.1 打开软件
        • 4.2.1 创建文件
        • 4.2.3 修改实现代码
        • 4.2.4 代码烧录
    • 五、实验效果
    • 六、实验心得

一、任务介绍

1) 了解Nios II软核

Nios II软核处理器是一款可定制的嵌入式处理器,运行在FPGA内部,由Altera(现为Intel FPGA)提供。它支持多种配置选项,包括不同的流水线级别、缓存大小、中断和异常处理等。了解Nios II软核对于掌握如何利用FPGA进行复杂系统设计至关重要。

目标:

  • 学习Nios II处理器的基本架构和工作原理。
  • 熟悉Nios II软核的开发工具和环境。
  • 理解如何对Nios II软核进行配置以满足特定应用需求。

2) 了解Qsys

Qsys(原名AES)是Altera提供的一种基于图形的集成开发环境,用于快速设计和集成复杂的系统。通过Qsys,可以轻松地将Nios II软核与其他IP核(如内存控制器、外设接口等)集成在一起,形成完整的系统。

目标:

  • 掌握Qsys的基本使用,包括组件的选择、连接和配置。
  • 学习如何通过Qsys生成定制的系统,并将Nios II软核与所需的外设和接口集成。
  • 理解Qsys生成的系统如何映射到FPGA硬件上。

3) 实现流水灯

流水灯是FPGA设计中的一个经典实验,通过控制一组LED灯依次点亮来模拟流水效果。该任务将结合硬件描述语言和Nios II软件编程来实现。

目标:

  • 学习如何在FPGA上实现流水灯的硬件逻辑。
  • 编写C代码,控制LED灯的顺序点亮,形成动态流水灯效果。
  • 掌握基本的输入输出操作和时间控制逻辑。

4) 实现串口输出

串口是一种常用的异步通信接口,广泛应用于嵌入式系统的数据交换。本任务要求通过Nios II处理器实现串口通信,完成数据的发送和接收。

目标:

  • 学习串口通信的基本原理和相关的参数设置(如波特率、数据位、停止位等)。
  • 编写C代码,实现通过串口发送数据到外部设备(如PC机)。
  • 掌握使用Nios II处理器进行串口通信的方法,包括初始化串口、发送数据和接收数据。

二、Nios II软核

2.1 Nios II软核概述

​ Nios II是应用于Intel FPGA的嵌入式软核处理器,它是Qsys嵌入式系统的核心部件,具有较强的性能和可定制特性。我们可以在一片FPGA内部构建多个Nios II处理器,它们可以作为主CPU,也可以是协处理器,在同一芯片内部协调有序地完成整个复杂系统的各项功能。Nios II处理器内核是32位RISC架构(精简指令集架构)处理器,它包含了大多数现代32位处理器中常见的基本架构元素,包括:

⚫ 32位指令大小

⚫ 32位数据线与地址线

⚫ 32个通用寄存器

⚫ 32个外部中断源

⚫ 可配置的指令高速缓存

⚫ 可配置的数据高速缓存

⚫ 用于集成定制外设的通用接口

Nios II处理器的结构框图如下所示,从图中我们还可以看到,Nios II提供了JTAG接口

供用户下载和调试程序。

img

2.2 Nios II软核特性

Nios II软核提供了一系列高级特性,包括:

  • 流水线架构:支持从三级到八级流水线的配置,以平衡性能和资源消耗。
  • 哈佛架构:具有独立的指令和数据缓存,提高了数据访问速度。
  • 中断和异常处理:支持多达32个中断源和异常处理,增强了系统的响应能力。
  • 丰富的外设支持:包括定时器、串口、JTAG调试等标准外设。
  • 定制指令:允许用户根据自己的需求添加定制指令,进一步提升性能。
  • 低功耗设计:优化了功耗管理,适合电池供电的便携式设备。

2.3 Nios II软核开发工具

开发Nios II软核应用程序涉及到以下工具:

  • Nios II集成开发环境(IDE):提供了代码编辑、编译、调试和性能分析的集成解决方案。
  • Qsys:一个基于图形的系统构建工具,用于快速集成Nios II软核与其他IP核。
  • Nios II C/C++编译器:用于将编写的C/C++代码编译成FPGA可执行的机器代码。
  • Nios II硬件仿真模型:在仿真环境中模拟Nios II软核的行为,便于早期设计验证。

2.4 Nios II软核在FPGA设计中的应用

在FPGA设计中,Nios II软核可以用于:

  • 控制逻辑实现:通过编写C/C++代码实现复杂的控制逻辑,减轻硬件逻辑设计的负担。
  • 数据处理:利用Nios II软核的计算能力,处理来自传感器或其他外设的数据。
  • 通信协议处理:实现各种通信协议,如SPI、I2C、Ethernet等。
  • 用户界面管理:通过连接显示器或其他输出设备,提供用户交互界面。
  • 系统集成:作为系统的核心,集成多种外设和功能,构建完整的系统解决方案。

2.5 Nios II软核的学习和使用

为了充分利用Nios II软核的能力,需要:

  • 理解计算机组成原理:掌握处理器的基本工作原理,包括指令执行、内存管理等。
  • 学习Nios II体系结构:熟悉Nios II软核的特定特性和编程模型。
  • 实践编程技能:通过编写和调试C/C++代码,提高软件编程能力。
  • 掌握系统设计方法:学习如何使用Qsys工具进行系统级别的设计和集成。

通过深入学习和实践,可以充分发挥Nios II软核在FPGA设计中的潜力,实现高效、可靠的定制化系统解决方案。

三、Qsys

Qsys是什么

​ Qsys的前身是“SOPC Builder”,在最新的Quartus版本中,Qsys再次被升级为“Platform Designer”。因此在我们看到“Platform Designer”时,要知道它实际上就是我们所常用的Qsys。

​ Qsys是Quartus II中的一个系统集成工具,它是用来搭建、开发以及维护“系统”的平台,这个系统通常是指以Nios II处理器为核心的嵌入式系统,当然它也可以不包含Nios II处理器。我们知道,嵌入式开发需要同时具备硬件环境和软件程序,Qsys就是用来创建硬件环境的。它不同于ARM、单片机等处理器的固定硬件环境,而是可以根据自己的需求来搭建硬件环境,这也这是它的独到和创新之处。一个基本的Qsys系统框图如下所示:

img

​ 利用Qsys所搭建的一个基本的嵌入式系统包含系统时钟、Nios II处理器、JTAG接口、ROM和RAM等。其中,Nios II处理器是Qsys系统中最为核心的一个IP核,它是系统的调控中心,负责中断分配、地址管理、内存调度等控制任务。而GPIO(通用输入输出接口)、SDRAMController等外设控制器负责与外部设备连接,控制外设的行为。Nios II和各个外设控制器之间通过Avalon总线通信。

四、实验流程

4.1 硬件设计

4.1.2 创建工程

启动 Quartus II 软件,选择File->New Project Wizard,在出现的界面下先Next,填写工程的路径和名称,然后接着Next,直到出现下面界面并进行相应操作。接着一路Next,直到Finish,完成工程的创建。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.1.2 使用Qsys

选择Tools->Qsys

在这里插入图片描述

①系统时钟的设置
双击System Contents中的clk_0

在这里插入图片描述

②Nios II Processor的添加
在搜索框中,输入nio,找到Nios II Processor,点击Add

在这里插入图片描述

保持默认配置,选择Finish

在这里插入图片描述

③On_Chip Memory的添加
在搜索框中,输入on_chip,找到On_Chip Memory,点击Add

在这里插入图片描述

设置大小为10K,其他保持默认设置

在这里插入图片描述

④JTAG UART的添加(作用:利用JTAG完成,URAT通信功能)
在搜索框中,输入jtag,找到JTAG UART,点击Add

在这里插入图片描述

⑤System ID Peripheral的添加(作用:为Nios II生成一个ID号)
在搜索框中,输入sys,找到System ID Peripheral,点击Add

在这里插入图片描述

保持默认设置

在这里插入图片描述

4.1.3 IP核的连接

clk,reset,datamaster需要和其他所有IP核连接,nios ii的指令端口(instruction_master)只与存储器进行连接,nios ii中的jtag_debug_model_reset与外部IP核进行连接 。jtag端口的中断信号的连接,其中0表示中断的优先级(可以进行设置)
在这里插入图片描述

对Reset Vector和Exception Vector的设置
设置完成后,选择Finish

在这里插入图片描述

系统分配地址
选择System->Assign Base Address

在这里插入图片描述

4.1.4使用FPGA资源

选择Generate->Generate,保持默认设置,点击Generate,选择Save
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

创建顶层文件
回到Quarters,选择New->Verilog HDL File

在这里插入图片描述

顶层文件内容

module hello_world(input clk,input reset_n
);
//此处的代码可以通过Qsys中的Generate->Generate Example,复制里面的内容,粘贴到此处,进行相应的修改
system u_qsys (.clk_clk       (clk),       //   clk.clk.reset_reset_n (reset_n)  // reset.reset_n);endmodule

手动添加上面创建的系统

在这里插入图片描述

选择File->添加对应的文件->Add->Apply->关闭

在这里插入图片描述

编译完成后,分配管脚

在这里插入图片描述

再次进行编译,成功后即可完成本阶段操作。

4. 2软件设计

4.2.1 打开软件

打开Nios II Software Build Tools for Eclipse

在这里插入图片描述

4.2.1 创建文件

点击File->New->Nios II Application and BSP from Template

在这里插入图片描述

选择硬件设计部分的文件,填写工程名称以及工程Template

在这里插入图片描述

4.2.3 修改实现代码

打开hello_world中的.c文件
修改里面的内容如下

流水灯

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
const alt_u8
led_data[8]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};
int main (void)
{int count=0;alt_u8 led;volatile int i;while (1){ if (count==7){count=0;}else{count++;}led=led_data[count];IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);i = 0;while (i<500000)i++;}return 0;
}

串口输出

#include "system.h"int main (void)
{volatile int i;while (1){printf("Hello from Nios II! 你干嘛,哎哟~~~ \n");i = 0;while (i<5000000)i++;}return 0;
}

点击保存,选择hello_wold_bsp,右键后,选择Nios II中的Generate BSP

在这里插入图片描述

在这里插入图片描述

再次编译

在这里插入图片描述

4.2.4 代码烧录

在这里插入图片描述

在这里插入图片描述

五、实验效果

1.流水灯

流水灯

2.串口输出字符

串口

六、实验心得

经过本次实验,我成功设计并实现了基于Nios II软核的FPGA流水灯控制和串口数据输出模块。这一过程不仅加深了我对Nios II软核处理器及其与硬件描述语言结合应用的理解,也锻炼了我的编程能力和硬件调试技巧。

实验过程回顾:

  1. Nios II软核与Qsys系统设计: 我首先利用Qsys工具,将Nios II软核与所需的外围设备进行集成,创建了一个定制化的系统。通过这一步骤,我学习了如何在系统级别上进行设计,并对Nios II软核的可配置性有了更深入的认识。
  2. 流水灯控制逻辑实现: 我编写了C代码来控制FPGA上的LED灯,实现了流水灯效果。这一过程中,我练习了基本的输入输出操作和时间控制逻辑,理解了如何通过软件控制硬件行为。
  3. 串口通信编程与实现: 我实现了一个波特率发生器,并编写了用于串口数据发送的状态机逻辑。通过实例化uart_tx模块,我掌握了串口信号的输出控制,包括数据位的串行化和波特率的匹配。
  4. 硬件与软件的协同调试: 在整个实验过程中,我不断在硬件描述语言的硬件实现与Nios II软件编程之间进行切换和调试,这一经历极大地提升了我的综合设计能力。

实验成果:

通过本次实验,我不仅掌握了Nios II软核处理器的编程技巧,还学会了如何将理论知识应用到实际的硬件设计中。我能够独立完成从设计、仿真到硬件测试的整个FPGA设计流程,并且能够通过外部串口工具接收发送的数据。

实验反思:

在实验过程中,我遇到了一些挑战,包括数据时序的准确性以及串口通信的调试。通过不断测试和调整,我学会了如何对FPGA设计进行调试,解决可能出现的问题。这一过程锻炼了我的问题解决能力,也增强了我面对复杂问题时的耐心和信心。

未来展望:

尽管本次实验已经完成,但我意识到在FPGA设计和嵌入式系统开发方面还有许多值得学习和探索的地方。未来,我计划深入学习更高级的FPGA设计技术,探索更多的通信协议和接口,并将这些技术应用到更大型的项目中。

感谢与致谢:

最后,我要感谢所有在本次实验中提供帮助和支持的同学和老师,以及那些提供友情链接和资源的朋友们。是你们的帮助让这次学习之旅更加丰富和有趣。

最后感谢大佬友情链接:

  • 基于NIOS-II软核流水灯实现_nios中断实验-CSDN博客
  • 基于Nios II的hello world_利用nios ii跑一个hello world-CSDN博客

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

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

相关文章

VMware虚拟机故障:“显示指定的文件不是虚拟磁盘“,处理办法

一、故障现象 由于虚拟机宕机&#xff0c;强制重新启动虚拟机后显示错误&#xff0c;没有办法启动虚拟机。 虚拟机有快照&#xff0c;执行快照还原&#xff0c;结果也不行&#xff0c;反复操作&#xff0c;在虚拟机文件目录出现很多莫名文件 二、故障原因 根据故障提示&#…

数据结构(C):玩转链表

目录 &#x1f37a;0.前言 1.链表的概念 2.链表的分类 2.1带头不带头 2.2单向和双向 2.3循环和不循环 2.4主要使用的链表 3.链表的实现 3.1申请一个链表 3.2头插和尾插 3.2.1函数的形参问题 3.2.2二级指针问题解决 3.3头删和尾删 3.4打印链表 3.5查找 3.5销…

【谷粒商城】03创建商品模块

1.创建模块 2.创建项目微服务 商品服务、仓储服务、订单服务、优惠券服务、用户服务 共同&#xff1a; 1&#xff09;、web、openfeign 2&#xff09;、每一个服务&#xff0c;包名 com.atguigu.gulimall.xxx(product/order/ware/coupon/member) 3&#xff09;、模块名&#x…

​《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制德国每日风能和太阳能产量3D线图

在MATLAB中&#xff0c;要绘制3D线图&#xff0c;可以使用 plot3 函数。 在《MATLAB科研绘图与学术图表绘制从入门到精通》书中通过绘制德国每日风能和太阳能产量3D线图解释了如何在MATLAB中绘制3D线图。 购书地址&#xff1a;https://item.jd.com/14102657.html

完美解决Windows10下-更换JDK环境变量后,在cmd下执行仍java -version然出现原来版本的JDK的问题

一、错误场景预演 本人欲将 JDK 1.8 通过安装包的方式升级为 JDK 22。 本地旧版本&#xff1a;1.8.0_221预升级版本&#xff1a;22.0.1 1.1、查看本地旧版本 在配置环境变量之前&#xff0c;首先我们要明确&#xff0c;本地存在旧版本&#xff0c;如果本地没有 Java&#x…

MFC通过继承现有控件自定义控件

在MFC 自定义控件&#xff0c;可以通过继承MFC提供的控件类&#xff08;如CButton、CEdit、CListBox等&#xff09;并重写其成员函数和消息处理函数来实现。 以下是一个基本的步骤指南&#xff0c;用于在MFC中创建自定义控件&#xff1a; 确定要继承的基类&#xff1a; 首先…

vm16安装最新版本的ubuntu虚拟机,并安装g++的步骤记录

背景 低版本的ubuntu安装G一直不成功&#xff0c;干脆安装最新版的 官网下载 bing搜索ubuntu 下载完成 vm16新建虚拟机 一直下一步&#xff0c;安装完成 终端输入命令 sudo apt-get update ᅟᅠ       sudo apt install gcc ᅟᅠ      sudo apt install g

树莓派点亮FPGA小灯

树莓派点亮FPGA小灯 引言&#xff1a; ​ 本次实验的目的是通过树莓派和FPGA之间的串口通信&#xff0c;控制FPGA开发板上的小灯。实验将展示如何使用树莓派发送特定的字符信号&#xff0c;通过串口传输至FPGA&#xff0c;并在FPGA上实现逻辑解析&#xff0c;以点亮指定的小灯。…

【QT】QT背景介绍

本专栏内容为&#xff1a;QT学习专栏 通过本专栏的深入学习&#xff0c;你可以了解并掌握QT。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;QT &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f…

3D分子生成的定制扩散框架 MolDiff - 评测

MolDiff模型是一种考虑分子键生成的3D分子生成的新模型。MolDiff是清华大学智能产业研究院马剑竹课题组发表在PMLR 2023的工作&#xff0c;第一作者是Xingang Peng&#xff0c;文章题目为&#xff1a;《 Addressing the Atom-Bond Inconsistency Problem in 3D Molecule Genera…

【Android】Kotlin学习之数据容器 -- 集合

一. 定义 List : 是一个有序列表, 可通过下标访问元素. 元素可以在list中出现多次, 元素可重复 Set : 是元素唯一的集合, 一般来说Set中元素的顺序并不重要, 无序集合. Map : 是一组键值对, 键是唯一的, 每个键刚好映射到一个值, 值可以重复 二. 集合创建 三. 示例 mutabl…

OSTE-Web-Log-Analyzer:基于Python的Web服务器日志自动化分析工具

关于OSTE-Web-Log-Analyzer OSTE-Web-Log-Analyzer是一款功能强大的Web服务器日志自动化分析工具&#xff0c;该工具专为安全研究人员设计&#xff0c;能够使用Python Web日志分析工具&#xff08;Python Web Log Analyzer&#xff09;帮助广大研究人员以自动化的形式实现Web服…

推导 模型矩阵的逆转置矩阵求运动物体的法向量

一个物体表面的法向量如何随着物体的坐标变换而改变&#xff0c;取决于变换的类型。使用逆转置矩阵&#xff0c;可以安全地解决该问题&#xff0c;而无须陷入过度复杂的计算中。 法向量变化规律 平移变换不会改变法向量&#xff0c;因为平移不会改变物体的方向。 旋转变换会改…

栈和队列的相互实现

1. 两个队列实现栈. - 力扣&#xff08;LeetCode&#xff09; 队列的特点是先进先出&#xff0c;而栈的特点是后进先出&#xff08;先进后出&#xff09;&#xff0c;也就是说重点在于利用两个队列来改变“出”的顺序。 假设我们在进行入栈操作的时候将数据依次入到一个队列中…

python如何单步调试

Python怎么单步调试&#xff1f;下面给大家介绍一下单步调试&#xff1a; 方法一&#xff1a;执行 python -m pdb myscript.py (Pdb) 会自己主动停在第一行。等待调试&#xff0c;这时你能够看看帮助。 方法二&#xff1a;在所调试程序的开头中&#xff1a;import pdb 并在你…

民航电子数据库:数据库的备份与恢复

目录 前言备份库级逻辑备份示例 恢复库级的逻辑恢复示例 前言 民航电子数据库的备份与恢复 备份 库级逻辑备份 备份目标库下所有的对象 。 因此 &#xff0c;库级逻辑备份需要由备份库的管理员&#xff08;SYSDBA&#xff09;登录至备份目标库进行操作。 语法格式 &#xff1…

商家转账到零钱怎么开通?一步步教你玩转微信营销新利器

在数字化营销日新月异的今天&#xff0c;微信支付凭借其便捷、安全的特点&#xff0c;成为了商家不可或缺的支付工具。而其中的“商家转账到零钱”功能&#xff0c;更是为商家提供了一个全新的营销利器。今天&#xff0c;我们就来详细解读一下如何开通这一功能&#xff08;我处…

怎么制作流程图?介绍制作方法

怎么制作流程图&#xff1f;在日常生活和工作中&#xff0c;流程图已经成为我们不可或缺的工具。无论是项目规划、流程优化&#xff0c;还是学习理解复杂系统&#xff0c;流程图都能帮助我们更直观地理解和表达信息。然而&#xff0c;很多人可能并不清楚&#xff0c;其实制作流…

通过 Java 操作 redis -- zset 有序集合基本命令

目录 使用命令 zadd&#xff0c;zrange 使用命令 zcard 使用命令 zrem 使用命令 zscore 使用命令 zrank 关于 redis zset 有序集合类型的相关命令推荐看Redis - Zset 有序集合 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Jav…

探索智慧推理:线上剧本杀小程序引领新潮流

随着科技的飞速发展&#xff0c;线上剧本杀小程序作为一种新兴的数字娱乐形式&#xff0c;正以其独特的魅力引领着新潮流&#xff0c;并在内容创造上展现出无限的潜力。这种融合了角色扮演、推理解谜和社交互动的游戏模式&#xff0c;不仅为用户带来了沉浸式的体验&#xff0c;…