当前位置: 首页 > news >正文

基于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. 添加约束文件并分析综合 上期内容&#xff0c;我们学习了按键控制蜂鸣器&#xff0c;这一期我们开始学习呼吸灯 1. 实验要求 控制领航者核心板上的led&#x…...

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题

探索 Python 应用的分层依赖&#xff1a;解决 UOS 环境中的 libvirt-python 安装问题 背景Python 版本升级 问题描述原因分析与解决方案 Python 应用的分层依赖&#xff1a;安装与部署的视角libvirt-python的分层依赖尝试的解决方案 使用编译好的 .whl 文件"嫁接"整个…...

OpenCV-平滑图像

二维卷积(图像滤波) 与一维信号一样&#xff0c;图像也可以通过各种低通滤波器&#xff08;LPF&#xff09;、高通滤波器&#xff08;HPF&#xff09;等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...

解决跨域问题方案

跨域问题在前后端分离架构下尤为常见&#xff0c;是每个 Web 开发者都会遇到的核心问题。本文将通过原理解析、场景剖析、解决方案详解以及最佳实践等多个维度&#xff0c;帮助开发者全面理解并有效应对跨域问题。 目录 **一、跨域的本质****1. 同源策略****2. 同源策略的限制范…...

云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)

计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09;1.2 cpu虚拟化1.3 内存虚拟化1.4 IO虚拟化1.5 常见的集群的策略1.6 华为FC 1.计算虚拟化介绍 1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#…...

软件工程复习记录

基本概念 软件工程三要素&#xff1a;方法、工具、过程 软件开发方法&#xff1a;软件开发所遵循的办法和步骤&#xff0c;以保证所得到的运行系统和支持的文档满足质量要求。 软件开发过程管理 软件生命周期&#xff1a;可行性研究、需求分析、概要设计、详细设计、编码、测…...

俩Nim游戏

1.给定n堆石子&#xff0c;每堆石子有xi快&#xff0c;两位玩家轮流操作&#xff0c;每次操作可以从任意一堆石子中拿走任意数量的石子&#xff08;可以拿完&#xff0c;但不能不拿&#xff09;&#xff0c;最后无法进行操作的人视为失败。 问如果两人都采用最优策略&#xff…...

基于超级电容和电池的新能源汽车能量管理系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 超级电容特性 4.2 电池特性 5.完整工程文件 1.课题概述 基于超级电容和电池的新能源汽车能量管理系统simulink建模与仿真。分析不同车速对应的电池&#xff0c;超级电容充放电变化情况。 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

简化配置的方式&#xff1a; 你完全可以通过直接配置 安装目录、编译链 和 目标架构 来完成交叉编译&#xff0c;而不需要修改 mkspecs 配置。以下是如何通过简化配置来进行交叉编译 Qt 的步骤。 准备交叉编译工具链 首先&#xff0c;确保你已经安装了交叉编译工具链&#xff…...

4.STM32通信接口之SPI通信(含源码)---硬件SPI与W25Q64存储模块通信实战《精讲》

开胃简介 根据上一节对STM32的SPI介绍&#xff01;本节将进行硬件SPI的实现&#xff0c;片选用软件实现&#xff01;跟着Whappy走起&#xff01;W25Q64的驱动层&#xff0c;我们不需要更改&#xff0c;仅仅需要更改一下SPI的协议&#xff0c;即&#xff1a;由软件实现改成硬件…...

生信技能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 消息&#xff0c; 微软没有记录。 但在一些库的源码中可以看到&#xff0c;比如ATL的库文…...

【机器学习】机器学习的基本分类-无监督学习(Unsupervised Learning)

无监督学习&#xff08;Unsupervised Learning&#xff09; 无监督学习是一种机器学习方法&#xff0c;主要用于没有标签的数据集。其目标是从数据中挖掘出潜在的结构和模式。常见的无监督学习任务包括 聚类、降维、密度估计 和 异常检测。 1. 无监督学习的核心目标 1.1 聚类…...

[代码随想录09]字符串2的总结

前言 处理字符串主要是有思路&#xff0c;同时总结方法。 题目链接 151. 反转字符串中的单词 - 力扣&#xff08;LeetCode&#xff09; 55. 右旋字符串&#xff08;第八期模拟笔试&#xff09; 一、翻转字符串里的单词 这个题目的主要思路&#xff0c;代码采用从后往前遍历字…...

java注解(一):什么是注解?什么是元注解?如何自定义注解?注解的原理是什么?

目录 1、什么是注解&#xff1f; 2、什么是元注解 1、Target() 2、Retention() 3、Documented 4、Inherited 3、如何自定义注解以解使用 4、注解的原理 本篇文章主要是介绍注解的概念、原理&#xff0c;以及通过代码演示4种元注解、如何自定义注解。通过反编译的形式进…...

AD20 原理图库更新到原理图

一 点击工具&#xff0c;从库更新。快捷键TL 二 点击完成 三 执行变更&#xff0c;最后点击关闭...

.NET用C#导入Excel数据到数据库

将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性&#xff0c;还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中&#xff0c;Excel作为数据输入和初步整理的工具非常普遍&#xff0c;但其功能对于复杂查询、大规模数据管理和跨部门的数据共享…...

小身躯大能量-供热系统通过EtherCAT转Profinet网关进行升级

在现代工业自动化领域&#xff0c;通信技术的进步对于提高系统效率、稳定性和可靠性起着至关重要的作用。EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;作为一种实时以太网解决方案&#xff0c;因其高性能及成本效益高等特点&#xff0c;在众多…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...