【正点原子FPGA连载】 第十七章 呼吸灯实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

news2025/1/20 5:51:46

1)实验平台:正点原子MPSoC开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html

第十七章 呼吸灯实验

呼吸灯最早由苹果公司发明并应用于笔记本睡眠提示上,其一经展出,立刻吸引众多科技厂商争相效仿,并广泛用于各种电子产品中,尤其是智能手机。呼吸灯其实是在微处理器的控制下,由暗渐亮、然后再由亮渐暗,模仿人呼吸方式的LED灯。
本章分为以下几个章节:

81010.1呼吸灯简介

10.2实验任务
10.3硬件设计
10.4程序设计
10.5下载验证

10.1呼吸灯简介
呼吸灯采用PWM的方式,在固定的频率下,通过调整占空比的方式来控制LED灯亮度的变化。PWM(Pulse Width Modulation),即脉冲宽度调制,它利用微处理器输出的PWM信号,实现对模拟电路控制的一种非常有效的技术,广泛应用于测量、通信、功率控制等领域。
在由计数器产生的固定周期的PWM信号下,如果其占空比为0,则LED灯不亮;如果其占空比为100%,则LED灯最亮。所以将占空比从0到100%,再从100%到0不断变化,就可以实现LED灯的“呼吸”效果。
PWM占空比调节示意图如下图所示:
在这里插入图片描述

图 10.1.1 呼吸灯PWM占空比示意图
由上图可知,LED高电平的时间由长渐渐变短,再由短渐渐变长,如果LED灯是高电平点亮,则LED灯会呈现出亮度由亮到暗,再由暗到亮的过程。
10.2实验任务
本节实验任务是使用正点原子DFZU2EG/4EV MPSoC开发板上的PL LED1,实现呼吸灯的效果,即由灭渐亮,然后再由亮渐灭。
10.3硬件设计
发光二极管的原理图如下图所示,其阴极通过330欧姆的电阻连到地(GND),阳极与ZYNQ的IO相连,LED与地之间的电阻起到限流作用。当PL_LED1输出高电平时,点亮LED灯,当PL LED1输出低电平时,LED灯熄灭。
在这里插入图片描述

图 10.3.1 呼吸灯硬件原理图
本实验中,系统时钟、按键复位以及LED端口的管脚分配如下表所示:
表 10.3.1 呼吸灯实验管脚分配
信号名 方向 管脚 端口说明 电平标准
sys_clk_p input AE5 系统差分输入时钟 DIFF_HSTL_I_12
sys_clk_n input AF5 系统差分输入时钟 DIFF_HSTL_I_12
sys_rst_n input AH11 PL复位按键,低有效 LVCMOS33
led output AE10 PL LED1 LVCMOS33
对应的XDC约束语句如下所示:
#IO管脚约束
#时钟周期约束
create_clock -name sys_clk_p -period 10.000 [get_ports sys_clk_p]
#时钟
set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_p]
set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_n]
set_property PACKAGE_PIN AE5 [get_ports sys_clk_p]
set_property PACKAGE_PIN AF5 [get_ports sys_clk_n]
#复位
set_property -dict {PACKAGE_PIN AH11 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
#LED灯
set_property -dict {PACKAGE_PIN AE10 IOSTANDARD LVCMOS33} [get_ports led]
10.4程序设计
本次实验的模块端口及结构框图如下图所示。
在这里插入图片描述

图 10.4.1 模块端口及信号连接图
周期信号计数器用于产生驱动LED的脉冲信号,本次实验的周期信号频率为1Khz,其占空比由后级逻辑在每个周期之后进行递增或递减,最后再对当前计数值和占空比计数值进行比较,以输出占空比可调的脉冲信号。
呼吸灯代码如下:

1  module breath_led(
2      input   sys_clk_p,    //系统差分输入时钟
3      input   sys_clk_n,    //系统差分输入时钟
4      input   sys_rst_n,    //复位信号
5  
6      output  led           //LED
7  );
8  
9  //reg define
10 reg  [16:0]  period_cnt ;   //周期计数器频率:1khz 周期:1ms  计数值:1ms/10ns=100000
11 reg  [16:0]  duty_cycle ;   //占空比数值
12 reg          inc_dec_flag ; //0 递增  1 递减
13 
14 //*****************************************************
15 //**                  main code
16 //*****************************************************
17 
18 //转换差分信号
19 IBUFDS diff_clock
20 (
21 	.I (sys_clk_p),    //系统差分输入时钟
22 	.IB(sys_clk_n),    //系统差分输入时钟
23 	.O (sys_clk)       //输出系统时钟
24 ); 
25 
26 //根据占空比和计数值之间的大小关系来输出LED
27 assign   led = (period_cnt >= duty_cycle) ?  1'b1 : 1'b0;
28 
29 //周期计数器
30 always @(posedge sys_clk or negedge sys_rst_n) begin
31     if(!sys_rst_n)
32         period_cnt <= 17'd0;
33     else if(period_cnt == 17'd100000)
34         period_cnt <= 17'd0;
35     else
36         period_cnt <= period_cnt + 1'b1;
37 end
38 
39 //在周期计数器的节拍下递增或递减占空比
40 always @(posedge sys_clk or negedge sys_rst_n) begin
41     if(!sys_rst_n) begin
42         duty_cycle   <= 17'd0;
43         inc_dec_flag <= 1'b0;
44     end
45     else begin
46         if(period_cnt == 17'd100000) begin      //计满1ms
47             if(inc_dec_flag == 1'b0) begin      //占空比递增状态
48                 if(duty_cycle == 17'd100000)    //如果占空比已递增至最大
49                     inc_dec_flag <= 1'b1;       //则占空比开始递减
50                 else                            //否则占空比以50为单位递增
51                     duty_cycle <= duty_cycle + 17'd50;
52             end
53             else begin                           //占空比递减状态
54                 if(duty_cycle == 17'd0)          //如果占空比已递减至0
55                     inc_dec_flag <= 1'b0;        //则占空比开始递增
56                 else                             //否则占空比以50为单位递减
57                     duty_cycle <= duty_cycle - 17'd50;
58             end
59         end
60     end
61 end
62 
63 endmodule

第30-37行是1KHz周期信号的计数器,用于产生1KHz的LED驱动信号。第31-52行的always块为占空比设定模块,每次计数完了一个周期,就根据递增/递减标志来对占空比计数值(duty_cycle)进行递增/递减50个计数值,这个递增或者递减的数值大小可以用来控制呼吸灯的呼吸频率。
如果占空比计数值(duty_cycle)已经递增到了最大,则呼吸灯已经处于最亮的状态,接下来开始递减;反之,如果占空比计数至已经递减到了最小,即0,则呼吸灯处于熄灭的状态,接下来开始递增;如此循环往复,最终实现了流水灯的效果。
在代码的第27行通过组合逻辑把当前的周期计数值和占空比计数值进行比较,来判断LED的输出电平。在一个周期内,如果当前的周期计数值小于等于占空比计数值,则LED输出高电平,即点亮;如果当前的周期计数值大于占空比计数值,则LED输出低电平,即熄灭。
10.5下载验证
编译工程并生成比特流.bit文件。将下载器一端连接电脑,另一端与开发板上的JTAG下载口连接,然后连接电源线,最后将开发板的电源拨码开关按键往电源指示灯的方向拨动对开发板进行上电,上电成功后开发板的电源指示灯会亮蓝灯。
点击Vivado左侧“Flow Navigator”窗口最下面的“Open Hardware Manager”,此时Vivado软件识别到下载器,点击“Hardware”窗口中“Progam Device”下载程序,在弹出的界面中选择“Program”下载程序。
程序下载完成后,可以看到开发板的PL LED1灯由暗慢慢变亮,再由亮慢慢变暗,即呈现出“呼吸”的效果,如下图所示:
在这里插入图片描述

图 10.5.1 开发板实验现象

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

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

相关文章

队列的讲解和实现(图解+代码/C语言+循环队列OJ)

今天为大家分享的是队列的实现&#xff0c;本文主要介绍单向链表来模拟实现队列&#xff0c;最后给出力扣上一道循队列的OJ实现。 目录 一、图解队列的结构 二、模拟栈的分步实现 &#xff08;1&#xff09;队列的初始化 &#xff08;2&#xff09;队尾入队 &#xff08;3&…

【自学Python】Python比较运算符is和==区别

Python比较运算符is和区别 Python比较运算符is和区别教程 在 Python 中&#xff0c;比较运算符 is 和 is not 用于比较两个对象是否是同一个对象&#xff0c; 和 ! 用于比较两个 变量 的数据是否相等。 案例 比较数值型 数值型&#xff0c;使用 is 和 效果相同 print(&q…

Word控件Spire.Doc 【Table】教程(5):创建表格并在 Doc 文档中设置其边框

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

ROS2机器人编程简述新书推荐-A Concise Introduction to Robot Programming with ROS2

参考链接&#xff1a;https://github.com/fmrico/book_ros2封面&#xff1a;简介&#xff1a;ROS2机器人编程简明教程使用ROS2进行机器人编程的简明介绍为读者提供了通过编程实现机器人所需的概念和工具。它将使读者具备使用ROS2&#xff08;ROS的新版本&#xff09;进行项目所…

RT-Thread系列--内存堆MEMHEAP源码分析

一、目的在上一篇《RT-Thread系列--内存池MEMPOOL源码分析》我们介绍了RT-Thread的内存池MEMPOOL实现细节&#xff0c;包括内存池结构和内存块管理。本篇我们来分析一下RT-Thread的内存堆MEMHEAP的实现原理。内存堆MEMHEAP的特点&#xff1a;按需分配&#xff0c;需要多少内存就…

小伟婚后首次看望丈母娘,大衣哥准备了一大三轮车礼品,太豪横了

伴随着春节的临近&#xff0c;大衣哥的儿子小伟&#xff0c; 又一次迎来自己的高光时刻&#xff0c;他和未婚妻一起携手&#xff0c;步入了神圣的婚姻殿堂&#xff0c;大衣哥也长出一口气。儿子小伟再婚&#xff0c;大衣哥完成了一小半任务&#xff0c;接下来还要生孩子&#x…

【Python基础篇】Python中的七种数据类型

文章目录前导一、数字类型&#xff08;Number&#xff09;二、布尔类型&#xff08;Boolean&#xff09;三、字符串类型&#xff08;String&#xff09;3.1 字符串索引3.2 字符串截取、拼接和复用四、列表类型&#xff08;List&#xff09;4.1 in和not in4.2 len()4.3 添加/删除…

Three.js 打造酷炫的三角形

在前一章中&#xff0c;我们通过 BufferGeometry 创建了一个正方形&#xff0c;本节我们利用 BufferGeometry 打造一簇酷炫的三角形&#xff0c;最终的效果如下图所示&#xff1a; 从效果图中可以发现&#xff0c;每一个三角形的位置、大小、颜色都是随机的。 // 共有50个三角…

医疗影像工具LEADTOOLS 入门教程: 检测和提取机读旅行证件 - 控制台 C#

LEADTOOLS 是一个综合工具包的集合&#xff0c;用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中&#xff0c;是一项企业级文档自动化解决方案&#xff0c;有捕捉&#xff0c;OCR&#xff0c;OMR&#xff0c;表单识别和处理&#…

专注分布式架构 莱商银行的数字化转型实践

本文刊登于《金融电子化》杂志 2022 年 12 月下&#xff0c;作者魏汝浩为莱商银行首席信息官。2021 年 12 月 29 日&#xff0c;中国人民银行印发《金融科技发展规划&#xff08;2022—2025 年&#xff09;》&#xff08;银发〔2021〕335 号&#xff09;&#xff0c;提出新时期…

分享166个ASP源码,总有一款适合您

166个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/19W7FmY9nADL1Rge8e5uqiQ?pwdskhh 提取码&#xff1a;skhh import os import shutil import time from time import sleepimport requests from bs4 import BeautifulSoup from docx import Document from docx.sh…

Shader从入门到放弃(四) —— 绘制闪耀星际

前言 经过3个章节的学习&#xff0c;相信大家对shader编程也逐渐的有了一些感觉&#xff0c;所以这次我们玩个“大”的&#xff01;。 今天的学习内容是绘制“闪耀星际”&#xff0c;正如歌中唱的那样&#xff1a; 星际闪耀光影&#xff0c;落入你的眼睛&#xff0c;如迷人的…

Dubbo泛化调用

Dubbo泛化调用 1. 场景 场景一&#xff1a;我们要搭建一个统一的测试平台&#xff0c;可以让各个业务方在测试平台中通过输入接口、分组名、方法名以及参数值&#xff0c;在线测试自己发布的 RPC 服务。这时我们就有一个问题要解决&#xff0c;我们搭建统一的测试平台实际上是…

【论文速递】CVPR2022 - 泛化的小样本语义分割

【论文速递】CVPR2022 - 泛化的小样本语义分割 【论文原文】&#xff1a;Generalized Few-shot Semantic Segmentation 获取地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/Tian_Generalized_Few-Shot_Semantic_Segmentation_CVPR_2022_paper.pdf博…

【ROS2 入门】Jeston TX1 JetPack_4.6.3环境 ubuntu 18.04 ROS2 安装

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;在上一篇中&#xff0c;我们再虚拟机环境中安装了 ROS2 eloquent版本&#xff0c;并完成了初步的验证&#xff0c;但是做为一个偏硬件的博主&a…

nginx禁止外网访问

1、安装 libmaxminddb 库 apt updateapt install libmaxminddb0 libmaxminddb-dev mmdb-bin上面安装的软件包是&#xff1a; libmaxminddb0 libmaxminddb-dev 是MaxMind地理定位数据库mmdb-bin – 二进制。 从命令行调用的程序。 使用此命令手动定位 IP 安装参考 2、下载geoi…

node学习笔记

阶段一 1 初始Node.js javascript 运行环境 1.2 Node.js中的javacript 运行环境 1.3 Node.js环境安装 百度 1.4 node.js 执行javaScript 代码 2 fs文件系统模块 2.1 fs文件系统模块概念 导入文件系统模块&#xff1a; const fs require(fs)fs.readFile() // 1 导入fs文件…

【进阶C语言】通讯录(后期会升级)

文章目录一.基本框架与功能二.头文件的详细内容三.函数的实现1.打印菜单2.初始化通讯录3.添加联系人信息4.打印联系人信息5.查找名字6.删除联系人信息7.查找联系人8.修改联系人信息9.排序联系人&#xff08;按照名字&#xff09;四.总结1.test.c2.contact.c3.contact.h一.基本框…

智能电风扇(stm32f103c8t6)(直流电机,热敏传感器)(TIM,ADC)

前言 我的毕业论文的课题 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、热敏传感器计算温度&#xff08;ADC采样单通道&#xff09; #include "stm32f10x.h" // Device header#define T25 298.15 #define B 3…

看完这篇 教你玩转渗透测试靶机vulnhub——MONEYBOX: 1

Vulnhub靶机MONEYBOX: 1渗透测试详解Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;FTP匿名登入&#xff1a;③&#xff1a;SSH暴力破解④&#xff1a;…