《FPGA学习》->呼吸灯

2023-05-16

🍎 与其担心未来,不如现在好好努力。在这条路上,只有奋斗才能给你安全感。你若努力,全世界都会为你让路。

呼吸灯,简而言之就像人类呼吸一样,有节奏的让LED灯从:灭->微微亮->微亮->亮->高亮,然后再从:高亮->亮->微亮->微微亮->灭的这样一个过程。

而LED的亮暗程度取决与电压的高低,在安全范围内,电压越高LED亮度越大,电压越低LED亮度越小。但是我们没办法去自动控制电压的高低,所以我们采用通过改变其占空比的方式来调节,即PWM(脉冲宽度调制)技术。简单来说就是在一定的时间周期内,改变高电平所占用的时间。

呼吸灯框架图如下:

PWM调制原理如下图所示:

对PWM有了了解以后,我们开始画波形图,然后对照波形图编写代码,波形图如下:

①sys_clk:时钟信号;

②sys_rst_n:复位信号,低电平有效;

③cnt_1us:因为开发板为50MHz,所以一个时钟周期为20ns,那1us秒即50个时钟周期;

④cnt_1ms:1000个1us进1;

⑤cnt_1s:1000个1ms进1;

⑥cnt_en:使能信号标志位,用来判断LED状态是否到了反转时刻;

⑦led_out:LED状态输出。

源代码如下:

module breath_led          //模块开始,定义名称为waterfall_light
#(
    parameter CNT_1US_MAX = 6'd49   ,  //定义全局变量CNT_1US_MAX,时间周期为1us 
    parameter CNT_1MS_MAX = 10'd999 ,  //定义全局变量CNT_1MS_MAX,时间周期为1ms 
    parameter CNT_1S_MAX  = 10'd999    //定义全局变量CNT_1S_MAX,时间周期为1s 
)
(
    input    wire    sys_clk   ,     //定义sys_clk为输入模式   (时钟)
    input    wire    sys_rst_n ,     //定义sys_rst_n为输入模式 (复位)
    
    output    reg        led_out          //定义led_out为寄存器类型的输出模式
);

    reg  [5:0]    cnt_1us;           //定义cnt_1us为6位宽的寄存器类型
    reg  [9:0]    cnt_1ms;           //定义cnt_1ms为10位宽的寄存器类型
    reg  [9:0]    cnt_1s ;           //定义cnt_1s为10位宽的寄存器类型
    reg          cnt_en ;           //定义cnt_en为寄存器类型
    
always@(posedge sys_clk or negedge sys_rst_n)
    begin
        if(sys_rst_n == 1'b0)               //复位信号到来
            begin
                cnt_1us <= 6'd0;            //使cnt_1us清零
            end
        else    if(cnt_1us == CNT_1US_MAX)  //判断cnt_1us是否计数到最大值
            begin
                cnt_1us <= 6'd0;            //使cnt_1us清零
            end
        else 
            cnt_1us <= cnt_1us + 6'd1;        //使cnt_1us + 1
    end
    
always@(posedge sys_clk or negedge sys_rst_n)
    begin
        if(sys_rst_n == 1'b0)               //复位信号到来
            begin
                cnt_1ms <= 10'd0;           //使cnt_1ms清零
            end
        else    if((cnt_1ms == CNT_1MS_MAX)&&(cnt_1us == CNT_1US_MAX))  //判断cnt_1us和cnt_1ms是否同时计数到最大值 
            begin
                cnt_1ms <= 10'd0;           //使cnt_1ms清零
            end
        else    if(cnt_1us == CNT_1US_MAX)  //判断cnt_1us是否计数到最大值
            begin
                cnt_1ms <= cnt_1ms + 10'd1;   //使cnt_1ms + 1
            end
        else 
            cnt_1ms <= cnt_1ms;
    end
    
always@(posedge sys_clk or negedge sys_rst_n)
    begin
        if(sys_rst_n == 1'b0)               //复位信号到来
            begin
                cnt_1s <= 10'd0;           //使cnt_1s清零
            end
        else    if((cnt_1s  == CNT_1S_MAX)&& (cnt_1ms == CNT_1MS_MAX)&&(cnt_1us == CNT_1US_MAX))  //判断cnt_1us,cnt_1ms,cnt_1s是否同时计数到最大值 
            begin
                cnt_1s <= 10'd0;           //使cnt_1s清零
            end
        else    if((cnt_1ms == CNT_1MS_MAX)&&(cnt_1us == CNT_1US_MAX))  //判断cnt_1us和cnt_1ms是否同时计数到最大值 
            begin
                cnt_1s <= cnt_1s + 10'd1;  //使cnt_1s + 1
            end
        else 
            cnt_1s <= cnt_1s;              //使cnt_1s保持不变
    end

always@(posedge sys_clk or negedge sys_rst_n)
    begin
        if(sys_rst_n == 1'b0)              //复位信号到来
            begin
                cnt_en <= 1'b0;            //使cnt_1s清零
            end
        else    if((cnt_1s  == CNT_1S_MAX)&& (cnt_1ms == CNT_1MS_MAX)&&(cnt_1us == CNT_1US_MAX))  //判断cnt_1us,cnt_1ms,cnt_1s是否同时计数到最大值 
            begin
                cnt_en <= ~cnt_en;         //使cnt_en取反
            end
        else 
            cnt_en <= cnt_en;              //使cnt_en保持不变    
    end

always@(posedge sys_clk or negedge sys_rst_n)
    begin
        if(sys_rst_n == 1'b0)              //复位信号到来
            begin
                led_out <= 1'b1;            //使led_out置1
            end
        else    if(((cnt_en  == 1'b0)&&(cnt_1ms <= cnt_1s)) || ((cnt_en  == 1'b1)&&(cnt_1ms > cnt_1s))) //判断cnt_en为0且cnt_1ms计数值小于等于cnt_1s
            begin                                                                                       //或者判断cnt_en为1且cnt_1ms计数值大于cnt_1s执行
                led_out <= 1'b0;            //使led_out置0
            end
        else 
            led_out <= 1'b1;                //使led_out置1
    end
    
endmodule         //模块结束

生成的RTL电路图如下:

仿真代码如下:

`timescale 1ns/1ns               //时间尺度预编译指令      时间单位/时间精度

module tb_breath_led ();     //定义模块名称为tb_breath_led

reg        sys_clk   ;     //定义sys_clk为reg型
reg        sys_rst_n ;     //定义sys_rst_n为reg型
wire    led_out   ;     //定义led_out为reg型

breath_led                  //例化对象名称
#(
    .CNT_1US_MAX (6'd4)    ,            //改变parameter定义的参数
    .CNT_1MS_MAX (10'd9)   ,            //改变parameter定义的参数
    .CNT_1S_MAX  (10'd9)                //改变parameter定义的参数
)
breath_led_inst            //实例化名称
(
    .sys_clk      (sys_clk),       //使sys_clk信号端口例化为sys_clk
    .sys_rst_n    (sys_rst_n),     //使sys_rst_n信号端口例化为sys_rst_n
                                 
    .led_out      (led_out)        //使led_out信号端口例化为led_out
);

initial                          //初始化
    begin                        
        sys_clk   = 1'b1  ;      //使sys_clk初始化为高电平状态
        sys_rst_n = 1'b0  ;      //使sys_clk初始化为低电平状态
        #20                      //延时20ns
        sys_rst_n = 1'b1  ;      //使sys_rst_n电平拉高
    end                          
                                 
always #10 sys_clk = ~sys_clk;   //使sys_clk电平10ns电平状态反转一次
    
endmodule            //模块结束

仿真波形如下:

从图中可以看出,运行后的仿真波形与设计需求保持一致,任务完成。

🔥🔥🔥本系列文章持续更新,喜欢的话可以关注收藏~🔥🔥🔥

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《FPGA学习》->呼吸灯 的相关文章

  • Xilinx ZYNQ FreeRTOS+Tracealyzer(移植)

    PL端配置 使用ZYNQ IP Core 打开串口 网口等所需接口 新手注意 xff1a 需要生成bit文件后 xff0c 并输出相应硬件平台 xff0c 网上教程很多 xff0c 请参考其它教程 PS端配置 1 创建任务 xff0c 注意
  • Openmv学习day2——AprilTag

    仅作为个人学习 xff0c 原文地址 xff1a 链接 link AprilTag的简介 AprilTag是一个视觉基准系统 xff0c 可用于各种任务 xff0c 包括AR xff0c 机器人和相机校准 这个tag可以直接用打印机打印出来
  • JS进行简单的表单验证(附详细代码)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 一 JS表单验证是什么 xff1f 一 JS表单验证需求分析 xff1f 三 表单验证所需事件设置from表单及其文本框 xff
  • FreeRTOS学习(三)FreeRTOS任务基础知识

    FreeRTOS任务基础知识 1 FreeRTOS任务特性2 FreeRTOS的任务状态3 任务优先级4 任务调度方式5 任务控制块6 任务堆栈 1 FreeRTOS任务特性 特性1 xff1a 任务数量没有限制 xff0c 想要创建多少个
  • 如何写串口通信

    1 初始化串口 void USART INIT void GPIO InitTypeDef GPIO InitStructure 使能USART1 RCC APB2PeriphClockCmd RCC APB2Periph USART1 E
  • 树莓派WiFi连接问题及网页打开问题的解决

    树莓派WiFi连接问题及网页打开问题的解决 一 问题描述 前一段时间在网上买了一个树莓派 4b计划做一个人脸识别的智能锁 xff0c 前一段时间整赶上期末考试 xff0c 挤时间做了做人脸识别以及人体红外感知模块 xff0c 大致能简单实现
  • windows双系统如何删除ubuntu系统并重装

    电脑装有windows和Ubuntu双系统 xff0c 当需要重装Ubuntu时 xff0c 需要先卸载掉已经安装的Ubuntu系统 博主电脑安装的是Windows10和Ubuntu20 04LTS 现在需要卸载Ubuntu20 04 xf
  • 全网最全的MCU面试经(基于STM32F103)

    免责声明 提示 xff1a 写本文章的缘由 xff1a 本人在秋招时复习STM32有关的知识点 xff0c 便顺势记录下来 本文章的知识均属于各大论坛的大佬回答 xff0c 其中也有我的一些补充 xff0c 本文主要以自己对STM32的理解
  • Quartus II和Modelsim初学踩坑笔记

    Quartus II和Modelsim初学踩坑笔记 1 软件安装 网上有关软件安装的教程已经足够多了 xff0c 这里不再赘述 xff0c 但我要提醒的一点是 xff0c 不要把软件和之后创建的项目工程放在中文路径下面 本文使用的软件环境是
  • HDLBits刷题记录--Modules:Hierarchy

    HDLBits刷题记录 Modules Hierarchy Module 电路图 xff1a 代码 xff1a module top module span class token punctuation span input a span
  • C++中SORT函数使用方法

    一 sort函数 1 sort函数包含在头文件为 include lt algorithm gt 的c 43 43 标准库中 xff0c 调用标准库里的排序方法可以实现对数据的排序 xff0c 但是sort函数是如何实现的 xff0c 我们
  • Window下LaTex+VS Code的配置

    目录 前言 一 软件下载二 软件安装1 TexLive安装2 VS Code及插件安装 三 配置 VS Code四 简单测试一下五 进阶操作及可能遇到的问题1 前向搜索和反向搜索2 编译带参考文献的 tex文件 前言 考虑本文受众有新手小白
  • 与 vmx86 驱动程序的版本不匹配解决方法

    一个新手可能遇到的问题 第一次安装完VMware后 xff0c 启动时可能会遇到问题 xff1a 与 vmx86 驱动程序的版本不匹配 预期为xxx 实际为 xxx 驱动程序 vmx86 sys的版本不正确 如下图 xff1a 解决方法 x
  • 汽车电子系统知识积累

    文章目录 前言一 汽车电子系统的分类1 电子控制汽车电子控制系统2 电子控制车载汽车电子系统 二 分类及详述1 动力2 底盘3 车身4 娱乐 总结 前言 汽车电子系统是以汽车电子技术为基础的汽车结构 一 汽车电子系统的分类 按照电子系统对汽
  • Jetson Xavier NX 学习(一),安装sd卡镜像

    Jetson Xavier NX 学习 xff08 一 xff09 xff0c 安装sd卡镜像 说明个人说明了解JetPack SDK下载镜像将图像写入microSD卡启动查看设置 说明 Jetson Xavier NX可为运行现代AI工作
  • 服务器ssh远程连接失败

    服务器远程ssh连接失败解决方案 查看ssh服务状态 systemctl status sshd service 正常应该是下图情况 xff1a xff08 running xff09 绿色即为正常状态 在这里插入图片描述 如果正常查看后面
  • Day1--FreeRTOS简介及多任务点灯、多任务传参、Mutex

    实时操作系统 xff08 Real Time Operating System xff0c 简称RTOS xff09 Arduino任务执行流程 xff1a 单线程执行任务 RTOS xff1a 可以同时执行所有Task xff0c 每个任
  • Day3--流媒体缓存、消息缓存(重要)、直接任务通知

    FreeRTOS 10以后引入了一个新的数据类型就是 Stream Buffer 它和Queue最大的不同就是 xff0c Stream Buffer读写的大小没有限制 xff0c 而Queue是预设值好固定的值 Stream Buffer
  • 51安居安防手电筒拆解

    51安居安防手电筒拆解 相遇就是缘分 xff0c 欢迎 51安居这款手电筒有照明LED灯 安全锤 强力磁铁 手摇发电机 应急闪光灯 FM收音机 警报喇叭等非常多的功能 xff0c 但是自己维修比较困难 我的长辈在外面买了51安防的手电筒 x
  • 关于keil和proteus联调失败的原因探究

    1 没有在两个软件文件夹下放置 dll文件 没有在C51的INI文件中修改 2 没有安装某个 exe文件 3 在proteus中建好电路 xff0c 把keil生成的hex文件导入芯片 xff0c debug xff0c 打开远程调试 xf

随机推荐

  • 富斯遥控器/接收机的PWM/PPM/iBUS/SBUS通道设置

    富斯遥控器FS i6X拥有10通道输出 xff0c 富斯接收机FS iA10B拥有10通道输入 xff0c 两者都有PWM PPM iBUS SBUS协议 xff0c 但是PPM和iBUS协议最高只支持8通道 xff0c 而SBUS协议可以
  • 线程同步的四种方式

    一 xff0c 什么是线程同步和互斥 同步就是协同步调 xff0c 按预定的先后次序进行运行 如 xff1a 你说完 xff0c 我再说 这里的同步千万不要理解成那个同时进行 xff0c 应是指协同 协助 互相配合 线程同步是指多线程通过特
  • python使用cv2库、下载opencv库

    cv2库在opencv库内 xff0c 因此需要下载opencv python 1 打开windows命令行 xff1a win 43 R cmd 2 更新pip版本 xff08 不一定要 xff09 xff1a python m pip
  • PX4学习笔记(1)

    无人机飞控硬件采用Pixhawk 2 4 8 xff0c 软件采用PX4 xff0c 机架使用F450 1 安装PX4环境 1 1 安装虚拟机 VMware虚拟机 16 Pro 1 2 安装Ubuntu Ubuntu 18 04 amd64
  • PX4学习笔记(1-补)

    PX4学习笔记 xff08 1 xff09 中的1 6 安装PX4和gazebo9环境中有一条命令 sudo bash Tools setup ubuntu sh 处于对这个 sh文件的好奇 xff0c 并想分析一下内容 xff0c 于是将
  • 卡片电脑 鲁班猫ZeroW——入门笔记(1)

    由于树莓派价格过于昂贵 xff0c 且无人机又需要机载电脑 xff0c 因此一直在物色便宜好用的卡片电脑 无意中发现了野火的这款鲁班猫 xff0c 想着才260块钱 xff0c 于是买回来试试手 1 硬件结构 鲁班猫采用的是瑞芯微公司设计的
  • PX4学习笔记(2)

    1 PX4编译和仿真 1 1 第一次使用PX4 1 1 1 打开jMAVSim 找到PX4 Autopilot文件夹 xff08 2023 02 13 xff0c 新版本的PX4找不到Firmware了 xff0c 只有PX4 Autopi
  • 关于SKYDROID图传接收机无法在win10电脑上显示图像的问题分析

    因为此前图传接收机无法在win10电脑上显示图像 xff0c 多次尝试后 xff0c 我重新安装了WIN10系统 xff0c 发现禁用笔记本摄像头头 xff0c 在相机内能看到图像 xff0c 了 因此以为问题解决了 xff0c 继续安装其
  • PX4 ulg文件转换为csv(WPS或Excel打开)

    介绍 ulg文件为PX4的飞行日志文件 xff0c 可以通过python的pyulog库转换成scv格式 xff0c 用表格工具打开 下载pyulog 首先保证你的windows电脑内安装了python 3 win 43 R打开cmd 输入
  • Ubuntu18.04虚拟机MQTT服务器(1)——安装宝塔服务器面板与MQTT服务器

    1 虚拟机安装ubuntu18 04 使用VMware安装Ubuntu 18 04 64位系统 2 Ubuntu修改镜像源 在Software amp Update内修改镜像源为清华源 更新 3 安装ssh 输入以下命令 xff0c 安装远
  • ESP-01S烧录及使用,连接本地MQTT服务器

    网上的教程大多无法正常烧录与使用 xff0c 因此在这里进行总结 1 ESP 01S烧录 固件烧录建议使用专用的烧录器 xff0c 十分省心 本文讨论的是使用普通的CH340串口模块进行烧写 必须使用的工具 xff1a 杜邦线 CH340串
  • Qt学习笔记(2)——添加串口程序与调试

    1 串口调试程序总体布局 Qt版本大于5 1 1 1 在pro文件内添加serialport QT 43 61 serialport 1 2 在 h文件内添加库文件 include lt QtSerialPort gt 1 3 添加实例 h
  • AES CBC和CTR加解密实例

    AES xff08 Advanced Encryption Standard xff0c 高级加密标准 xff09 又叫Rijndael加密法 xff0c 用来替代DES算法 常见AES加密模式有ECB CBC CFB OFB和CTR等五种
  • 关于vuex使用常量替代 Mutation 事件类型的好处

    官方文档有说常量的好处 xff0c 但是的确没用过 xff0c 也不怎么懂 xff0c 就我目前有用的了解来说 在后面项目中使用了常量有如下好处 1 常量更容易避免程序出现错误 如果把一个值赋给程序中的一个常量 xff0c 而该常量已经有一
  • 多传感器融合及其应用

    后续会更新部分算法详细内容 多传感器融合及其应用 1 引言 现代雷达信息处理技术 现代雷达信息处理技术分为三个层次 xff1a 雷达信号处理与目标检测 但不雷达数据处理和多部雷达系统数据融合 有时也分别称为雷达信息一次处理 雷达信息二次处理
  • 《结构化编程》— LED灯为例

    你有过看很久以前项目代码看不太懂的情况吗 xff1f 你有过做一个项目就要从零重构代码的烦恼吗 xff1f 你有过那种遇到项目后无从入手编写的困扰吗 xff1f 诸君且看 xff0c 我是如何用一个LED灯代码去做结构化编程的 xff0c
  • 《FPGA学习》->点亮一颗LED灯

    x1f34e 与其担心未来 xff0c 不如现在好好努力 在这条路上 xff0c 只有奋斗才能给你安全感 你若努力 xff0c 全世界都会为你让路 大家刚开始接触硬件编程的话 xff0c 我想大多都是从点亮一颗LED灯开始 xff0c 学习
  • 《FPGA学习》->流水灯设计

    x1f34e 与其担心未来 xff0c 不如现在好好努力 在这条路上 xff0c 只有奋斗才能给你安全感 你若努力 xff0c 全世界都会为你让路 用verilog HDL语言设计一个FPGA的流水灯程序 xff0c 要求时序满足下图所示
  • 《FPGA学习》->多个按键控制LED灯

    x1f34e 与其担心未来 xff0c 不如现在好好努力 在这条路上 xff0c 只有奋斗才能给你安全感 你若努力 xff0c 全世界都会为你让路 本次项目任务 xff0c 利用开发板上的4个按键KEY1 xff0c KEY2 xff0c
  • 《FPGA学习》->呼吸灯

    x1f34e 与其担心未来 xff0c 不如现在好好努力 在这条路上 xff0c 只有奋斗才能给你安全感 你若努力 xff0c 全世界都会为你让路 呼吸灯 xff0c 简而言之就像人类呼吸一样 xff0c 有节奏的让LED灯从 xff1a