20.呼吸灯:利用PWM控制小灯在相同时间段内的不同占空比

(1)设计一段代码,实现led灯在一秒内由完全熄灭到完全点亮,在第二秒由完全点亮转为完全熄灭,循环往复。

(2)Verilog代码:

module breath_led(clk,reset_n,led);

    input clk;
    input reset_n;
    
    output led;
// 1 us = 1000 ns = 20ns *50;    
    reg [5:0] cnt_1us;
// 1 ms = 1000 us < 2 ^ 11 us
    reg [9:0] cnt_1ms;
// 1s   = 1000 ms < 2 ^ 11 ms
    reg [9:0] cnt_1s;
    reg overturn;   //翻转信号
    
    parameter MCNT_1us = 6'd49;
    parameter MCNT_1ms = 10'd999;
    parameter MCNT_1s  = 10'd999;

//1us计数器模块设计    
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_1us <= 6'd0;
        else if(cnt_1us == MCNT_1us)
            cnt_1us <= 6'd0;
        else 
            cnt_1us <= cnt_1us + 6'd1;

//1ms计数器模块设计
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_1ms <= 10'd0;
        else if((cnt_1ms == MCNT_1ms)&&(cnt_1us == MCNT_1us))
            cnt_1ms <= 10'd0;
        else if(cnt_1us == MCNT_1us)
            cnt_1ms <= cnt_1ms + 10'd1;
        else    
            cnt_1ms <= cnt_1ms;

//1s计数器模块设计
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_1s  <= 10'd0;
        else if((cnt_1s == MCNT_1s)&&(cnt_1ms == MCNT_1ms)&&(cnt_1us == MCNT_1us))
            cnt_1s <= 10'd0;
        else if((cnt_1ms == MCNT_1ms)&&(cnt_1us == MCNT_1us))
            cnt_1s <= cnt_1s + 10'd1;
        else 
            cnt_1s <= cnt_1s;

//翻转逻辑设计overturn
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            overturn <= 1'd0;
        else if((cnt_1s == MCNT_1s)&&(cnt_1ms == MCNT_1ms)&&(cnt_1us == MCNT_1us))
            overturn <= ~overturn;
        else    
            overturn <= overturn;

//led主程序设计
    
    assign led = (((overturn == 0)&&(cnt_1ms <= cnt_1s)) ||((overturn == 1)&&(cnt_1ms <= MCNT_1s - cnt_1s)));
    
endmodule

(3)仿真文件代码:

`timescale 1ns / 1ps

module breath_led_tb;

    reg clk;
    reg reset_n;
    
    wire led;

    breath_led breath_led_inst(
        .clk(clk),
        .reset_n(reset_n),
        .led(led)
    );
    
    defparam breath_led_inst.MCNT_1us = 4;
    defparam breath_led_inst.MCNT_1ms = 9;
    defparam breath_led_inst.MCNT_1s  = 9;

    initial clk = 1'd1;
    always #10 clk = ~clk;
    
    initial begin
        reset_n <= 1'd0;
        #15;
        reset_n <= 1'd1;
        #50000;
        $stop;
    end
    
endmodule

(4)仿真波形:

(5)引脚绑定:

相关推荐

  1. STM32学习和实践笔记(24):PWM输出实验:呼吸

    2024-07-09 21:28:03       32 阅读
  2. STM32自学☞PWM驱动LED呼吸

    2024-07-09 21:28:03       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 21:28:03       49 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 21:28:03       53 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 21:28:03       42 阅读
  4. Python语言-面向对象

    2024-07-09 21:28:03       53 阅读

热门阅读

  1. uniapp开发射击类小游戏

    2024-07-09 21:28:03       22 阅读
  2. NI SCXI-1001 模块处理器控制器

    2024-07-09 21:28:03       20 阅读
  3. Oracle数据库自带的内置表和视图、常用内部视图

    2024-07-09 21:28:03       17 阅读
  4. 程序员失业日记2:失业后迷茫

    2024-07-09 21:28:03       21 阅读
  5. uniapp 请求封装

    2024-07-09 21:28:03       22 阅读
  6. Python人生重开器

    2024-07-09 21:28:03       19 阅读
  7. 【3】迁移学习模型

    2024-07-09 21:28:03       18 阅读
  8. Transformer 入门案例教程(大语言模型)

    2024-07-09 21:28:03       25 阅读
  9. 白骑士的C语言教学高级篇 3.4 C语言中的算法

    2024-07-09 21:28:03       21 阅读
  10. flask-apscheduler 定时任务被执行两次

    2024-07-09 21:28:03       19 阅读
  11. 部署Gunicorn + Flask应用到Docker

    2024-07-09 21:28:03       20 阅读
  12. VB 爬虫技术

    2024-07-09 21:28:03       21 阅读