基于ZYNQ-7000系列的FPGA学习笔记8——呼吸灯
基于ZYNQ-7000系列的FPGA学习笔记8——呼吸灯
- 1. 实验要求
- 2. 功能分析
- 3. 模块设计
- 4. 波形图
- 5.代码编写
- 6. 代码仿真
- 7. 添加约束文件并分析综合
上期内容,我们学习了按键控制蜂鸣器,这一期我们开始学习呼吸灯
1. 实验要求
控制领航者核心板上的led,实现一个呼吸灯的效果,具体要求如下:
- 呼吸灯由暗渐亮和由亮渐暗的时长都是2s,总共一个呼吸的周期为4s
- 需要通过PWM信号调节led的亮灭。实现呼吸灯

2. 功能分析
想要实现呼吸灯的效果,需要使用到PWM波,那么我们的功能实现就需要围绕产生PWM信号来完成,我是这样设计的:

- 已知led从暗到亮的时间是2s,那么只需要将2s分成100份,然后让占空比从0到99变化即可。
- 那么一个PWM信号占用的时间就是 2s / 100 = 20ms
- 同时占空比要从0到99之间变化,那么最小的计时周期就是20ms / 100 = 200us
- 也就是说,我们只需要通过系统时钟,然后分别定义200us,20ms,2s、已经led变化的标志位,就可以解决这个问题。
3. 模块设计
根据上述的分析,我们可以设计如下的功能框图:

4. 波形图
然后我们根据模块设计,绘制对应的波形图,如下:

5.代码编写
根据我们绘制出的波形图,编写对应的rtl代码,如下:
//模块端口定义
module breath_led(input sys_clk,input sys_rst_n,output reg led);//定义计数值的最大值
parameter CNT_200US_MAX = 14'd10000;
parameter CNT_20MS_MAX = 7'd100;
parameter CNT_2S_MAX = 7'd100;//定义200us的计数值,20ms的计数值,2s的计数值和led_flag
reg [13:0] cnt_200us;
reg [7:0] cnt_20ms;
reg [7:0] cnt_2s;
reg led_flag;//200us的计时
always @(posedge sys_clk or negedge sys_rst_n) beginif(sys_rst_n == 1'b0) //初始值为0cnt_200us <= 14'd0;else if(cnt_200us < (CNT_200US_MAX - 1) ) cnt_200us <= cnt_200us + 14'd1;elsecnt_200us <= 14'd0;
end//计时20ms:每当cnt_200us计数到最大值,cnt_20ms改变一次
always @(posedge sys_clk or negedge sys_rst_n) beginif(sys_rst_n == 1'b0) //初始值为0cnt_20ms <= 7'd0;else if(cnt_200us == (CNT_200US_MAX -1)) beginif(cnt_20ms == (CNT_20MS_MAX -1))cnt_20ms <= 7'd0;elsecnt_20ms <= cnt_20ms + 7'd1;endelse cnt_20ms <= cnt_20ms;
end//计时2s:每当cnt_20ms和cnt_200us计数到最大值,cnt_2s改变一次
always @(posedge sys_clk or negedge sys_rst_n) beginif(sys_rst_n == 1'b0)cnt_2s <= 7'd0;else if( (cnt_20ms == (CNT_20MS_MAX -1)) && (cnt_200us == (CNT_200US_MAX -1)) ) beginif(cnt_2s == ( CNT_2S_MAX -1 ))cnt_2s <= 7'd0;else cnt_2s <= cnt_2s +7'd1;endelse cnt_2s <= cnt_2s;
end//控制led_flag,为0表示渐亮,为1表示渐灭
//每当cnt_20ms、cnt_2s和cnt_200us计数到最大值,led_flag改变一次
always @(posedge sys_clk or negedge sys_rst_n) beginif(sys_rst_n == 1'b0)led_flag <= 1'b0;else if( (cnt_20ms == (CNT_20MS_MAX -1)) && (cnt_200us == (CNT_200US_MAX -1)) && (cnt_2s == ( CNT_2S_MAX -1 )) )led_flag <= ~led_flag;elseled_flag <= led_flag;
end//控制led灯的状态
always @(posedge sys_clk or negedge sys_rst_n) beginif(sys_rst_n == 1'b0)led <= 1'b0;else if( ((led_flag == 1'b0) && (cnt_20ms <= cnt_2s) ) || ( (led_flag == 1'b1) && (cnt_20ms > cnt_2s) ) )led <= 1'b1;elseled <= 1'b0;
endendmodule
紧接着,编写测试文件:
`timescale 1ns / 1nsmodule tb_breath_led();//定义时钟周期为20ns
parameter CLK_PERIOD = 20;//定义计数值的最大值
parameter CNT_200US_MAX = 14'd4;
parameter CNT_20MS_MAX = 7'd5;
parameter CNT_2S_MAX = 4'd5;//定义输入和输出
reg sys_clk;
reg sys_rst_n;
wire led;initial beginsys_clk <= 1'b0;sys_rst_n <= 1'b0;#200sys_rst_n <= 1'b1;
end//产生时钟
always #(CLK_PERIOD/2) sys_clk=~sys_clk;breath_led #( .CNT_200US_MAX (CNT_200US_MAX),.CNT_20MS_MAX (CNT_20MS_MAX ),.CNT_2S_MAX (CNT_2S_MAX )
) u_breath_led(.sys_clk (sys_clk),.sys_rst_n (sys_rst_n),.led (led)
);endmodule
6. 代码仿真
完成代码编写之后,我们开始仿真,仿真结果如图:

可以看到,led的输出已经实现了pwm的信号输出,且占空比逐渐增大或减小,证明我们编写的rtl代码是没有问题的,下一步就是添加约束文件,分析综合
7. 添加约束文件并分析综合
添加如下的约束文件:
#时序约束
create_clock -period 20.000 -name sys_clk [get_ports sys_clk]
#IO 管脚约束
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
set_property -dict {PACKAGE_PIN J16 IOSTANDARD LVCMOS33} [get_ports led]
下一步分析综合,得到如下内部连接图:

再下一步就是生成比特流文件,然后上板调试了,这里结果我就还是不展示了。
以上就是本期的所有内容,创造不易,点个关注再走呗。

相关文章:
基于ZYNQ-7000系列的FPGA学习笔记8——呼吸灯
基于ZYNQ-7000系列的FPGA学习笔记8——呼吸灯 1. 实验要求2. 功能分析3. 模块设计4. 波形图5.代码编写6. 代码仿真7. 添加约束文件并分析综合 上期内容,我们学习了按键控制蜂鸣器,这一期我们开始学习呼吸灯 1. 实验要求 控制领航者核心板上的led&#x…...
探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题
探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题 背景Python 版本升级 问题描述原因分析与解决方案 Python 应用的分层依赖:安装与部署的视角libvirt-python的分层依赖尝试的解决方案 使用编译好的 .whl 文件"嫁接"整个…...
OpenCV-平滑图像
二维卷积(图像滤波) 与一维信号一样,图像也可以通过各种低通滤波器(LPF)、高通滤波器(HPF)等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...
解决跨域问题方案
跨域问题在前后端分离架构下尤为常见,是每个 Web 开发者都会遇到的核心问题。本文将通过原理解析、场景剖析、解决方案详解以及最佳实践等多个维度,帮助开发者全面理解并有效应对跨域问题。 目录 **一、跨域的本质****1. 同源策略****2. 同源策略的限制范…...
云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)
计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类(cpu虚拟化、内存虚拟化、IO虚拟化)1.2 cpu虚拟化1.3 内存虚拟化1.4 IO虚拟化1.5 常见的集群的策略1.6 华为FC 1.计算虚拟化介绍 1.1 计算虚拟化 分类(cpu虚拟化、内存虚拟化、IO虚拟化&#…...
软件工程复习记录
基本概念 软件工程三要素:方法、工具、过程 软件开发方法:软件开发所遵循的办法和步骤,以保证所得到的运行系统和支持的文档满足质量要求。 软件开发过程管理 软件生命周期:可行性研究、需求分析、概要设计、详细设计、编码、测…...
俩Nim游戏
1.给定n堆石子,每堆石子有xi快,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。 问如果两人都采用最优策略ÿ…...
基于超级电容和电池的新能源汽车能量管理系统simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 超级电容特性 4.2 电池特性 5.完整工程文件 1.课题概述 基于超级电容和电池的新能源汽车能量管理系统simulink建模与仿真。分析不同车速对应的电池,超级电容充放电变化情况。 2.系统仿…...
数据结构——图(遍历,最小生成树,最短路径)
目录 一.图的基本概念 二.图的存储结构 1.邻接矩阵 2.邻接表 三.图的遍历 1.图的广度优先遍历 2.图的深度优先遍历 四.最小生成树 1.Kruskal算法 2.Prim算法 五.最短路径 1.单源最短路径--Dijkstra算法 2.单源最短路径--Bellman-Ford算法 3.多源最短路径--Floyd-…...
002-NoSQL介绍
目录 一、NoSQL 简介 二、NoSQL 特性 三、NoSQL 的工作原理 四、NoSQL 有哪些类型 五、NoSQL数据库与关系型数据库的区别 六、常见的非关系型数据库NOSQL分类 一、NoSQL 简介 NoSQL,全称为Not Only SQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是…...
qt-everywher交叉编译e-src-5.15.2
简化配置的方式: 你完全可以通过直接配置 安装目录、编译链 和 目标架构 来完成交叉编译,而不需要修改 mkspecs 配置。以下是如何通过简化配置来进行交叉编译 Qt 的步骤。 准备交叉编译工具链 首先,确保你已经安装了交叉编译工具链ÿ…...
4.STM32通信接口之SPI通信(含源码)---硬件SPI与W25Q64存储模块通信实战《精讲》
开胃简介 根据上一节对STM32的SPI介绍!本节将进行硬件SPI的实现,片选用软件实现!跟着Whappy走起!W25Q64的驱动层,我们不需要更改,仅仅需要更改一下SPI的协议,即:由软件实现改成硬件…...
生信技能63 - 构建gnomAD变异位点的SQLite查询数据库
将数据量巨大的gnomAD数据库,通过SQLite数据库寻找gnomAD中存在的各种变异注释信息(如等位基因计数,深度,次要等位基因频率等),查询300.000个变量的查询需要大约40秒,通过染色体编号+位置+REF+ALT即可进行快速查询。 1. gnomAD变异注释VCF文件字段 gnomAD VCF各版本包…...
0x0118消息 WM_SYSTIMER
0x0118消息就是WM_SYSTIMER 编辑框出现输入光标时,产生的消息. 0x0118 would be the undocumented WM_SYSTIMER, which appears to be used for caret blinks. 0x0118是一个undocument 消息, 微软没有记录。 但在一些库的源码中可以看到,比如ATL的库文…...
【机器学习】机器学习的基本分类-无监督学习(Unsupervised Learning)
无监督学习(Unsupervised Learning) 无监督学习是一种机器学习方法,主要用于没有标签的数据集。其目标是从数据中挖掘出潜在的结构和模式。常见的无监督学习任务包括 聚类、降维、密度估计 和 异常检测。 1. 无监督学习的核心目标 1.1 聚类…...
[代码随想录09]字符串2的总结
前言 处理字符串主要是有思路,同时总结方法。 题目链接 151. 反转字符串中的单词 - 力扣(LeetCode) 55. 右旋字符串(第八期模拟笔试) 一、翻转字符串里的单词 这个题目的主要思路,代码采用从后往前遍历字…...
java注解(一):什么是注解?什么是元注解?如何自定义注解?注解的原理是什么?
目录 1、什么是注解? 2、什么是元注解 1、Target() 2、Retention() 3、Documented 4、Inherited 3、如何自定义注解以解使用 4、注解的原理 本篇文章主要是介绍注解的概念、原理,以及通过代码演示4种元注解、如何自定义注解。通过反编译的形式进…...
AD20 原理图库更新到原理图
一 点击工具,从库更新。快捷键TL 二 点击完成 三 执行变更,最后点击关闭...
.NET用C#导入Excel数据到数据库
将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性,还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中,Excel作为数据输入和初步整理的工具非常普遍,但其功能对于复杂查询、大规模数据管理和跨部门的数据共享…...
小身躯大能量-供热系统通过EtherCAT转Profinet网关进行升级
在现代工业自动化领域,通信技术的进步对于提高系统效率、稳定性和可靠性起着至关重要的作用。EtherCAT(Ethernet for Control Automation Technology)作为一种实时以太网解决方案,因其高性能及成本效益高等特点,在众多…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
