Verilog FPGA PWM 呼吸灯

本文介绍了在GW1NR开发板上使用Verilog实现FPGA PWM呼吸灯的两种版本。Version 1通过精细计时产生PWM周期,但由于每个周期亮度变化太小,人眼难以察觉。Version 2简化了设计,每秒10个PWM周期,每个再分为10个子周期,实现了可见的亮度变化。
摘要由CSDN通过智能技术生成


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

 本周在GW1NR开发板上调试的功能
 按键控制的呼吸灯
基本参数:呼吸周期2s,1s逐渐变亮,1s逐渐变暗。
开发板CLK 频率50MHz、周期20ns。


一、Version 1

 Version 1
将1s分为1000个PWM周期,再将每个PWM周期分为1000份(即PWM的精度为其周期的千分之一)
即half_T = 1s ,T_PWM=1ms,T_PWM_precision= 1µs。4个led,共阳极接法,低电平点亮。
程序的编写思路:
 预期功能:在前1s变亮过程中的1000个PWM周期中,led点亮的时长依次从0 – 999 递增,单位为精度。对应到开发板的具体情况即第0个PWM周期低电平的时间为0 µs,第1个PWM周期低电平的时间为1µs,第2个PWM周期低电平的时长为2µs………………第999个PWM周期低电平的时长为999µs。
在后1s变暗的过程中则反向执行上述操作,由999开始依此减1。理论上满足PWM调制产生呼吸灯的原理。
 编程要点:
 首先,因为开发板的时钟周期为20ns,首先设定一个精度计时器将其计数到1µs作为基本的计数单位。每次计数到1µs后产生一个使能信号,使PWM周期计数器 +1,同时精度计时器清零继续计数。
 同理,PWM计数器计满1000之后产生第二个使能信号,使周期T计数器+1,同时PWM计数器清零继续等待计数。
 PWM周期数每+1(即每过1ms),就更新一次pwm_low:1ms内输出低电平的时长(0~999µs)。在前1s内,每经过1ms的时间pwm_low +1;后1s的时间内每经过1ms的时间pwm_low -1。
 使用assign持续赋值语句,比较PWM周期计数器与pwm_low的大小,当cnter_pwm < pwm_low时输出低电平点亮LED。
 输入包含系统时钟clk,控制按键key1和复位按键rstn。输出为LED状态。
 代码:

module Breathing_LED (                           //CLK 50MHz;T_BREATH 2S;T_PWM 1ms; precision 1μs 
    input  clk,
    input  rstn,
    input  key1,
    //output wire PWM_LED_O
    output wire [3:0] PWM_LED_O 
);
reg [7:0] cnter_precision;                       // CLK_T 20ns counter to 1μs
parameter cnter_precision_data = 8'h32;
reg [11:0] cnter_pwm;                            // T_PWM 1ms
parameter cnter_pwm_data = 12'h3E8;

reg [11:0] cnter_T;      
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值