FPGA学习——PWM实现呼吸流水灯(附源码)

文章目录

  • 一、PWM简介
    • 1.1 PWM定义
    • 1.2 PWM参数
  • 二、Verilog实现PWM呼吸灯
  • 三、实现效果
  • 四、总结

一、PWM简介

1.1 PWM定义

PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
脉宽调制(PWM,Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

1.2 PWM参数

  • pwm的频率:是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期

  • 单位: Hz

  • 表示方式: 50Hz 100Hz

  • pwm的周期:T=1/f(周期=1/频率),例如50Hz = 20ms 一个周期,如果频率为50Hz ,也就是说一个周期是20ms
    那么一秒钟就有 50次PWM周期

  • 占空比:是一个脉冲周期内,高电平的时间与整个周期时间的比例

  • 单位: % (0%-100%)

  • 表示方式:20%

  • 脉宽时间占总周期时间的比例,就是占空比

二、Verilog实现PWM呼吸灯

本次实验的主要难点在于如何实现PWM中不同占空比的产生,博主提供的一种思路如下:
由于时钟频率为50MHz,也就是计数50_000_000次为1s,于是我们便可以设置三个计数器,分别为TIME_US、TIME_MS、TIME_1S,

微秒计数器计数50次清零,微秒计数器每次清零时,毫秒计数器+1,毫秒计数器计数至1000次清零,毫秒计数器清零时,1S计数器进1,1S计数器计满1000清零(50×1000×1000 = 50_000_000恰好等于1s时钟震动次数)。
而PWM的产生可以参考以下表达式:

cnt_1s > cnt_ms ? 1’b1 : 1’b0

可以想象,当1S计数器刚进1时,MS计数器会有999次计数大于1S计数器,此时我们只会输出1/1000的高电平,而随着1S计数器的值越来越大(MS计数器计数远快于1S计数器,会不断清零),当1S计数器值为999时,在新一轮的MS计数器计数时,我们便有999/1000的高电平,直至1S计数器计满清零后再次循环,以此我们便获得了渐进式的PWM

具体代码如下:

module pwm_led (input   wire        clk,input   wire        rst_n,output  reg [3:0]   led
);parameter TIME_US = 6'd50;
parameter TIME_MS = 10'd1000;
parameter TIME_1S = 10'd1000;reg [5:0]   cnt_us;
reg [9:0]   cnt_ms;
reg [9:0]   cnt_1s;//us计数器
wire add_cnt_us;//us计数器开始标志
wire end_cnt_us;//us计数器结束标志always @(posedge clk or negedge rst_n) beginif(!rst_n)begincnt_us <= 1'b0;endelse if(add_cnt_us)beginif(end_cnt_us)begin //end_cnt_us为1,计满清零cnt_us <= 1'b0;endelse begincnt_us <= cnt_us + 1'b1;end endelse begincnt_us <= cnt_us;end
endassign add_cnt_us = 1'b1;
assign end_cnt_us = add_cnt_us && cnt_us == TIME_US;//ms计数器
wire add_cnt_ms;//us计数器开始标志
wire end_cnt_ms;//us计数器结束标志always @(posedge clk or negedge rst_n) beginif(!rst_n)begincnt_ms <= 1'b0;endelse if(add_cnt_ms)beginif(end_cnt_ms)begin //end_cnt_ms为1,计满清零cnt_ms <= 1'b0;endelse begincnt_ms <= cnt_ms + 1'b1;end endelse begincnt_ms <= cnt_ms;end
endassign add_cnt_ms = end_cnt_us;
assign end_cnt_ms = add_cnt_ms && cnt_ms == TIME_MS;//1s计数器
wire add_cnt_1s;//1s计数器开始标志
wire end_cnt_1s;//1s计数器结束标志always @(posedge clk or negedge rst_n) beginif(!rst_n)begincnt_1s <= 1'b0;endelse if(add_cnt_1s)beginif(end_cnt_1s)begin //end_cnt_1s为1,计满清零cnt_1s <= 1'b0;endelse begincnt_1s <= cnt_1s + 1'b1;end endelse begincnt_1s <= cnt_1s;end
endassign add_cnt_1s = end_cnt_ms;
assign end_cnt_1s = add_cnt_1s && cnt_1s == TIME_1S;//PWM亮灭控制信号
reg flag;
always@(posedge clk or negedge rst_n)beginif(!rst_n)beginflag <= 1'b0;endelse if(end_cnt_1s)beginflag <= ~flag;endelse beginflag <= flag;end
end//流水灯切换状态
parameter MAX2 = 100_000_000;
reg [27:0]   cnt2;
reg [1:0]   cstate;always@(posedge clk or negedge rst_n)beginif(!rst_n)begincnt2 <= 1'b0;cstate <= 1'b0;endelse if(cnt2 == MAX2 - 1'b1)begincnt2 <= cnt2 + 1'b1;cstate <= cstate + 1'b1;endelse begincnt2 <= cnt2 + 1'b1;cstate <= cstate;end
endalways @(posedge clk or negedge rst_n)beginif(!rst_n)beginled <= 4'b0001;endelse begincase(cstate)2'd0    :   beginif(!flag)beginled <= cnt_1s > cnt_ms ? 4'b0001 : 4'b0000;endelse if(flag)beginled <= cnt_1s < cnt_ms ? 4'b0001 : 4'b0000;endend2'd1    :   beginif(!flag)beginled <= cnt_1s > cnt_ms ? 4'b0010 : 4'b0000;endelse if(flag)beginled <= cnt_1s < cnt_ms ? 4'b0010 : 4'b0000;endend2'd2    :   beginif(!flag)beginled <= cnt_1s > cnt_ms ? 4'b0100 : 4'b0000;endelse if(flag)beginled <= cnt_1s < cnt_ms ? 4'b0100 : 4'b0000;endend2'd3    :   beginif(!flag)beginled <= cnt_1s > cnt_ms ? 4'b1000 : 4'b0000;endelse if(flag)beginled <= cnt_1s < cnt_ms ? 4'b1000 : 4'b0000;endendendcaseend
endendmodule

三、实现效果

如有不会创建项目,烧录,请查看博主以前的博文
在这里插入图片描述

四、总结

本次实验主要难点在于如何实现不同占空比的PWM,解决这一难点后实际上实验就变成了普通的流水灯实验。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI Is the New Power

这个题目纯粹是为了博眼球&#xff0c;因为吴恩达有个题目是AI Is the New Electricity。&#xff1a;&#xff09;但是我想AI确实是为我们这些企业信息化顾问顾问赋予了新的力量&#xff0c;在我们的职业生涯中开辟了新的可能性。 在几周前的文章中&#xff0c;我们提到“终点…

Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond

LLM的系列文章&#xff0c;针对《Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond》的翻译。 在实践中驾驭LLM的力量——ChatGPT及其后的研究综述 摘要1 引言2 模型实用指南2.1 BERT风格的语言模型&#xff1a;编码器-解码器或仅编码器2.2 GPT风格…

WEIQ自动登录实现

文章目录 声明目标网址password加密分析代码实现声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! 目标网址 aHR0cHM6Ly93d3cud2VpcS5jb20vpassword加密分析 研究一下登录加密逻辑,随便…

js小写金额转大写 自动转换

// 小写转为大写convertCurrency(money) {var cnNums [零, 壹, 贰, 叁, 肆, 伍, 陆, 柒, 捌, 玖]var cnIntRadice [, 拾, 佰, 仟]var cnIntUnits [, 万, 亿, 兆]var cnDecUnits [角, 分, 毫, 厘]// var cnInteger 整var cnIntLast 元var maxNum 999999999999999.9999var…

基于springboot+Redis的前后端分离项目(七)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 发布笔记&#xff0c;点赞&#xff0c;点赞排行 达人探店1、达人探店-发布探店笔记2、 达人探店-查看探店笔记3、 达人探店-点赞功…

从零搭建ros间的通信,各功能包、节点之间的通信

新建消息类型 catkin_create_pkg car_interfaces roscpp rospy std_msgs message_generation message_runtime书写自定义的msg&#xff1a; 比如我写一个GlobalPathPlanningInterface.msg&#xff1a; float64 timestamp #时间戳 float32[] startpoint #起点位置&#x…

Eclipse调整系统字体(亲测)

1. 打开eclipse的菜单栏windows->preferences 2. 选择General->Appearance->colors and fonts 3. 选择字号&#xff0c;Apply&#xff0c;ok 建议选择常规18号&#xff0c;这样对眼睛友好一些&#xff0c;不易太大太小 为了大家更好的学习交流&#xff0c;博主新建了v…

MCSM面板一键搭建我的世界服务器 - 外网远程联机【内网穿透工具】

文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 前言 MCSManager是一个…

华为发布大模型时代AI存储新品

7月14日&#xff0c;华为发布大模型时代AI存储新品&#xff0c;为基础模型训练、行业模型训练&#xff0c;细分场景模型训练推理提供存储最优解&#xff0c;释放AI新动能。 企业在开发及实施大模型应用过程中&#xff0c;面临四大挑战&#xff1a; 首先&#xff0c;数据准备时…

2、用phpMyAdmin修改mysql的密码

用phpMyAdmin登录mysql服务器&#xff0c;默认的用户名密码为 Username: root Password: [null] 在账户中修改密码

css3的新特性

动画效果 过渡 transition 鼠标放上去瞬间变大 过渡是变大的过程慢慢变化 第一个参数&#xff1a;对哪些值进行过渡。all为hover中所有&#xff0c;也可以指定属性 第二个参数&#xff1a;让动画过渡多长时间。要添加单位&#xff08;s秒&#xff09; 第三个参数&#xff1…

光速吟唱,Clibor ,批量多次复制依次粘贴工具 快捷输入软件教程

批量多次复制依次粘贴工具 批量复制粘贴工具0.81.exe https://www.aliyundrive.com/s/3sbBaGmHkb8 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。 青县solidworks钣金设计培训 …