ZYNQ 7020 学习记录-2呼吸灯(模块化)

news2025/1/11 7:49:34

系列文章目录

1.点灯
2.呼吸灯(模块化)


文章目录

  • 系列文章目录
  • 前言
  • 一、模块实例化
  • 二、呼吸灯
    • 1.原理解释
    • 2.按键消抖模块
    • 3.呼吸灯模块
    • 4.顶层模块
    • 5.上板验证
  • 总结


前言

由于研究生课题组所需学习ZYNQ,以下是本人自学ZYNQ的学习记录,所用板卡为:基于 XILINX ZYNQ7000 开发平台的开发板(型号:AX7021B) 2022 款。
在这里插入图片描述

一、模块实例化

模块化,相当于将一个模块当作一个函数,使用在另一个模块中,代码就可以显得有序、不冗余。
示例如下:
加法模块

module add(
    input   num1,    //子模块输入1
    input   num2,    //子模块输入2
    output  add		//子模块输出     
    );
    
assign led = key;
    
endmodule

顶层模块

module top_add(
    input   wire [10:0] a,    		//顶层模块输入1
    input   wire [10:0] b,    		//顶层模块输入2
    output  wire [10:0] sum   //顶层模块输出     
    );
    
add u_add(
	.num1(a),
	.num2(b),
	.add(sum)
);
    
endmodule

二、呼吸灯

1.原理解释

代码如下(示例):

// 呼吸灯由两个部分组成
// 一个是由亮到暗的过程,一个是由暗到亮的过程
// 我们是在固定的频率下通过调整“高电平”的占空比来调控led灯的亮度    ;定义一个LED灯高占空比递增/递减信号inc_dec_flag
// LED灯的亮度由亮到暗变化,就是LED灯信号的高占空比开始递减        inc_dec_flag=1'b1
// LED灯的亮度由暗到亮变化,就是LED灯信号的高占空比开始递增        inc_dec_flag=1'b0
// 系统时钟周期为20ns(50MHz)
// 计时2us=100*20ns——100个周期;从0开始到99     计时4us=200*20ns——200个周期;从0开始到199
// 计时2ms=1000*2us——1000个周期;从0开始到999   计时4ms=1000*4us——1000个周期;从0开始到999
// 计时2s=1000*2ms——1000个周期;从0开始到999    计时4s=1000*4ms——1000个周期;从0开始到999
// 故在2ms从0到999计数时,此时2s计数器进1,故2ms计数值小于等于2s计数器的个数从1到1000在逐渐增多,且每次以2us增加
// 可以定义在2ms小于等于2s计数器值时,给led高电平(变亮)

2.按键消抖模块

// 按键消抖
// 原理:滤除按键值保持时间小于20ms的信号
// 在按键被按下或者被释放时导致按键值产生变化时,从20ms开始倒计时,
// 如果倒计时结束后,按键值仍然保持不变,则认为是一次有效的按键事件。
// 否则,认为是一次无效的按键事件。
// 有效的按键事件会被传递到下一个模块,无效的按键事件会被忽略。
// 该模块的输入为按键信号,输出为有效的按键事件。
// 系统时钟为50MHz,时钟周期为20ns。

module keydebounce (
    input clk, // 系统时钟
    input rst, // 复位信号

    output reg rst_filter
);

parameter CNT_MAX = 20'd1000000;//消抖时间20ms

reg [19:0] cnt;
reg key_d0;//将按键信号延迟一个时钟周期
reg key_d1;//将按键信号延迟两个时钟周期

// 按键信号的延迟
always @(posedge clk ) begin
    key_d0 <= rst;
    key_d1 <= key_d0;
end

// 按键消抖计数器——计时20ms
always @(posedge clk ) begin
    if(key_d1 != key_d0) //按键状态发生变化
        cnt <= CNT_MAX; // 开始计时
    else begin  //按键状态保持不变
        if(cnt > 20'd0) //计数器开始递减
            cnt <= cnt - 1'b1;
        else
            cnt <= 20'd0; //计数器归零
    end
end
// 按键有效输出
always @(posedge clk ) begin
    if(cnt == 20'd1) //计数器归零,按键有效
        rst_filter <= key_d1;
    else //计数器未归零,按键无效
        rst_filter <= rst_filter;
end
    
endmodule

3.呼吸灯模块

module breath_led (
    input clk,
    input rst,

    output reg led
    
);

parameter CNT_2US_MAX = 7'd100;
parameter CNT_2MS_MAX = 10'd1000;
parameter CNT_2S_MAX = 10'd1000;

reg[8:0] cnt_2us;
reg[9:0] cnt_2ms;
reg[9:0] cnt_2s;
reg inc_dec_flag;    

//计数2us
always@(posedge clk or negedge rst)begin
    if(!rst)
        cnt_2us <= 7'b0;
    else if(cnt_2us == (CNT_2US_MAX-7'b1))
        cnt_2us <= 7'b0;
    else
        cnt_2us <= cnt_2us + 7'b1; 
end

//计数2ms
always@(posedge clk or negedge rst)begin
    if(!rst)
        cnt_2ms <= 10'b0;
    else if(cnt_2ms == (CNT_2MS_MAX-10'b1) && cnt_2us == (CNT_2US_MAX-7'b1))
        cnt_2ms <= 10'b0;
    else if(cnt_2us == (CNT_2US_MAX-7'b1))
        cnt_2ms <= cnt_2ms + 10'b1;
    else
        cnt_2ms <= cnt_2ms;
end

//计数2s
always@(posedge clk or negedge rst)begin
    if(!rst)
        cnt_2s <= 10'b0;
    else if(cnt_2s == (CNT_2S_MAX-10'b1) && cnt_2ms == (CNT_2MS_MAX-7'b1) && cnt_2us == (CNT_2US_MAX-7'b1))
        cnt_2s <= 10'b0;
    else if(cnt_2us == (CNT_2US_MAX-7'b1) && cnt_2ms == (CNT_2MS_MAX-7'b1))
        cnt_2s <= cnt_2s + 10'b1;
    else
        cnt_2s <= cnt_2s;
end

// LED灯的亮度由亮到暗变化,就是LED灯信号的高占空比开始递减        inc_dec_flag=1'b1
// LED灯的亮度由暗到亮变化,就是LED灯信号的高占空比开始递增        inc_dec_flag=1'b0
    
always@(posedge clk or negedge rst)begin
    if(!rst)
        inc_dec_flag <= 1'b0;
    else if(cnt_2s == (CNT_2S_MAX-10'b1) && cnt_2ms == (CNT_2MS_MAX-7'b1) && cnt_2us == (CNT_2US_MAX-7'b1))
        inc_dec_flag <= ~inc_dec_flag;
    else
        inc_dec_flag <= inc_dec_flag;
end

    
// 定义在2ms小于等于2s计数器值时,给led高电平(变亮)
always@(posedge clk or negedge rst)begin
    if(!rst)
        led <= 1'b1;//led灯初始状态为高电平,本项目的灯低电平点亮
    else if((inc_dec_flag == 1'b1 && cnt_2ms >= cnt_2s) || (inc_dec_flag == 1'b0 && cnt_2ms <= cnt_2s))
        led <= 1'b0;
    else
        led <= 1'b1;
end
    
endmodule

4.顶层模块

//将呼吸灯模块通过例化到顶层
module top_breath_led(
    input clk,
    input rst,

    output  led1,    //2s
    output  led2    //4s
);

wire rst_filter; // 按键消抖后的值

// 实例化按键消抖模块
keydebounce u_keydebounce (
    .clk(clk),
    .rst(rst),
    .rst_filter(rst_filter)
);

// 实例化呼吸灯模块
// 2s
breath_led #(
    .CNT_2US_MAX(7'd100),
    .CNT_2MS_MAX(10'd1000),
    .CNT_2S_MAX(10'd1000)
) u_breath_led1(
    .clk(clk),
    .rst(rst_filter),
    .led(led1)
);

// 4s
breath_led #(
    .CNT_2US_MAX(8'd200),
    .CNT_2MS_MAX(10'd1000),
    .CNT_2S_MAX(10'd1000)
) u_breath_led2(
    .clk(clk),
    .rst(rst_filter),
    .led(led2)
);

endmodule

5.上板验证

IO定义如下,其中LED1为实图中的绿色灯( Y19),LED2为红色灯(AA19),时钟接口为Y9,rst为用户按键2(A17)
在这里插入图片描述
在这里插入图片描述
具体扩展版引脚分配图如下:
在这里插入图片描述
如图可视,频率不一致的呼吸效果:
在这里插入图片描述

总结

以上就是今天要讲的内容,本文仅仅简单介绍了XILINX ZYNQ7020的使用,如有任何问题请发送邮件至:zelinliu@nuaa.edu.cn

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

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

相关文章

MySQL数据库教程合集

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

【Qt】Qml界面中嵌入C++ Widget窗口

1. 目的 qml做出的界面漂亮&#xff0c;但是执行效率低&#xff0c;一直想找一个方法实现qml中嵌入c界面。现在从网上找到一个方法&#xff0c;简单试了一下貌似可行&#xff0c;分享一下。 2. 显示效果 3. 代码 3.1 工程结构 3.2 pro文件 需要添加widgets > QT quick …

数据集 VisDrone-Dataset 无人机检测跟踪数据集 >> DataBall

开源数据集 VisDrone-Dataset 无人机检测跟踪数据集-机器视觉目标跟踪 人工智能 深度学习 无人机或通用无人驾驶飞行器&#xff08;UAV&#xff09;配备相机后&#xff0c;已被迅速部署到包括农业、航拍、快速递送和监视在内的广泛应用中。因此&#xff0c;自动理解从这些平台收…

如何在Layui框架中实现列表操作后返回编辑页面并带参数刷新表单

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

C#匿名方法

在C#中&#xff0c;匿名函数是一种没有名字的方法&#xff0c;可以在代码中定义和使用。 我们已经提到过&#xff0c;委托是用于引用与其具有相同标签的方法。换句话说&#xff0c;可以使用委托对象调用可由委托引用的方法。 匿名方法&#xff08;Anonymous methods&#xff…

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGis接口说明文档)

OSGeo4W简介 更高级的 QGIS 用户应该使用 OSGeo4W 包。此安装程序可以并行安装多个版本的 QGIS&#xff0c;并且还可以进行更高效的更新&#xff0c;因为每个新版本仅下载和安装更改的组件。      OSGeo4W 存储库包含许多来自 OSGeo 项目的软件。包括 QGIS 和所有依赖项&a…

Codeforces practice C++ 2024/9/11 - 2024/9/13

D. Mathematical Problem Codeforces Round 954 (Div. 3) 原题链接&#xff1a;https://codeforces.com/contest/1986/problem/D 题目标签分类&#xff1a;brute force&#xff0c;dp&#xff0c;greedy&#xff0c;implementation&#xff0c;math&#xff0c;two pointers…

威雅学校:解锁新学期!与威雅共赴秋实之约

【常州威雅】 九月的风&#xff0c;轻拂过青春的扉页; 新学期的篇章&#xff0c;正待你我提笔书写。 常州威雅再度迎来开学季&#xff0c;我们已准备好为威雅学子们提供一个充满活力与挑战的学习环境。在这里&#xff0c;新的故事将被书写&#xff0c;新的梦想将被点燃&#xf…

Van-ZYL算法

系统模型&#xff1a;由于观测散射矩阵一定是对称的&#xff08;系统压缩后的测量结果&#xff09;&#xff0c;且原S矩阵是互易的。此时系统由R T转置 Shv Svh 目标的互易 Ohv Ovh 接收数据的固有属性 R T转置 目标互易接收数据固有属性推导 本文串扰模型有两种理解。 1、…

这个桌面日历真不错 笔记 提醒 生日记录 打卡 翻译都有 真的太方便了!

这个桌面日历真不错 笔记 提醒 生日记录 打卡 翻译都有 真的太方便了&#xff01;日历产品非常的多&#xff0c;如何选择一个合适自己的桌面日历&#xff0c;这个很重要&#xff0c;今天小编给大家介绍这个芝麻日历&#xff0c;一起看下它有些什么功能&#xff0c;是不是你需要…

RFID射频模块(MFRC522 STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 MFRC522.h文件 MFRC522.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 RC522 RFID射频模块是一款广泛应用于非接触式RFID系统中的核心组件&#xff0c;由NXP&…

大一新生以此篇开启你的算法之路

各位大一计算机萌新们&#xff0c;你们好&#xff0c;本篇博客会带领大家进行算法入门&#xff0c;给各位大一萌新答疑解惑。博客文章略长&#xff0c;可根据自己的需要观看&#xff0c;在博客中会有给大一萌新问题的解答&#xff0c;请不要错过。 入门简介&#xff1a; 算法…

STM32项目分享:智能风扇系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.com/video/BV1xw4m1Y7sA…

node解析dxf文件

1、dxf数据说明 DXF是一种开放的矢量数据格式&#xff0c;可以分为两类&#xff1a;ASCII格式和二进制格式&#xff1b;ASCII具有可读性好的特点&#xff0c;但占用的空间较大&#xff1b;二进制格式则占用的空间小、读取速度快。由于AutoCAD是最流行的CAD系统&#xff0c;DXF也…

基于python+django+vue的视频点播管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的视…

如何在Django中创建新的模型实例

在 Django 中&#xff0c;创建新的模型实例可以通过以下几个步骤进行&#xff0c;通常包括定义模型、创建模型实例、保存数据到数据库&#xff0c;以及访问和操作这些实例。 1、问题背景 在 Django 中&#xff0c;可以使用 models.Model 类来创建模型&#xff0c;并使用 creat…

一种多策略改进小龙虾智能优化算法MSCOA 改进策略:种群混沌映射初始化+透镜成像反向学习+黄金正弦变异策略

一种多策略改进小龙虾智能优化算法MSCOA 改进策略&#xff1a;种群初始化精英反向透镜成像反向学习黄金正弦变异策略 文章目录 一、小龙虾COA基本原理二、改进策略2.1种群初始化 映射2.2 透镜成像反向学习2.3 黄金正弦变异策略 三、实验结果四、核心代码五、代码获取六、总结 一…

Python库Plotly学习笔记

Plotly是一个用于创建交互式图形的Python库。它提供了丰富的图表类型&#xff0c;包括散点图、线图、柱状图、热力图、饼图等&#xff0c;以及高级的可视化功能&#xff0c;如动画、交互、数据缩放和拖动等。 Plotly库的主要特点&#xff1a; 交互式图表&#xff1a;Plotly创…

栈和队列的算法题目(C语言)

1. 括号匹配问题 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 利用栈后入先出的特性解题 1.判断字符串是否为空 为空返回 2.创建栈&#xff0c;遍历字符串 第一个字符是左括号的情况&#xff1a;入栈->继续遍历下一个字符 第一个字符是右括号的情况&#xf…

Caffenie配合Redis做两级缓存,Redis发布订阅实现缓存一致更新

一、什么是两级缓存 在项目中。一级缓存用Caffeine&#xff0c;二级缓存用Redis&#xff0c;查询数据时首先查本地的Caffeine缓存&#xff0c;没有命中再通过网络去访问Redis缓存&#xff0c;还是没有命中再查数据库。具体流程如下 二、简单的二级缓存实现-v1 目录结构 2…