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

news2024/12/25 22:14:55

基于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.coloradmin.cn/o/1664894.html

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

相关文章

2016-2021年全国范围的2.5m分辨率的建筑屋顶数据

一、论文介绍 摘要&#xff1a;大规模且多年的建筑屋顶面积&#xff08;BRA&#xff09;地图对于解决政策决策和可持续发展至关重要。此外&#xff0c;作为人类活动的细粒度指标&#xff0c;BRA可以为城市规划和能源模型提供帮助&#xff0c;为人类福祉带来好处。然而&#xf…

WordPress原创插件:超链接点击访问统计

WordPress原创插件&#xff1a;超链接点击访问统计 https://download.csdn.net/download/huayula/89296775

ICode国际青少年编程竞赛- Python-4级训练场-while语句综合

ICode国际青少年编程竞赛- Python-4级训练场-while语句综合 1、 for i in range(4):while not Flyer[i].disappear():wait()Spaceship.step(6)Spaceship.turnLeft()2、 Dev.turnLeft() for i in range(4):Spaceship.step(2)while Flyer[i].disappear():wait()Dev.step(4)Dev.…

Go实现树莓派读取at24c02 eeprom读写数据

步骤 启用i2c 参考 Go实现树莓派读取bh1750光照强度 代码 package mainimport ("fmt""periph.io/x/conn/v3/i2c" )type AT24C02Device struct {dev *i2c.Dev }func NewAT24C02Device(addr uint16, bus i2c.BusCloser) (*AT24C02Device, error) {var (d…

【HDFS】关于HDFS-17497:在commit block时更新quota

链接:https://github.com/apache/hadoop/pull/6765 Ticket标题:The number of bytes of the last committed block should be calculated into the file length。 HDFS里,一个在写入的文件可能包含多个commited状态的块。 但是计算文件大小的时候,最后一个commited block并…

Yii2 自动生成php代码

文档地址&#xff1a;入门&#xff08;Getting Started&#xff09;: 用 Gii 生成代码&#xff08;Generating Code with Gii&#xff09; - Yii 2.0 权威指南 - 文档 - Yii Framework 中文网 找到配置文件&#xff0c;以我的项目为例&#xff1a; 因为的是开启了路由美化所以访…

大数据面试题第一期*4

题1、HDFS存储机制 &#xff08;1&#xff09;客户端向namenode请求上传文件 &#xff0c;namenode检查目标文件是否已存在 &#xff0c;父目录是否存在。 &#xff08;2&#xff09;namenode返回是否可以上传。 &#xff08;3&#xff09;客户端请求第一个 block上传到哪几个d…

JavaFX布局-HBox

JavaFX布局-HBox 常用属性alignmentspacingchildrenmarginpaddinghgrow 实现方式Java实现Xml实现 综合案例 HBox按照水平方向排列其子节点改变窗口大小,不会该部整体布局窗口太小会遮住内部元素&#xff0c;不会产生滚动条 常用属性 alignment 对齐方式 new HBox().setAlign…

Vue3人员选择组件封装

一、组件介绍 人员组件在各系统的应用都是比较广泛的&#xff0c;因此可以将其封装为可配置的人员组件&#xff0c;根据不同角色权限显示对应的人员供选择&#xff0c;代码目前只是一部分&#xff0c;需要源码的私聊。 二、直接上代码 use.vue 父组件 <div class&q…

OpenGL导入的纹理图片错位

在OpenGL中导入图片的纹理照片的函数为 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, p_w, p_h, 0, GL_BGR, GL_UNSIGNED_BYTE, pic_data);其中p_w, p_h为图片的宽和高&#xff0c;pic_data为指向图片存储空间的的地址(unsigned char *类型) 在OpenGL中图片默认是4字节对齐的&…

QCC3071/QCC3081/QCC3083/QCC3084/QCC5171/QCC5181/QCC3091/QCC3095平台LDAC解码

QCC3071/QCC3081/QCC3083/QCC3084/QCC5171/QCC5181/QCC3091/QCC3095平台LDAC解码 LDAC Decoder Evaluation Kit for QCC5181 and QCC5171 (The 5181 Kit) 随着Qualcomm DSP向下开放&#xff0c;QCC3071/QCC3081/QCC3083/QCC3084目前可以可以实现LDAC Decoder。 QCC3071/QCC3…

Scala编程入门:从零开始的完整教程

目录 引言环境准备创建第一个Scala项目基本语法高阶概念进阶资源结语 引言 Scala是一种强大的、静态类型的、多范式编程语言&#xff0c;它结合了面向对象和函数式编程的特点。本教程将指导您如何从零开始学习Scala&#xff0c;并搭建一个简单的开发环境。让我们开始探索Scala…

JavaEE初阶-多线程4

文章目录 一、单例模式1.1 饿汉模式1.2 懒汉模式 二、阻塞队列1.1 生产者消费者模型1.1.1 现实生活举例1.1.2 生产者消费模型的两个优势1.1.2.1 解耦合1.1.2.2 削峰填谷 1.2 阻塞队列代码1.2.1 使用java标准库的阻塞队列实现生产者消费者模型1.2.2 实现自己的阻塞队列 一、单例…

瑞芯微 rk3588 Linux系统备份还原 StepbyStep

1.系统备份 1.1 将瑞芯微平台嵌入式系统的root ssh 权限开通 step1:sudo vi /etc/ssh/sshd_config step2: 找到PermitRootLogin,把开关打开&#xff1a; PermitRootLogin yes step3:重启ssh服务 sudo systemctl restart sshd 1.2.使用瑞芯微的打包脚本把嵌入式系统系统打包 这…

类和对象中篇

类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情况下&#xff0c;都会自动生成下面6个默认成员函数 ①初始化和清理&#xff1a;构造函数和析构函数 ②拷贝复制&#x…

[Markdown]是时候该学学使用markdown写文章了

&#x1f495;&#x1f495;&#x1f495;欢迎各位来到我的博客&#xff0c;今天我们的主题是markdown&#xff0c;你将在这里学习到最全的markdown知识&#x1f495;&#x1f495;&#x1f495; 你还在使用富文本编辑器写文档或文章吗&#xff1f; 你还在用word一点一点地进行…

QX----mini51单片机学习---(7)矩阵键盘

目录 1矩阵键盘的识别 2相关c语言 3实践编程 1矩阵键盘的识别 假设按列扫描按下S6P30&#xff1a;0P34&#xff1a;1然后高流向低&#xff0c;P34&#xff1a;0&#xff0c;刚开始是0xf0&#xff1a;1111 0000 后面是0xe0&#xff1a;1110 0000 &#xff0c;当是0xe0能确…

基于Qt的Model-View显示树形数据

目标 用qt的模型-视图框架实现树型层次节点的显示&#xff0c;从QAbstractItemModel派生自己的模型类MyTreeItemModel&#xff0c;用boost::property_tree::ptree操作树型数据结构&#xff0c;为了演示&#xff0c;此处只实现了个只读的模型 MyTreeItemModel的定义 #pragma o…

论文 学习 Transformer : Attention Is All You Need

目录 概述&#xff1a; 对摘要的理解&#xff1a; 框架解析 按比例缩放的点积注意力 多头注意力机制 前馈神经网络与位置编码 概述&#xff1a; transformer 是一个encoder ——decoder 结构的用于处理序列到序列转换任务的框架&#xff0c;是第一个完全依赖自注意力机制…

基于Vue3与ElementUI Plus的酷企秀场景可视化DIY设计器探索(更新版)

一、引言 在当今数字化快速发展的时代&#xff0c;企业对于展示自身形象、产品细节以及提升客户体验的需求日益增强。酷企秀场景可视化DIY设计器&#xff0c;以其强大的功能和灵活的定制性&#xff0c;为企业提供了从VR全景展示到地图可视化、电子画册制作等一系列数字化解决方…