FPGA开发实验(3)- 呼吸灯实验(PWM)

一、实验任务

本节实验任务是使用开发板上的 LED,实现呼吸灯的效果,即由灭渐亮,然后再由亮渐灭。(呼吸频率为2S)

二、程序设计

2.1 呼吸灯模块设计

module breath_led(
    input sys_clk,
    input sys_rst_n,
    output reg [3:0] led
    );

parameter CNT2US_MAX = 7'd100;
parameter CNT2MS_MAX = 10'd1000;
parameter CNT2S_MAX = 10'd1000;

reg [6:0] cnt_2us;    //100个时钟周期
reg [9:0] cnt_2ms;    //1000个cnt_2us
reg [9:0] cnt_2s;     //1000个cnt_2ms
reg [3:0] led_flag;
    
//2us
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        cnt_2us <= 7'd0;
    else if(cnt_2us == CNT2US_MAX - 7'd1)
        cnt_2us <= 7'd0;
    else 
        cnt_2us <= cnt_2us + 7'd1;
end

//2ms
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) 
        cnt_2ms <= 10'd0;
    else if(cnt_2ms == CNT2MS_MAX - 7'd1)
        cnt_2ms <= 10'd0;
    else if(cnt_2us == CNT2US_MAX - 10'd1)
        cnt_2ms <= cnt_2ms + 10'd1;
    else 
        cnt_2ms <= cnt_2ms;
end
 
//2s
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        cnt_2s <= 10'd0;
        led_flag <= 4'b1111;
        end
    else if(cnt_2s == CNT2S_MAX - 10'd1) begin
        cnt_2s <= 10'd0;
        led_flag <= ~led_flag;
    	end
    else if(cnt_2ms == CNT2MS_MAX - 10'd1) 
        cnt_2s <= cnt_2s + 10'd1;   
    else 
        cnt_2s <= cnt_2s;
end 
  
//控制灯
always@(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        led <= 4'b0000;
    else if(cnt_2ms < cnt_2s)
        led <= led_flag;
    else 
        led <= ~led_flag;
end

endmodule
    

2.2 仿真

`timescale 1ns / 1ns        //仿真单位/仿真精度

module tb_breath_led();

//parameter define
parameter CLK_PERIOD  = 20;       //时钟周期 20ns
parameter CNT2US_MAX = 7'd2;
parameter CNT2MS_MAX = 10'd10;
parameter CNT2S_MAX  = 10'd10;

//reg define
reg           sys_clk;
reg           sys_rst_n;

//wire define
wire  [3:0]    led;

//信号初始化
initial begin
    sys_clk <= 1'b0;
    sys_rst_n <= 1'b0;
    #200
    sys_rst_n <= 1'b1;
end

//产生时钟
always #(CLK_PERIOD/2) sys_clk = ~sys_clk;

//例化待测设计
breath_led #(
    .CNT2US_MAX     (CNT2US_MAX),
    .CNT2MS_MAX      (CNT2MS_MAX),
    .CNT2S_MAX       (CNT2S_MAX)
)u_breath_led(
    .sys_clk          (sys_clk),
    .sys_rst_n        (sys_rst_n),
    .led              (led)
    );

endmodule

仿真结果如下图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HQAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值