FPGA-呼吸灯

一、概述

原理:呼吸灯其实是在微控制器的控制下,由暗渐亮、然后再由亮渐暗,模仿人呼吸方式的 LED 灯。通过脉冲宽度调制(PWM)实现,即通过调节占空比来对模拟信号电平进行数字编码,进而控制高电平时间。
实验现象:LED灯由暗逐渐变亮,再由亮逐渐变暗。

二、实验

1、源代码

module pwm_d
#(
   parameter u1s_max = 10'd999,
   parameter u1ms_max = 10'd999,
   parameter u1us_max = 7'd99
)
(clk,rst,led);
input clk,rst;
output led;

reg led;

reg [9:0]u1s;
reg [9:0]u1ms;
reg [6:0]u1us;
reg en;

always @(posedge clk or negedge rst)
  if(!rst)
    u1us <= 0;
  else if(u1us == u1us_max)
    u1us <= 0;
  else 
    u1us <= u1us + 1;
    
always @(posedge clk or negedge rst)
  if(!rst)
    u1ms <= 0;
  else if((u1ms == u1ms_max) && (u1us == u1us_max))
    u1ms <= 0;
  else if(u1us == u1us_max)
    u1ms <= u1ms + 1;
  else 
    u1ms <= u1ms;
    
always @(posedge clk or negedge rst)
  if(!rst)
    u1s <= 0;
  else if((u1s == u1s_max) && (u1ms == u1ms_max) && (u1us == u1us_max))
    u1s <= 0;
  else if((u1ms == u1ms_max) && (u1us == u1us_max))
    u1s <= u1s + 1;
  else 
    u1s <= u1s;
    
always @(posedge clk or negedge rst)
  if(!rst)
    en <= 0;
  else if((u1s == u1s_max) && (u1ms == u1ms_max) && (u1us == u1us_max))
    en <= ~en;
  else
    en <= en;
    
always @(posedge clk or negedge rst)
  begin
    if(!rst)
      led <= 0;
    else if((en == 0) && (u1ms <= u1s) || (en == 1) && (u1ms >= u1s))
      led <= 1;
    else 
      led <= 0;
  end

endmodule

2、仿真代码

`timescale 1ns / 1ps

module hxd_fz;
reg clk,rst;
wire led;

pwm_d
#(
   .u1s_max(5),
   .u1ms_max(5),
   .u1us_max(1)
)
u1(clk,rst,led);

initial
  begin
    rst <= 0;
    #20 rst <= 1;
  end
 
initial
  begin
    clk <= 0;
    while(1) #5 clk <= ~clk;
  end   

endmodule

三、实验现象

在这里插入图片描述

hxd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值