基于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)作为一种实时以太网解决方案,因其高性能及成本效益高等特点,在众多…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
