FPAG学习verilog实现呼吸灯

该文描述了一个使用Verilog编写的呼吸灯模块,通过三个计数器(us,ms,s)控制LED的亮灭频率,形成呼吸效果。在每个秒周期内,当ms计数器小于s计数器时LED关闭,反之则打开,实现了LED的缓慢亮暗变化。同时提供了测试模块tb用于验证设计功能。
摘要由CSDN通过智能技术生成

实现呼吸灯

时序图

在这里插入图片描述## 代码

module breath_led
#(
    parameter CNT_US_MAX = 16'd49;
    parameter CNT_MS_MAX = 16'd999;
    parameter CNT_S_MAX = 16'd999;
) (
    input wire clk,
    input wire rst_n,
    output reg led_out
);

reg [15:0]cnt_s;
reg [15:0]cnt_ms;
reg [15:0]cnt_us;
reg cnt_en;


//us计数器
always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        cnt_us <= 16'd0;
    end
    else if (cnt_us == CNT_US_MAX) begin
        cnt_us <= 16'd0;
    end
    else begin
        cnt_us <= cnt_us + 16'd1;
    end
end

//ms计数器
always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        cnt_ms <= 16'd0;
    end
    else if (cnt_ms == CNT_MS_MAX && cnt_us == CNT_US_MAX) begin
        cnt_ms <= 16'd0;
    end
    else if(cnt_us == CNT_US_MAX)begin
        cnt_ms <= cnt_ms + 16'd1;
    end
    else begin
        cnt_ms <= cnt_ms;
    end
end

//s计数器
always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        cnt_s <= 16'd0;
    end
    else if (cnt_s == CNT_S_MAX && cnt_ms == CNT_MS_MAX && cnt_us == CNT_US_MAX) begin
        cnt_s <= 16'd0;
    end
    else if(cnt_ms == CNT_MS_MAX && cnt_us == CNT_US_MAX)begin
        cnt_s <= cnt_s + 16'd1;
    end
    else begin
        cnt_s <= cnt_s;
    end
end

//en计数器(呼和吸是反过程,这是每秒反转的使能信号)
always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        cnt_en <= 1'b0;
    end
    else if(cnt_s == CNT_S_MAX && cnt_ms == CNT_MS_MAX && cnt_us == CNT_US_MAX)begin
        cnt_en <= ~cnt_en;
    end
    else begin
        cnt_en <= cnt_en;
    end
end

always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        led_out <= 1'b1;
    end
    else if ((cnt_ms <= cnt_s && cnt_en == 1'b0) || (cnt_ms >= cnt_s && cnt_en == 1'b1)) begin
        led_out <= 1'b0;
    end
    else if(cnt_s == 0) begin
        led_out <= 1'b1;
    end
    else begin
        led_out <= 1'b1;
    end
    
end

endmodule

tb文件

`timescale 1ns/1ps

module breath_led_tb ();
    
reg clk;
reg rst_n;
wire led_out;

initial begin
    clk = 1'b0;
    rst_n = 1'b0;
    #2
    rst_n = 1'b1;
end

always #10 clk = ~clk;

breath_led breath_led_1(
    .clk(clk),
    .rst_n(rst_n),
    .led_out(led_out)
);

endmodule

仿真结果

仿真

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、付费专栏及课程。

余额充值