基于PWM脉宽调制的呼吸灯设计(Vivado)

  • 1.开发环境
  • 2.预备知识
  • 3.思路介绍
  • 4.verliog代码
  • 5.仿真

1.开发环境

软件:Vivado2019.1
硬件:Zynq7010
仿真:Vivado Simulator

2.预备知识

众所周知,灯的亮度和加在其两端的电压有关。电压越高,亮度越亮,反之越暗。
于是,设计一个呼吸灯就变得很简单了。让IO的输出电平由低到高,再有高到底有规律的变化,就能达到呼吸效果。
现在问题来了,IO的输出电平只有0和3.3V的区别,那么如何让其输出0-3.3V之间的任意电压呢?这就需要用到PWM脉宽调制计数。通俗来讲,就是通过控制一个PWM周期内高电平和低电平的时间来控制其电压。比如一个周期内,高电平时间占50%,那么输出电压为1.65v。

总结:PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压。

3.思路介绍

一般人眼睛对于80Hz 以上刷新频率则完全没有闪烁感。

举个例子:

如果在1秒内,高电平0.5秒,低电平0.5秒,(频率1Hz)如此反复,那么你看到的电灯就会闪烁,
但是如果是10毫秒内,5毫秒打开,5毫秒关闭,(频率100Hz) 这时候灯光的亮灭速度赶不上开关速度(LED灯还没完全亮就又熄灭了),由于视觉暂留作用 人眼不感觉电灯在闪烁,而是感觉灯的亮度少了。

既然如此,那我们就采用频率为100hz的PWM波形对电压进行调制。对应的周期为10ms,也就是说10ms内灯的亮度不变(占空比不变),每隔10ms占空比变化一次。如果我们设定满占空比为100,那么整个呼吸灯的周期为2×10ms×100=2s。换句话说,从暗-亮-暗的时间为2s。

ZYNQ的PL端的板载晶振为50mhz,按照以上的思路,我们需要设计一个周期为10ms的定时器,来更新占空比

设计模块的常量如下:

    parameter CLOCK_FREQ = 50000000;//周期20ms,也就是说20ms内比较值不变parameter PWM_FREQ = 100;//100hz parameter PERIOD = CLOCK_FREQ / PWM_FREQ - 1;//10ms定时计数parameter FULL_DUTY = 100;//满占空比parameter STEP = PERIOD / FULL_DUTY;//步长5000

4.verliog代码

module breath_led(input clk,input rst,output reg [3:0] led);parameter CLOCK_FREQ = 50000000;//周期20ms,也就是说20ms内比较值不变parameter PWM_FREQ = 100;//100hz parameter PERIOD = CLOCK_FREQ / PWM_FREQ - 1;//10ms定时计数parameter FULL_DUTY = 100;//满占空比parameter STEP = PERIOD / FULL_DUTY;//步长5000reg [19:0] compare;reg [19:0] counter;//10ms定时reg [6:0] now_duty;//占空比计数reg flag = 1'b1;//方向标志always@(posedge clk or negedge rst) beginif(!rst) begincompare <= 20'd0;counter <= 20'd0;now_duty <= 7'd0;     endelse begincounter <= counter + 1'b1;if(counter == PERIOD) beginif(flag) beginnow_duty <= now_duty + 1'b1;compare <= compare + 14'd5000;counter <= 20'd0;endelse beginnow_duty <= now_duty - 1'b1;compare <= compare - 14'd5000;counter <= 20'd0;           endend    end   endalways@(counter) beginif(counter < compare) beginled <= 4'b1111;      endelse beginled <= 4'b0000;           endendalways@(now_duty) beginif(now_duty == FULL_DUTY) beginflag = 1'b0;endif(now_duty == 0) beginflag = 1'b1;endendendmodule

5.仿真

testbench文件如下:

`timescale 1ns / 1psmodule breath_led_tb();reg clk_reg;
reg rst_reg;
wire [3:0] led;wire clk;
wire rst;initial begin
clk_reg = 0;
rst_reg = 0;
#10
rst_reg = 1;
endalways #1 clk_reg=~clk_reg;
assign rst = rst_reg;
assign clk = clk_reg;breath_led test
(
.clk(clk),
.rst(rst),
.led(led)
);
endmodule


可以看到占空比由小变大的过程,说明我们的逻辑是正确的。

【FPGA基础】基于PWM脉宽调制的呼吸灯设计(Vivado)相关推荐

  1. 基于FPGA的呼吸灯设计

    一:背景介绍: 网上类似的标题很多,有一些呼吸灯的设计是基于单片机的,还有一部分设计是基于FPGA的,我也一时手痒,将这两天自己重新写的verilog描述语句晒出来,免得压箱底放久了,出现发霉点. 为 ...

  2. 【嵌入式知识12】使用PWM实现LED呼吸灯

    本次实验使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果 ...

  3. GD32F303的PWM实现LED呼吸灯的方法

    GD32F303的PWM实现LED呼吸灯的方法 首先配置TIMER1,定义初始化结构体变量 static void ConfigTIMER1ForPWMPB10(unsigned short arr, ...

  4. 小熊派gd32f303学习之旅(7)—使用PWM实现LED呼吸灯

    小熊派gd32f303学习之旅(7)-使用PWM实现LED呼吸灯 一.前言 通过查看gd32f30x的参考手册,可以知道gd32f303的通用定时器和高级定时器可以硬件生成PWM波,然后我们查看gd3 ...

  5. ESP32 Arduino开发之路(2)— 使用PWM实现LED呼吸灯

    ESP32 Arduino开发之路(2)- 使用PWM实现LED呼吸灯 一.前言 在ESP32上有一个LEDC外设模块专用于输出PWM波形,其介绍如下所示: 参考文章:在 ESP32 上使用 LEDC ...

  6. (99)Verilog HDL:呼吸灯设计

    (99)Verilog HDL:呼吸灯设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:呼吸灯设计 5)结语 1.2 FPGA简介 FPGA( ...

  7. 声控灯程序C语言,基于51单片机的声控灯设计设计-包含完整设计与指导文件.doc...

    基于51单片机的声控灯设计设计-包含完整设计与指导文件 工 学 院 毕 业 设 计(论文) 题 目:基于单片机的智能光控路灯的设计 专 业: 机电技术教育 班 级: *** 姓 名: *** 学 号: ...

  8. 基于STM32F4实现LED呼吸灯效果(PWM)

    文章目录 前言 一.定时器及PWM的概述 1.通用定时器 2.PWM 二.配置步骤及代码实现 总结 前言 今天我们来进行PWM的学习,今天使用到的是通用定时器TIM14 ,在此之前我们已经简单学习过定 ...

  9. 启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考

    提示:启明智显专为智能产品提供一站式彩屏显示+连接+云端服务+APP软件开发.维护等解决方案,帮厂商快速实现硬件的智能化.作为启明云端旗下方案公司,我们用心整理了开发小伙伴在开发过程中可能会遇到的问题 ...

最新文章

  1. LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)
  2. 数据结构 - 栈(链表实现栈的入栈出栈)
  3. 给Ionic写一个cordova(PhoneGap)插件
  4. java---servlet与filter的联系与区别
  5. ember helper
  6. MAC快捷键---8
  7. 系统 应用程序 提示 初始化失败 或 无法加载模块 等错误
  8. 大数据需要学哪些内容
  9. 第4.2章:StarRocks数据导出--Export
  10. 论文: 基于智能优化算法的测试数据生成综述
  11. 从一个页面中调用另一个页面的数据
  12. fileupload文件上传用法概述
  13. signature=9e4f4b0dad18452c0736b320a827b91f,Lenze CAN-BUS B-C
  14. 对日软件外包项目问题探讨
  15. 告别中规中矩!好看的PPT时间轴都这么画
  16. 热力学分布用matlab,热力学matlab
  17. c语言编写10进制转换成2进制,c语言位域实现10进制转换成2进制
  18. 软件专业最顶尖的期刊杂志_52杂志中最糟糕的Photoshop错误
  19. 【后门工具】哥斯拉,YYDS#
  20. 哗哗地照样子写词语_照样子.写词语.叠词:悄悄地.呼呼地.厚厚的.眼巴巴地 题目和参考答案——青夏教育精英家教网——...

热门文章

  1. 【uva12232/hdu3461】带权并查集维护异或值
  2. 前端开发使用的 安卓模拟器_【译】移动开发中的仿真器与模拟器
  3. DA14580开发板与lis2ds12三轴传感器数据显示实现
  4. oracle小鸡与合计,oracle 小鸡初始化配置(密码登录/防火墙/bbr)
  5. 【答粉丝问】实施,运维方面的工作考一些什么证书对工作有帮助?
  6. Python学习之数据存储
  7. 关于注册页面上传头像并在后台处理数据
  8. 恒源云(Gpushare)_JupyterLab/TensorBoard使用问题?技巧大放送4
  9. 自媒体人不知怎么剪辑视频,这6个神器助你秒变视频达人!
  10. 主要的计算机犯罪类型的是,计算机犯罪类型是什么