DE2-115开发板基于verilog和nioⅡ的流水灯实现

news2024/11/28 8:50:15

目录

  • 一、 内容概要
  • 二、 实现
    • 2.1 基于Nios II软核的流水灯
      • 2.1.1 准备工作
      • 2.1.2 工程搭建
      • 2.1.3 硬件代码设计
        • Ⅰ 连接IP核
        • Ⅱ 编写代码
        • Ⅲ 各种配置
      • 2.1.4 软件代码设计
        • Ⅰ 环境构建
        • Ⅱ 编写代码
      • 2.1.5 代码下载
        • Ⅰ 硬件下载
        • Ⅱ 软件下载
      • 2.1.6 运行结果
    • 2.2 Verilog流水灯
  • 三、 心得体会
  • 四、 参考链接

一、 内容概要

在DE2-115开发板上分别用 Verilog和 Nios软件编程两种方式完成LED流水灯显示,理解两种方式的差异

二、 实现

2.1 基于Nios II软核的流水灯

2.1.1 准备工作

  1. Quartus II
  2. DE2-115开发板
    在这里插入图片描述

2.1.2 工程搭建

  1. 打开Quartus,新建一个工程
    按照图片进行如下选择
    在这里插入图片描述
    在这里插入图片描述
    选择芯片
    在这里插入图片描述
    finish

2.1.3 硬件代码设计

Ⅰ 连接IP核

类似于以可视化界面的方式进行verilog里面的通过顶层文件连接各模块操作

找到platform Designer,某些版本可能是 Qsys
在这里插入图片描述

首先设置时钟
在这里插入图片描述
默认即为50MHZ,设置好后点右下角finish
在这里插入图片描述
左侧通过搜索栏进行搜索,添加以下模块:

Nios Ⅱ Processor (nios软核处理器)
On-Chip Memory (储存器)
JTAG UART (JTAG、UART)
System ID Peripheral (为Nios II生成一个ID号)
pio (流水灯管脚)

在这里插入图片描述
先全部点Finish保持默认
在这里插入图片描述
在这里插入图片描述
三连击Name标签下的属性可以修改名称:
在这里插入图片描述
略微修改了一下名字
在这里插入图片描述

连接模块:

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

在这里插入图片描述

接下来进行参数配置(右键模块点击edit)

  1. On-chip Memory
    设置为10k(10240)
    在这里插入图片描述
  2. nios
    在这里插入图片描述
  3. PIO
    将width设置为4表示4个Led灯
    在这里插入图片描述
    把管教名设置为led
    在这里插入图片描述

然后系统分配地址
在这里插入图片描述
完成后就不报错了
在这里插入图片描述
最后点击右下角Generate生成
在这里插入图片描述
在这里插入图片描述
然后等待
在这里插入图片描述
完成后一路finish

Ⅱ 编写代码

回到Quartus,新建一个verilog文件
在这里插入图片描述
在这里插入图片描述
写入代码

module led_ctrl(
	input clk,
	input reset_n,
	output  [3:0] led
);
Ⅲ 各种配置

在这里插入图片描述
找到生成的文件添加
在这里插入图片描述
找到这个总文件,根据管脚信息在之前写的代码里面加入:

demo2_waterled u0 (
        .clk_clk       (clk),       //   clk.clk
        .reset_reset_n (reset_n), // reset.reset_n
        .led_export    (led)     //   led.export
    );

在这里插入图片描述
这样完整的代码即为:

module led_ctrl(
	input clk,
	input reset_n,
	output  [3:0] led
);

demo2_waterled u0 (
        .clk_clk       (clk),       //   clk.clk
        .reset_reset_n (reset_n), // reset.reset_n
        .led_export    (led)     //   led.export
    );

endmodule

配置一下管脚

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后进入Dual-purpose Pins,全部设置为Use as regular I/O
在这里插入图片描述
然后编译一下
在这里插入图片描述
然后分配一下管脚
在这里插入图片描述
重新编译

2.1.4 软件代码设计

Ⅰ 环境构建

通过此处打开eclipse
在这里插入图片描述
自己选定一个工作空间(不一定是当前项目目录)
进入初始界面后创建文件
在这里插入图片描述
在这里插入图片描述
点击NEXT
在这里插入图片描述
点击Finish
完成后找到这个文件
在这里插入图片描述

Ⅱ 编写代码

把hello_world.c的代码修改为:

#include <stdio.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
const alt_u8
led_data[4]={0x01,0x03,0x07,0x0F};
int main (void) {
 int count=0;
 alt_u8 led;
 volatile int i;
 while (1)
  {
 	 if (count==4)
 	 {
 		 count=0;
 	 }
 	 else
 	 {
 		 count++;
 	 }
 	 led=led_data[count];
 	 IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, led);
 	 //延时的设置
 	 i = 0;
 	 while (i<5000000)
 		 i++;
   }	
 return 0;
}

保存

而后右键waterled_bsp,再Nios II 中选择BSP Editor进行如下配置:

在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0697eb0f10f54a1f95cc607c7c6d28bc.png在这里插入图片描述
在这里插入图片描述

选择Generate BSP
在这里插入图片描述
然后右键waterled,选择build project
在这里插入图片描述
完成
在这里插入图片描述

2.1.5 代码下载

Ⅰ 硬件下载

在这里插入图片描述
在这里插入图片描述

Ⅱ 软件下载

回到eclipse,右键waterled,选择Run As中的Nios II Hardware
在这里插入图片描述
刷新一下
在这里插入图片描述
然后先apply再run
在这里插入图片描述

2.1.6 运行结果

在这里插入图片描述

2.2 Verilog流水灯

直接编写Verilog代码

module led_ctrl(input En,input CP,input Dn,output reg [0:7] Out);//匹配8个灯,故宽度为8
reg [25:0] cnt;
reg cnt1;
reg Cn;
parameter cnt_max = 26'd49_999_999;//时钟的频率是50mhz,要实现几秒钟变一次就调到//相应时间,例子为1s每次

always@(posedge CP or negedge En)//该always循环实现的是一秒钟的计数
   if(En==1'b0)
 	cnt<=26'd0;
   else if(cnt == cnt_max)
	cnt<=26'd0;
   else 
	cnt<=cnt + 1'b1;
always @(posedge CP or negedge En) //cnt每次为1代表到了一秒钟
   if(En==1'b0)
 	cnt1<=1'b0;
   else if(cnt == cnt_max-1'd1)
	cnt1<=1'b1;
   else 
	cnt1<=1'b0;

always @(posedge CP or negedge En)
	if(En==1'b0) begin
	  if(Dn==1'b1)                  //用 Dn来判断赋不同的值,1为亮,也就可以实现两个灯一起移动的选择
 	     Out <=8'b00000001;
	  else
	     Out <=8'b00000011;
	 end
   else begin
	    if (Out[0]==1'b1)//不用判断整个Out,只需要判断最边上的1,为1则表示需要改变方向,方向由Cn判断
		      Cn<=1'b1;
		 else if(Out[7]==1'b1)
		      Cn<=1'b0;
	      if (cnt1==1'b1) begin
		      if(Cn==1'b1)
			       Out<={1'b0,Out[0:6]};//右移
			    else
			       Out<={Out[1:7],1'b0};//左移
			 end
   end


endmodule

管脚配置
在这里插入图片描述

正常编译烧录就行
结果:
在这里插入图片描述

三、 心得体会

·理解硬件与软件编程的差异:通过实践,我更深入地理解了硬件描述语言(如Verilog)和软件编程(如C语言)在FPGA设计中的应用差异。

·硬件编程的直观性:使用Verilog直接编程,可以直观地控制硬件行为,如LED的亮灭顺序,这种方式更接近底层硬件,对FPGA的资源利用和性能优化有更直接的控制。

·软件编程的便利性:Nios II软核提供了一个类似于通用处理器的环境,可以使用高级语言(如C语言)进行编程,这使得开发过程更加简便,代码更易于理解和维护。

·综合工具的重要性:无论是硬件还是软件编程,都需要依赖于综合工具(如Quartus II)来将设计部署到FPGA上。这些工具提供了图形界面和自动化流程,极大地提高了开发效率。

·学习曲线:Verilog编程可能对初学者来说有一定的难度,因为它需要对硬件电路有一定的理解。而Nios II软核编程则更容易上手,因为它使用的是更熟悉的编程语言和概念。

对比
·开发速度:使用Nios II软核进行软件编程通常开发速度更快,因为它允许开发者使用高级语言和现有的库函数。

·资源消耗:硬件编程(Verilog)通常对FPGA资源的消耗更少,因为它直接控制硬件,而软件编程可能需要更多的资源来运行软核处理器。

·性能:硬件编程可以实现更高的性能,因为它可以精细控制时序和并行操作,而软件编程可能受限于软核处理器的性能。

·灵活性与可移植性:软件编程在灵活性和可移植性方面具有优势,因为编写的软件可以在不同的硬件平台上运行,而硬件编程则更依赖于特定的FPGA架构。

·调试与测试:硬件编程的调试可能更复杂,需要使用仿真和硬件测试工具。软件编程则可以使用标准的调试工具,如Eclipse的调试器。

·应用场景:对于需要高性能和低延迟的应用,硬件编程可能更合适。而对于复杂的算法和数据处理任务,软件编程可能更加高效。

四、 参考链接

  1. https://blog.csdn.net/qq_43279579/article/details/115933154
  2. https://blog.csdn.net/m0_64791246/article/details/125114387
  3. https://blog.csdn.net/qq_31348733/article/details/101310105
  4. https://blog.csdn.net/qq_43279579/article/details/115953871

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

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

相关文章

LORA学习笔记2——训练集处理

前言 对于ai训练来说&#xff0c;处理训练集是模型训练的重要环节。训练集的质量对最终模型的质量影响巨大。这里以二次元角色为例&#xff0c;记录下训练集处理的流程和一些心得。 素材准备 素材准备有以下几个需要注意的点&#xff1a; 通常训练二次元角色需要30张以上的…

栈和队列(栈的详解)

目录 栈栈的实现栈的结构栈的初始化栈的销毁入栈出栈获取栈顶元素栈的判空获取栈的数据个数test.c(测试)总结 栈 栈也是线性表&#xff08;在逻辑上是顺序存储&#xff09;的一种&#xff0c;栈只允许其在固定的一端进行插入和删除&#xff0c;栈中的元素遵循后进先出&#xf…

Linux-笔记 开发板Uboot命令使用

将之前自学的知识整理了一下笔记&#xff0c;以便回忆 信息查询命令 1、help/?&#xff1a;查看所支持命令 > ? md md - memory displayUsage: md [.b, .w, .l] address [# of objects]2、bdinfo&#xff1a;查询板子信息 > bdinfo arch_number 0x00000000 boot_p…

多商户Docker Supervisor进程管理器部署

Dockerfile 根目录下没有Dockerfile的可以复制下面的命令 # 使用基础镜像 FROM leekay0218/crmeb-mer## 复制代码 ## 在本地调试注释掉&#xff0c;使用映射把文件映射进去 #ADD ./ /var/www# 设置工作目录 WORKDIR /var/www# 设置时区为上海 ENV TZAsia/Shanghai RUN ln -sn…

对数据进行标准化和归一化

数据的形式&#xff1a;保存在CSV中&#xff0c;第一列为姓名&#xff0c;第二列之后为特征。 标准化 输入文件的路径&#xff0c;设置保存转化后的文件路径 import pandas as pd from sklearn.preprocessing import StandardScaler# 读取CSV文件 data pd.read_csv(rC:\User…

开发时如何快速分析代码和生成测试方法(Baidu Comate插件帮我一键分析)

目录 前言 Baidu Comate智能编码助手简介 安装教程 使用RabbitMQ一个绑定队列方法进行演示 进行测试现有功能 使用感觉 测试结果 前言 因为在开发代码的时候&#xff0c;发现有很多都是废话也不是很想写注释 的&#xff0c;毕竟程序员最讨厌的两件事情&#xff0c;一…

Hikyuu高性能量化研究框架助力探索

Hikyuu Quant Framework 是一款基于C/Python的开源量化交易分析与研究工具&#xff0c;主要用于A股市场的交易策略分析与回测&#xff0c;目前不支持期货等&#xff0c;需要自行改造。 Hikyuu的目标 Hikyuu的最初目的是为了快速对A股全市场股票进行策略回测和验证&#xff0c…

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中&#xff0c;消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列&#xff08;Message Queue&#xff09;&#xff1a; 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时&#xff0c;系统会将生成的消息插入到消息队列中&…

C++11:常用语法汇总

目录 &#x1f341;统一的列表初始化 { }initializer_list &#x1f341;decltype 推导表达式类型&#x1f341;可变参数模板解析可变参数包方法一方法二 &#x1f341;lambda 表达式捕捉列表的使用运用场景举例lambda表达式 与 函数对象 &#x1f341;统一的列表初始化 { } 在…

电商购物系统首页的商品分类

如上图对商品的一个分类实际上和省市区的分类十分类似 , 都是通过自关联的方法来实现 , 但是这里不同的是 , 涉及到外键来获取数据 首先让我们来看一下最后通过后端返回数据的形式是什么样子的 """{1:{channels:[{id:1 , name:手机 , url:},{}{}],sub_cats:[{…

苍穹外卖面试总结

项目介绍 我完成了一个外卖项目&#xff0c;名叫苍穹外卖&#xff0c;是跟着黑马程序员的课程来自己动手写的。 项目基本实现了外卖客户端、商家端的后端完整业务。 商家端分为员工管理、文件上传、菜品管理、分类管理、套餐管理、店铺营业状态、订单下单派送等的管理、数据…

考研数学|强化阶段怎么刷《660》《880》《1000》?

强化阶段想要刷好题&#xff0c;首先要选一本适合自己的题集&#xff01; 一般在强化阶段&#xff0c;大家用多个最多的题集就是660题&#xff0c;880题还有1000题 660题的特点是只训练客观题&#xff0c;虽然题目的质量很高&#xff0c;但是训练面还是比较窄 880题是综合训…

【SpringBoot】 什么是springboot(二)?springboot操作mybatisPlus、swagger、thymeleaf模板

文章目录 SpringBoot第三章1、整合mybatsPlus1-234-67-10问题2、整合pageHelper分页3、MP代码生成器1、编写yml文件2、导入依赖3、创建mp代码生成器4、生成代码5、编写配置类扫描mapper类6、编写控制器类4、swagger1、什么是swagger2、作用3、发展历程4、一个简单的swagger项目…

ADC模-数转换原理与实现

1. 今日摸鱼计划 今天来学习一下ADC的原理&#xff0c;然后把ADC给实现 ADC芯片:ADC128S102 视频&#xff1a; 18A_基于SPI接口的ADC芯片功能和接口时序介绍_哔哩哔哩_bilibili 18B_使用线性序列机思路分析SPI接口的ADC芯片接口时序_哔哩哔哩_bilibili 18C_基于线性序列机的S…

MFC的句柄概念以及句柄类型

在MFC&#xff08;Microsoft Foundation Class&#xff09;桌面应用程序中&#xff0c;窗口是通过句柄&#xff08;Handle&#xff09;来进行管理和操作的。 句柄是一个标识符&#xff0c;用于唯一标识和引用窗口、控件、设备上下文等对象。在MFC桌面应用程序中&#xff0c;常…

mac -- Navicat premium for mac 12的安装破解过程

下载准备好dmg文件&#xff0c;接下来开始安装破解。 镜像在官网下载&#xff0c;复制打开链接可以直接下载&#xff0c;可以直接下载中文版&#xff0c;不需要汉化&#xff1a;&#xff08;下载包不能用&#xff0c;留言我发给你&#xff09; 英文64位&#xff1a; http://dow…

【0003day】VOSviewer分析

这个软件也可以用知网&#xff0c;也可以用web of science。 首先&#xff0c;需要创建数据。这个数据如何创建&#xff0c;需要参考对应的教程。&#xff08;本文以web of science为平台来做分析。&#xff09; 首先&#xff0c;创建对应的数据库。 一直下一步 让后选择完…

Linux重定向及缓冲区理解

重定向&#xff1a; 在上一期虚拟文件系统中讲到了每个进程在打开后&#xff0c;都会默认打开3个文件&#xff0c;如下&#xff1a; stdin 标准输入&#xff08;键盘&#xff09; 文件描述符&#xff1a;0 stdout 标准输出&#xff08;显示器&#xff09;文件描述符&a…

Boss让你设计架构图,你懵逼了,解救你的参考图来啦。

架构图是指用于描述系统或软件的结构和组成部分之间关系的图形表示。 它是一种高层次的图示&#xff0c;用于展示系统的组件、模块、接口和数据流等&#xff0c;以及它们之间的相互作用和依赖关系。架构图通常被用于可视化系统的整体设计和组织结构&#xff0c;帮助人们理解系…

分享10类正规的网上赚钱平台,让你摆脱单一收入

在这个互联网飞速发展的时代&#xff0c;你是否还在为单一的收入来源而焦虑&#xff1f;别担心&#xff0c;今天带你解锁10种网上赚钱的新姿势&#xff0c;让你的收入不再单一&#xff0c;甚至可能翻倍&#xff01; 1. 文库类&#xff1a;知识的变现 你知道吗&#xff1f;你的…