基于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博客

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

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

相关文章

综合能力 | 误差 | 学习笔记

误差指真值与观测值的差值。 误差分为系统误差&#xff08;消除方法&#xff1a;观测方法、仪器校正、修正等&#xff09;、偶然误差&#xff08;符合正态分布规律&#xff0c;进行计算纠正&#xff09;、粗差&#xff08;一般舍弃&#xff09;。 中误差&#xff08;均方差或标…

Linux进程——进程地址空间

前言&#xff1a;在讲完环境变量后&#xff0c;相信大家对Linux有更进一步的认识&#xff0c;而Linux进程概念到这也快接近尾声了&#xff0c;现在我们了解Linux进程中的地址空间&#xff01; 本篇主要内容&#xff1a; 了解程序地址空间 理解进程地址空间 探究页表和虚拟地址空…

决策树的学习(Decision Tree)

1.对于决策树的概念&#xff1a; **本质上&#xff1a;**决策树就是模拟树的结构基于 if-else的多层判断 2.目的&#xff1a; 对实例进行分类的树形结构&#xff0c;通过多层判断&#xff0c;将所提供的数据归纳为一种分类规则。 3.优点&#xff1a; 1.计算量小&#xff0c;…

华为配置Ethernet over GRE实现AC与无线网关之间的二层互通

华为配置Ethernet over GRE实现AC与无线网关之间的二层互通 组网图形 图1 通过Ethernet over GRE实现AC与无线网关之间的二层互通的组网图 组网需求数据规划配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;某企业通过无线网络为用户提供上网服务&#xff0c;其中A…

【35分钟掌握金融风控策略21】贷前额度策略

目录 贷前策略审批流程和统一额度管理 贷前策略审批流程 统一额度管理 预授信策略 贷前策略审批流程和统一额度管理 贷前包含了多个风控场景&#xff0c;这些风控场景的策略在执行时是否存在先后顺序呢&#xff1f;在贷前&#xff0c;除上述主要的风控场景&#xff0c;还有…

Flink DataSource介绍

介绍 Flink的Data Source&#xff08;数据源、源算子&#xff09;是Flink作业的起点&#xff0c;它定义了数据输入的来源。Flink可以从各种数据来源获取数据&#xff0c;例如文件系统、消息队列、数据库等。以下是对Flink Data Source的详细介绍&#xff1a; 概述&#xff1a…

ZigBee设备入网流程抓包分析(以飞利浦灯泡为例)

1.第一步&#xff0c;网关打开入网许可&#xff0c;广播Pjoin 2.第二步&#xff0c;设备开始扫网&#xff0c;发送Beacon Request 3.第三步&#xff0c;网关收到Beacon Request请求后&#xff0c;应答Beacon数据帧 4.收到可入网的Beacon帧后&#xff0c;发送关联请求&#xff0…

Java的时间类

1. 日期类 1.1 第一代日期类 1) Date: 精确到毫秒&#xff0c;代表特定的瞬间 2) SimpleDateFormat: 格式和解析日期的类 SimpleDateFormat 格式化和解析日期的具体类。它允许进行格式化(日期-→>文本)、解析(文本->日期)和规范化. import java.text.ParseExce…

Android AOSP Ubuntu源码编译电脑卡顿问题定位解决

文章目录 问题概述分析问题解决问题查看交换分区创建交换分区删除交换分区调整交换分区的活跃度 问题概述 开发SystemUI时&#xff0c;使用内存为16G的主机&#xff0c;Ubuntu 20.04的系统编译SystemUI的源码&#xff0c;编译的过程中发现电脑卡顿&#xff0c;鼠标不能移动。必…

在Linux上安装并运行RabbitMQ

目录 准备CentOS服务器 下载rabbit-server和erlang文件 启动RabbitMQ服务 准备CentOS服务器 两个命令&#xff0c;选一个能用的&#xff0c;查看CentOS服务器的版本 lsb_release -a下载rabbit-server和erlang文件 参考文章&#xff1a;http://t.csdnimg.cn/t8BbM 1、创建新…

IPv6资产测绘哪家强?揭秘新一代网络空间资产测绘平台的独门秘籍

网络空间资产测绘&#xff0c;即通过一系列技术手段&#xff0c;对网络中的各类资产进行全面的发现、分类和定位&#xff0c;为各类用户提供精准的数据支撑和决策依据。网络空间资产测绘作为一门新兴的交叉学科&#xff0c;融合了计算机网络技术、数据挖掘、人工智能、信息安全…

Mat: Unknown HPROF Version

问题&#xff1a;Mat 加载 android studio 导出的 hprof 文件失败 原因&#xff1a;android hprof 文件不是标准的 java hprof 文件 解决办法&#xff1a; 使用 android sdk 自带的命令将 hprof 转换成标准的 java hprof

去哪里找高清视频素材?推荐几个短视频素材免费网站

在数字时代&#xff0c;视频内容的质量直接影响观众的吸引力和留存率。尤其是高清、4K视频素材和可商用素材&#xff0c;它们在提升视觉质量和叙事深度方面起到了至关重要的作用。以下是一些国内外的顶级视频素材网站&#xff0c;它们提供的资源将为您的创作提供极大的支持和灵…

企业微信hook接口协议,ipad协议http,群发消息(每天每人一次)

群发消息&#xff08;每天每人一次&#xff09; 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信vids是long要发送的人或者群ididisroom是bool是否是群消息 请求示例 {"uuid":"xxxxxxxx","vids": [&qu…

渗透思考题

一&#xff0c;尝试登录。 客户端对密码进行哈希处理并缓存密码hash&#xff0c;丢弃实际的明文密码&#xff0c;然后将用户名发送到服务器&#xff0c;发起认证请求 密文存储位置&#xff1a;数据库文件位于C:WindowsSystem32configsam&#xff0c;同时挂载在注册表中的HKLMSA…

用python写算法——栈笔记

栈 栈的定义相关算法题 栈的定义 1.它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶&#xff0c;相对地&#xff0c;把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈&#xff0c;它是把新元素放到栈顶元素的上面&#xff0…

12个网上赚钱野路子信息差,人人可做的赚钱小项目!

在这个多元化的时代&#xff0c;副业已经成为许多人增加收入、实现自我价值的重要途径。今天&#xff0c;我们就来聊聊那些既有趣又能赚钱的副业项目&#xff0c;让你的钱包鼓起来&#xff01; 1.文字创作 写作不仅是情感的宣泄&#xff0c;更是财富的积累。无论是自媒体文、软…

【3dmax笔记】036:FDD修改器

一、FDD修改器简介 FDD修改器是对模型进行变形处理的命令,FDD后面的数字越大,编辑节点越多,编辑越精细,但是FDD控制点多的同时,模型上的节点也要多才可以。 FFD修改器是一种非常灵活的修改器,可以让我们对模型进行自由的变形操作。通过在FFD修改器中设置变形点,我们可…

HarmonyOS开发案例:【生活健康app之获取成就】(3)

获取成就 本节将介绍成就页面。 功能概述 成就页面展示用户可以获取的所有勋章&#xff0c;当用户满足一定的条件时&#xff0c;将点亮本页面对应的勋章&#xff0c;没有得到的成就勋章处于熄灭状态。共有六种勋章&#xff0c;当用户连续完成任务打卡3天、7天、30天、50天、…

域基础-NTLM协议

简介 NTLM(New Technology LAN Manager)协议是微软用于Windows身份验证的主要协议之一。继SMB、LM协议之后微软提出了NTLM协议&#xff0c;这一协议安全性更高&#xff0c;不仅可以用于工作组中的机器身份验证&#xff0c;又可以用于域环境身份验证&#xff0c;还可以为SMB、H…