基于Nios-II实现流水灯

news2024/10/7 5:27:28

基于Nios-II实现流水灯的主要原理

涉及到FPGA(现场可编程门阵列)上的嵌入式软核处理器Nios II与LED控制逻辑的结合。以下是详细的实现原理,分点表示并归纳:
Nios II软核处理器介绍:
Nios II是Altera公司推出的一种应用于Intel FPGA的32位RISC嵌入式处理器。
它拥有强大的性能和可定制特性,允许用户在FPGA内部构建多个处理器,以完成复杂系统的各项功能。
Nios II包括三种产品:Nios II/f(快速)、Nios II/s(标准)和Nios II/e(经济),分别对应不同的性能需求和FPGA使用量。
流水灯控制原理:
流水灯的实现依赖于LED灯和相应的控制逻辑。
通过Nios II软核处理器编写控制LED灯闪烁的用户程序代码,并将其固化在FPGA的片内ROM中执行。
变量、堆栈等空间使用FPGA的片内RAM,无需外部存储器。

基于Nios-II实现流水灯
1.新建项目,选择芯片


2.osys设计
2.1 进入Tools -> Platform Designer
2.2 设置时钟主频


2.3 添加Nios-II Processor并设置

在”Advanced Features”标签栏中保持默认设置,
在”MMU and MPU Settings”标签栏中保持默认设置,
在”JTAG Debug Module”标签栏中保持默认设置(注意勾选 Include JTAG Debug),
点击 Finish 回到 PD 界面。
将 nios2_qsys_0 重命名为 cpu,点击”Rename”即可重新命名,操作完成后如下图所示。



将 cpu 的 clk 和 reset 分别与系统时钟 clk_0 的 clk 和 clk_reset 相连。

2.4 添加JTAG并配置
左边选择JTAG_UART_Intel_FPGA_IP,点击Add。右键重命名为uart,并按图进行时钟线,复位线,数据线的连接:同时还要连接中断


2.5 添加RAM
选择On-Chip Memory (RAM or ROM) Intel FPGA,点击Add加入。


更改名字并连线

2.6 添加PIO

连接clk,reset,s1并导出输出端口:


这里将输出命名为out_led


2.7 添加System ID Peripheral


进行连接


2.8 其他设置
基地址分配:点击 PD 主界面菜单栏中的”System”下的”Assign Base Addresses”。


分配中断号:在”IRQ”标签栏下点选”Avalon_jtag_slave”和 IRQ 的连接点就会为”jtag_uart”核添加一个值为 0 的中断号。


指定 NIos II 的复位和异常地址:从”System Contents”标签栏
双击建立好的 cpu 进入 Nios II Processor 的配置界面,配置 Reset Vector 和 Exception Vector 为””onchip_ram.s1”,点击 Finish。点击 Qsys 主界面菜单栏中的”System”下的”Create Global Reset Network”。完成后会自动连接所有复位端口。生成HDL


3.Quartus设计
3.1 添加原理图文件


返回到Quartus页面,新建原理图文件:双击空白处,加入生成的bsf文件:

右键生成IO端口

3.2芯片引脚设置
(1)菜单里选择 Assignments-device,然后点击 Device pin options。
(2)进行 unused pin 设置,可能会收到外部信号的干扰,将未用引脚设置为 As input tri-stated。
在这里插入图片描述

3.3编译
回到 Quartus II 主界面后编译项目。如下图所示,编译成功后,点击 OK 完成。

点击下图所指快捷键进入 Pin Planner 界面,按照开发板提供的管脚名称分配针脚,下图所示:

4.软件部分设计
4.1.启动 Nios II SBT
tool->Nios II Software Build Tools for Eclipse

出现 Nios II SBT for Eclipse 主界面


4.2创建工程
建立新工程

在”SOPC Information File name”窗口中选择 kernel.sopcinfo 文件,以便将生成硬件配置信息和软件应用关联,CPU 栏会自动选择”CPU

会弹出问题,点击finish出现问题

回到Platform Designer,将on-chip ram的指令线也连上

4.3修改程序
在 hell_word.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;
}
编译工程
右键单击项目名称,在弹出的菜单中选择 Build Project

5.运行项目
启动 Quartus Prime Programmer并将sof文件烧录到板子


运行/调式程序
配置 Run Configurations,转到”Target Connection”标签栏,点击右侧的 Refresh Connections 将 USB-Blaster

加入Apply 后,Run。下载完成后,可以看见 Console 里打印信息“hello from Nios


”(第一段代码实现)流水灯实现:


IMG_4385

基于Verilog实现流水灯
1.Verilog代码撰写
module led #(parameter TIME_1_5s=75_000_000)(
    input             clk,
    input             rst_n,
    output  reg [3:0] led
);
    //parameter TIME_1_5s=75_000_000;
    reg [2:0] cnt;
    reg [26:0] cnt_1;
    wire add_cnt1;  
    wire end_cnt1;  
    wire add_cnt;
    wire end_cnt;
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_1<=27'b0;
        end
        else if(add_cnt1)begin                   
            if(end_cnt1)begin                    
                cnt_1<=1'b0;                        
            end
            else begin
                cnt_1<=cnt_1+1'b1;                  
            end
        end
        else begin
            cnt_1<=cnt_1;                        
        end
    end
    assign add_cnt1=1'b1;
    assign end_cnt1=add_cnt1&&cnt_1 ==TIME_1_5s-1;
 //   always @(posedge clk or negedge rst_n)begin
 //       if(!rst_n)begin
 //           led<=4'b0001;
 //       end
 //       else if(end_cnt1)begin
 //           led<={led[2:0],led[3]};
 //       end
 //       else begin
 //           led<=led;
 //       end
 //   end
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt<=1'b0;
        end
        else if(add_cnt)begin
            if(end_cnt)begin
                cnt<=1'b0;
            end
            else begin
                cnt<=cnt+1'b1;
            end
        end
        else begin
            cnt<=cnt;
        end
    end
    assign add_cnt=end_cnt1;
    assign end_cnt=add_cnt&&cnt==7;
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            led<=4'b1111;
        end
        else begin
            if(cnt==3'b000)begin
                led<=4'b0001;
            end
            else if(cnt==3'b001)begin
                led<=4'b0011;
            end
            else if(cnt==3'b010)begin
                led<=4'b0111;
            end
            else if(cnt==3'b011)begin
                led<=4'b1111;
            end
            else if(cnt==3'b100)begin
                led<=4'b1110;
            end
            else if(cnt==3'b101)begin
                led<=4'b1100;
            end
            else if(cnt==3'b110)begin
                led<=4'b1000;
            end
            else if(cnt==3'b111)begin
                led<=4'b0000;
            end
            else begin
                led<=4'b1111;
            end
        end
    end
endmodule


2.引脚绑定


3.烧录,运行

基于Nios-II实现流水灯的实验总结和心得

在基于Nios-II实现流水灯的实验的总结和心得。
实验准备阶段
在开始实验之前,我深入研究了Nios-II软核处理器的原理、特点和应用方法。我了解到Nios-II是Intel FPGA上的一种嵌入式处理器,具有高性能、可定制性强等优点。同时,我也熟悉了Quartus II、Platform Designer和Nios II SBT for Eclipse等开发工具的使用方法。
硬件设计
在硬件设计阶段,我使用Platform Designer工具在FPGA上搭建了一个包含Nios-II处理器、PIO(并行输入/输出)接口等组件的嵌入式系统。我选择了适当的FPGA芯片,并设置了合适的时钟频率。然后,我添加了必要的组件,并进行了相应的配置和连接。特别地,我通过PIO接口连接了8个LED灯,并配置了相应的输出端口。
软件设计
在软件设计阶段,我使用Nios II SBT for Eclipse工具创建了一个Nios II工程,并编写了C/C++代码以控制LED灯的闪烁。我通过PIO接口读取和写入数据,实现了对LED灯的亮灭状态的控制。为了实现流水灯效果,我采用了延时函数和循环语句相结合的方式。我调整了延时函数的时间参数,以控制LED灯闪烁的速度和顺序。
实验结果
将配置文件(.sof)和可执行文件(.elf)下载到FPGA后,我成功观察到了流水灯效果。LED灯按照预设的顺序依次亮起和熄灭,形成了循环变化的效果。这让我感到非常兴奋和满足,因为我不仅实现了预期的功能,还学到了很多实用的知识和技能。
三、实验心得与体会
深入理解嵌入式系统设计
通过这次实验,我深刻理解了嵌入式系统设计的复杂性和挑战性。在设计过程中,我需要考虑硬件和软件之间的协同工作、资源的合理分配以及性能的优化等方面的问题。这些经验对于我将来的学习和工作都非常重要。
掌握FPGA开发技术
通过这次实验,我掌握了FPGA开发技术的基本流程和工具使用方法。我了解了FPGA的工作原理、设计方法和优化技巧等方面的知识。这些技术对于我在未来的电子工程和嵌入式系统设计领域的发展具有重要意义。
提升实践能力和解决问题的能力
在实验过程中,我遇到了很多问题和挑战。但是通过不断地尝试、调试和修改代码,我最终成功地实现了流水灯效果。这个过程让我深刻体会到了实践能力和解决问题能力的重要性。我相信这些能力将对我未来的学习和工作产生积极的影响。
激发对电子工程的热爱
通过这次实验,我感受到了电子工程的魅力和乐趣。我喜欢通过编程和硬件设计来实现各种有趣的功能和效果。这种创造性和挑战性的工作让我感到非常兴奋和满足。我相信这种热爱将激励我在未来的学习和工作中更加努力和专注。

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

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

相关文章

Camtasia2024破解永久激活码注册码分享最新

随着数字时代的到来&#xff0c;视频制作已成为许多人日常生活和工作中不可或缺的一部分。而在众多视频编辑软件中&#xff0c;Camtasia凭借其强大的功能和易用性&#xff0c;赢得了广泛的用户喜爱。近期&#xff0c;Camtasia 2024的破解版本在网络上引起了广泛关注。本文旨在为…

外链建设如何进行?

理解dofollow和nofollow链接&#xff0c;所谓dofollow链接&#xff0c;就是可以传递权重到你的网站的链接&#xff0c;这种链接对你的网站排名非常有帮助&#xff0c;这种链接可以推动你的网站在搜索结果中的位置向上爬&#xff0c;但一个网站全是这种有用的链接&#xff0c;反…

scrapy爬取豆瓣书单存入MongoDB数据库

scrapy爬取豆瓣书单存入MongoDB数据库 一、安装scrapy库二、创建scrapy项目三、创建爬虫四、修改settings,设置UA,开启管道五、使用xpath解析数据六、完善items.py七、在douban.py中导入DoubanshudanItem类八、爬取所有页面数据九、管道中存入数据,保存至csv文件十、将数据写…

解决javadoc一直找不到路径的问题

解决javadoc一直找不到路径的问题 出现以上问题就是我们在下载jdk的时候一些运行程序安装在C:\Program Files\Common Files\Oracle\Java\javapath下&#xff1a; 一开始是没有javadoc.exe文件的&#xff0c;我们只需要从jdk的bin目录下找到复制到这个里面&#xff0c;就可以使用…

玄机平台应急响应—MySQL应急

前言 这个是比较简单的&#xff0c;其实和MySQL没啥太大的关系&#xff0c;没涉及太多MySQL的知识。看一下它的flag要求吧。 flag1 它说黑客写入的shell&#xff0c;那我们就去它的网站目录去看看&#xff0c;果然有一个叫sh.php的文件。 flag1{ccfda79e-7aa1-4275-bc26-a61…

excel中按多列进行匹配并对数量进行累加

公司的生产计划是按订单下发&#xff0c;但不同订单的不同产品中可能有用到相同的配件&#xff0c;按单1对1时&#xff0c;对计算机十分友好&#xff0c;但对于在配件库检料的工人来说就比较麻烦&#xff0c;上百条产品里可能会有多条都是相同的产品&#xff0c;首先考虑的办法…

Android采用Scroller实现底部二楼效果

需求 在移动应用开发中&#xff0c;有时我们希望实现一种特殊的布局效果&#xff0c;即“底部二楼”效果。这个效果类似于在列表底部拖动时出现额外的内容区域&#xff0c;用户可以继续向上拖动查看更多内容。这种效果可以用于展示广告、推荐内容或其他信息。 效果 实现后的…

回答网友的一个Delphi问题

网友想在grid 中 加一个水印&#xff0c;俺就给他写了个例子。先靠效果&#xff1a; 这个例子 包含下面几步&#xff1a; 1、创建背景 dg_bmp:Tbitmap.Create; w: Image1.Picture.Bitmap.width; h: Image1.Picture.Bitmap.height; dg_bmp.width: w*2; dg_bmp.height: …

[渗透测试学习] Runner-HackTheBox

Runner-HackTheBox 信息搜集 nmap扫描端口 nmap -sV -v 10.10.11.13扫描结果如下 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0) 80/tcp open http nginx 1.18.0 (Ubuntu) 8000…

算法day32

第一题 207. 课程表 步骤一&#xff1a; 通过下图的课程数组,首先画出DAG图&#xff08;有向无环图&#xff09; 步骤二&#xff1a; 其次我们按照DAG图&#xff0c;来构建该图的拓扑排序&#xff0c;等有效的点都按照规则排完序后&#xff0c;观察是否有剩下的点的入度不为0&…

基于VSCode和MinGW-w64搭建LVGL模拟开发环境

目录 概述 1 运行环境 1.1 版本信息 1.2 软件安装 1.2.1 下载安装VS Code 1.2.1.1 下载软件 1.2.1.1 安装软件 1.2.2 下载安装MinGW-w64 1.2.2.1 下载软件 1.2.2.2 安装软件 1.2.3 下载安装SDL 1.2.3.1 下载软件 ​1.2.3.2 安装软件 1.2.4 下载安装CMake 1.2.4.…

微服务链路追踪ELK

微服务链路追踪&ELK 链路追踪概述链路追踪sluthzipkinelk日志管理平台 一 链路追踪 1 概述 1.1 为什么需要链路追踪 ​ 微服务架构是一个分布式架构&#xff0c;它按业务划分服务单元&#xff0c;一个分布式系统往往有很多个服务单元。由于服务单元数量众多&#xff0…

紫光展锐5G处理器T750__国产手机芯片5G方案

展锐T750核心板采用6nm EUV制程工艺&#xff0c;CPU架构采用了八核设计&#xff0c;其中包括两个主频为2.0GHz的Arm Cortex-A76性能核心和六个主频为1.8GHz的A55小核。这种组合使得T750具备卓越的处理能力&#xff0c;并能在节能的同时提供出色的性能表现。该核心模块还搭载了M…

Kafka 如何保证消息顺序及其实现示例

Kafka 如何保证消息顺序及其实现示例 Kafka 保证消息顺序的机制主要依赖于分区&#xff08;Partition&#xff09;的概念。在 Kafka 中&#xff0c;消息的顺序保证是以分区为单位的。下面是 Kafka 如何保证消息顺序的详细解释&#xff1a; ⭕分区内消息顺序 顺序写入&#…

基于JSP技术的定西扶贫惠农推介系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;JSP 数据库&#xff1a;MySQL 技术&#xff1a;B/S架构、JSP技术 工具&#xff1a;Eclipse、MySQL、Tomcat 系统展示 首…

并查集C++

并查集的原理 并查集&#xff08;Union-Find Set&#xff09;。可以把每个连通分量看成一个集合&#xff0c;该集合包含了连通分量中的所有点。这些点两两连通&#xff08;连通性&#xff09;&#xff0c;而具体的连通方式无关紧要&#xff0c;就好比集合中的元素没有先后顺序之…

AI 客服定制:LangChain集成订单能力

为了提高AI客服的问题解决能力&#xff0c;我们引入了LangChain自定义能力&#xff0c;并集成了订单能力。这使得AI客服可以根据用户提出的问题&#xff0c;自动调用订单接口&#xff0c;获取订单信息&#xff0c;并结合文本知识库内容进行回答。这种能力的应用&#xff0c;使得…

java:spring使用【XXXPostProcessor】添加bean定义,修改bean定义、代理bean

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89433361 # 项目代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…

【pytest官方文档学习】覆盖全局变量的示例代码在8.2.x版本运行报错

我们经常会在conftest.py中定义一些fixture提供给测试方法使用&#xff0c;但是在有些测试中&#xff0c;我们用不上或者需要对其结果进行处理后再用&#xff0c;这时候&#xff0c;就需要我们对fixture进行覆盖或重写。 在学习pytest-8.2.x官方文档看到了它给出的覆盖全局fixt…