用FPGA设计呼吸灯

呼吸灯介绍:

呼吸灯是指灯能够像人的呼吸一样,实现由暗到亮或由亮到暗的变化,通常用于消息提示功能,或者作为系统正在运行的提示。

呼吸灯原理:

通过脉冲宽度调制(PWM)实现,即通过调节占空比来对模拟信号电平进行数字编码,进而控制高电平时间

 实验目的:用一个按键可以开关控制呼吸灯的呼吸与停止

模块框图:

breath_led 模块代码  (该代码参考了野火的呼吸灯代码)

链接:16. 呼吸灯 — [野火]FPGA Verilog开发实战指南——基于Altera EP4CE10 征途Pro开发板 文档 (embedfire.com)


module  breath_led
(
    input   wire    clk_50mhz     ,   //系统时钟50Mhz
    input   wire    rst_n         ,   //全局复位
    input   wire    led_flag      ,   //输入信号,一个高电平周期

    output  reg     led_out           //输出信号,控制led灯
);

parameter CNT_1US_MAX = 6'd49   ;
parameter CNT_1MS_MAX = 10'd999 ;
parameter CNT_1S_MAX  = 10'd999 ;


reg [5:0]   cnt_1us     ;
reg [9:0]   cnt_1ms     ;
reg [9:0]   cnt_1s      ;
reg         cnt_1s_en   ;

reg led_flag_h ;

//把输入信号led_flag处理为电平反转信号
always@(  posedge  clk_50mhz or negedge rst_n) begin 
    if (rst_n==1'b0) begin
        led_flag_h <= 1'b0;
    end
    else if (led_flag == 1'b1) begin
        led_flag_h <= ~led_flag_h;
    end
    else begin
        led_flag_h <= led_flag_h;
    end
end 

//cnt_1us:1us计数器
always@(posedge clk_50mhz or negedge rst_n) begin
    if(rst_n == 1'b0) begin
        cnt_1us <= 6'b0;
    end
    else if(cnt_1us == CNT_1US_MAX) begin
        cnt_1us <= 6'b0;
    end
    else begin
        cnt_1us <= cnt_1us + 1'b1;
    end
        
end


//cnt_1ms:1ms计数器
always@(posedge clk_50mhz or negedge rst_n) begin
    if(rst_n == 1'b0) begin
        cnt_1ms <= 10'b0;
    end
    else    if(cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX) begin
        cnt_1ms <= 10'b0;
    end
    else    if(cnt_1us == CNT_1US_MAX) begin
        cnt_1ms <= cnt_1ms + 1'b1;
    end
end


//cnt_1s:1s计数器
always@(posedge clk_50mhz or negedge rst_n) begin
    if(rst_n == 1'b0) begin
        cnt_1s <= 10'b0;
    end
    else    if(cnt_1s == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX 
                && cnt_1us == CNT_1US_MAX) begin
        cnt_1s <= 10'b0;  
    end
    else    if(cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX) begin
        cnt_1s <= cnt_1s + 1'b1;
    end
end


//cnt_1s_en:1s计数器使能信号
always@(posedge clk_50mhz or negedge rst_n) begin
    if(rst_n == 1'b0) begin
        cnt_1s_en <= 1'b0;
    end
    else    if(cnt_1s == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX 
                && cnt_1us == CNT_1US_MAX) begin
        cnt_1s_en <= ~cnt_1s_en;            
    end
        
end


//led_out:输出信号连接到外部的led灯
always@(posedge clk_50mhz or negedge rst_n) begin
    if(rst_n == 1'b0) begin
        led_out <= 1'b0;
    end
    else    if(led_flag_h == 1'b1) begin
        led_out <= 1'b0;
    end
    else    if((cnt_1s_en == 1'b1 && cnt_1ms < cnt_1s) || 
                (cnt_1s_en == 1'b0 && cnt_1ms > cnt_1s)) begin
        led_out <= 1'b0;            
                end  
    else begin
        led_out <= 1'b1;
    end
  
end


endmodule

key_filter模块代码,见我的这一篇文章 :用FPGA设计软件按键消抖-CSDN博客

key_breath_led 模块代码

module key_breath_led (
    input   wire    clk_50mhz   ,   //系统时钟50Mhz
    input   wire    rst_n       ,   //全局复位
    input   wire    key_in      ,   //按键输入信号

    output  wire    led_out         //输出信号,控制led灯
    
);


wire     key_flag;


key_filter key_filter_inst
(
    .clk_50mhz  (clk_50mhz)     ,   //系统时钟50Mhz
    .rst_n      (rst_n    )     ,   //全局复位
    .key_in     (key_in   )     ,   //按键输入信号
 
    .key_flag   (key_flag )         //key_flag为1时表示消抖后检测到按键被按下
                                    //key_flag为0时表示没有检测到按键被按下
);


breath_led breath_led_inst
(
    .clk_50mhz   (clk_50mhz)  ,   //系统时钟50Mhz
    .rst_n       (rst_n    )  ,   //全局复位
    .led_flag    (key_flag )  ,   //输入信号,一个高电平周期

    .led_out     (led_out  )      //输出信号,控制led灯
);


endmodule //key_breath_led

FPGA(Field-Programmable Gate Array)是一种可编程逻辑器件,用于设计和实现各种硬件系统,包括简单的LED灯控制。对于FPGA呼吸灯设计,其基本思路如下: 1. **硬件接口**: 首先,你需要确定使用哪个FPGA的输入/输出引脚来连接LED灯。通常,GPIO(通用输入输出)或类似的模块会被用来作为LED的驱动信号。 2. **时序设计**: 呼吸灯效果依赖于灯的闪烁频率和亮度变化。确定一个基础的周期,比如几个微妙或毫秒,然后通过计数器或者状态机来控制LED的开关。 3. **状态机或计数器**: 使用状态机的设计方法,定义LED的不同工作状态,如关闭、亮起、慢慢亮、慢慢暗等。计数器可以用来控制灯的闪烁速度,比如每增加一定次数就改变亮度或切换到下一个阶段。 4. **编程逻辑**: 在FPGA中,编写Verilog或VHDL代码来描述这个逻辑。这部分代码会定义如何根据状态机的状态来控制LED的驱动信号。 5. **配置和下载**: 使用FPGA开发工具(如Xilinx ISE或Vivado, Intel Quartus II等),将编写的逻辑配置到目标FPGA芯片上。 6. **测试**: 通过硬件调试器或JTAG接口验证设计是否按照预期工作,调整参数以达到理想的效果。 相关问题: 1. FPGA呼吸灯设计中,如何控制LED的亮度变化? 2. 在状态机设计中,有哪些常见的状态用于呼吸灯效果? 3. 如何通过编程逻辑实现灯的闪烁频率变化?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值