四、呼吸灯实战

一、呼吸灯简介

呼吸灯:由灭渐亮,然后再由亮渐灭,模仿人呼吸方式的LED灯,

二、呼吸灯原理

PWM(Pulse Width Modulation),脉冲宽度调制,

三、代码

四个呼吸灯代码

复制代码
//首先module开始模块
module breath_led(
    input sys_clk,
    input sys_rst_n,

    output [3:0] led

);
//然后开始生成一个pwm波,在一段时间内,我们的占空比由小变大,再由大变小这样子一个脉冲调制,它就是一个pwm波。
//定义一个计数器,时间周期做多长,呼吸灯效果最好,可以做一个尝试,确定之后要把位宽给定下来,电脑调出计算器,win+r,输入calc
//1毫秒除以20纳秒=50000,50000换成2进制是16位,所以需要16位位宽,要给它定义成[0-15],20纳秒是晶振,
reg     [15:0]      period_cnt;
//第一个空占25,第二个空占50,第三个空占75,不断累加,占空比越占越宽,当占到50000之后占满了,再开始减小,再25、25的减再减到0,这样就实现了一个pwm波的产生。
reg     [15:0]      duty_cycle;
//定义一个寄存器,用来控制我们这个占空比是往上加还是往上减,增加减少标志位
reg                 inc_dec_flag;
assign led[0] = (period_cnt >= duty_cycle) ? 1'b1 : 1'b0;
assign led[1] = (period_cnt >= duty_cycle) ? 1'b1 : 1'b0;
assign led[2] = (period_cnt >= duty_cycle) ? 1'b1 : 1'b0;
assign led[3] = (period_cnt >= duty_cycle) ? 1'b1 : 1'b0;
//定义一个时间段,做周期计数器
always @(posedge sys_clk or negedge sys_rst_n)begin//定义一个时间段,做周期计数器
if(!sys_rst_n)//if 复位,计数器清零
    period_cnt<=0;
else if(period_cnt==16'd50000)//没有复位的时候,它要数五万次,没到五万次让它加一,到了五万次让它清0。
    period_cnt<=0;
else                        //没到五万次让它加一,到了五万次让它清0。
    period_cnt<=period_cnt+1'b1;
end
//要做一个占空
always @(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin//if 复位,计数器清零,标志位清零
        duty_cycle<=0;
        inc_dec_flag<=0;
    end
    else begin
        if(period_cnt==16'd50000)begin              //先判定他有没有执行完一个完整的周期
            if (inc_dec_flag<=0)begin               //再判定inc_dec_flag标志位状态是否为0
                if(duty_cycle==16'd50000)           //再判定duty_cycle有没有增到50000
                    inc_dec_flag<=1;                //增加到50000,标志位反转
                else                                //没增加到50000,duty_cycle增加25
                    duty_cycle<=duty_cycle+25;
            end
            else begin                              //如果inc_dec_flag标志位状态为1,则执行
                if(duty_cycle==16'd0)               //如果duty_cycle为0
                    inc_dec_flag<=0;                //则标志位为0
                else                                //如果duty_cycle不为0
                    duty_cycle<=duty_cycle-25;      //duty_cycle减少25
            end
        end
    end
end
endmodule
相关推荐
坏孩子的诺亚方舟14 天前
FPGA系统架构设计实践15_高云Arora V系列时钟体系
fpga开发·系统架构
FPGA小徐15 天前
入门 CNN 结构全解析|从流程图理论到 FPGA Verilog 硬件实现(含习题带讲解)
fpga开发
FPGA小徐15 天前
FPGA 数字信号处理:并行 FIR 与串行滤波器设计原理、对比与完整 Verilog 实现
fpga开发
Saniffer_SH16 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
zlinear数据采集卡16 天前
双核架构深度解析:ARM+FPGA如何让数据采集卡实现500Ksps高性能?
arm开发·fpga开发·架构
9527华安16 天前
FPGA实现GTH Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·gth·aurora 8b10b·transceivers
FPGA小徐17 天前
FPGA 数字信号处理(二):并行 FIR 滤波器的 Verilog 全流程设计与实现
fpga开发
国科安芯17 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
ALINX技术博客17 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
Hello-FPGA17 天前
Xilinx KU040 FPGA Camera Link 图像采集
c++·fpga开发