pwm呼吸灯

文章目录


一、呼吸灯

呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化,使用开发板上的四个led灯实现1s间隔的呼吸灯。

二、代码实现

c 复制代码
```c
module pwm_led( 
    input				clk		,
    input				rst_n	,
    
    output reg [3:0]    led
);								 
parameter CNT_US = 6'd49;//50x20=1000ns=1us
parameter CNT_MS = 10'd999;//1usx1000=1ms
parameter CNT_S  = 10'd999;//1msx1000=1s

reg [5:0] cnt_us;
wire      add_cnt_us;
wire      end_cnt_us;

reg [9:0] cnt_ms;
wire      add_cnt_ms;
wire      end_cnt_ms;

reg [9:0] cnt_s;
wire      add_cnt_s;
wire      end_cnt_s;

reg flag;//闪烁标志
always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_us <= 0;
    end 
    else if(add_cnt_us)begin 
            if(end_cnt_us)begin 
                cnt_us <= 0;
            end
            else begin 
                cnt_us <= cnt_us + 1;
            end 
    end
   else  begin
       cnt_us <= cnt_us;
    end
end 

assign add_cnt_us = 1'd1;
assign end_cnt_us = add_cnt_us && cnt_us == CNT_US;

always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_ms <= 0;
    end 
    else if(add_cnt_ms)begin 
            if(end_cnt_ms)begin 
                cnt_ms <= 0;
            end
            else begin 
                cnt_ms <= cnt_ms + 1;
            end 
    end
   else  begin
       cnt_ms <= cnt_ms;
    end
end 

assign add_cnt_ms = end_cnt_us;
assign end_cnt_ms = add_cnt_ms && cnt_ms == CNT_MS;

always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_s <= 0;
    end 
    else if(add_cnt_s)begin 
            if(end_cnt_s)begin 
                cnt_s <= 0;
            end
            else begin 
                cnt_s <= cnt_s + 1;
            end 
    end
   else  begin
       cnt_s <= cnt_s;
    end
end 

assign add_cnt_s = end_cnt_ms;
assign end_cnt_s = add_cnt_s && cnt_s == CNT_S;

always @(posedge clk or negedge rst_n)begin 
    if(!rst_n)begin
        flag <= 1'b0;
    end 
    else if(end_cnt_s)begin 
        flag <= ~flag;//1s取反
    end 
    else begin 
        flag <= flag;
    end 
end

always @(posedge clk or negedge rst_n)begin 
    if(!rst_n)begin
        led <= 4'b0;
    end 
    else begin
        if(flag)begin//亮pwm
            led <= {cnt_s > cnt_ms, cnt_s > cnt_ms,cnt_s > cnt_ms,cnt_s > cnt_ms};
        end 
        else begin//灭pwm
            led <= {cnt_s < cnt_ms, cnt_s < cnt_ms,cnt_s < cnt_ms,cnt_s < cnt_ms};
        end
    end 
end
endmodule

三、引脚分配

相关推荐
通信小小昕5 小时前
FPGA|Verilog-自己写的SPI驱动
fpga开发
太爱学习了16 小时前
AXI接口总结
fpga开发
博览鸿蒙21 小时前
FPGA前端设计适合哪些人学?该怎么学?
fpga开发
北京阿尔泰科技厂家1 天前
2路模拟量同步输出卡、任意波形发生器卡—PCIe9100数据采集卡
fpga开发·工业自动化·数据采集卡·任意波形发生器·模拟量输出卡
szxinmai主板定制专家1 天前
基于ARM+FPGA的高端伺服驱动与运动控制解决方案
大数据·arm开发·人工智能·fpga开发·架构
通信小小昕2 天前
FPGA|Verilog-SPI驱动
fpga开发·蓝桥杯·优化·verilog·spi·竞赛
TJ_Dream2 天前
clk_prepare函数详细解析
驱动开发·fpga开发
起床学FPGA2 天前
IBUF和BUFG
fpga开发
_Hello_Panda_2 天前
基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享
fpga开发
数字芯片实验室2 天前
3-2 深入解析数字电路设计中的竞争条件及解决策略
fpga开发