其他分享
首页 > 其他分享> > zedboard板子上呼吸灯的实现(第一版)仿真代码的实现

zedboard板子上呼吸灯的实现(第一版)仿真代码的实现

作者:互联网

module breathe_led(
    input clk,      // 时钟信号
    input rst,     // 复位信号
    output wire led
    );

    // reg define
    reg [16:0] period_cnt; // 周期计数器 1khz = 1ms 1_000_000ns / 10ns(100mhz) = 100_000(17位二进制)
    reg [16:0] duty_cycle; // 设置高电平占空比的计数点
    reg inc_dec_flag;   // 用于表示高电平占空比的计数值,是递增还是递减
                        // 为1时表示占空比递减,为0时表示占空比递增

    // 将周期信号计数值与占空比计数值进行比较,以输出驱动led的PWM信号
    assign led = (period_cnt <= duty_cycle) ? 1'b1 : 1'b0;

    // 周期信号计数器在0-100_000之间计数
    always @(posedge clk or posedge rst) begin
        if(rst) 
            period_cnt <= 17'd0;
        else if(period_cnt == 17'd50)
            period_cnt <= 17'd0;    
        else
            period_cnt <= period_cnt + 17'd1;
    end

    // 设置高电平占空比的数
    always @(posedge clk or negedge rst) begin
        if(rst == 1'b1) begin
            duty_cycle <= 17'd0;
            inc_dec_flag <= 1'b0;
        end
        // 每次计数完一个周期,就调节占空比计数值
        else if(period_cnt == 17'd50) begin
            if(inc_dec_flag) begin // 为1占空比递减
                if(duty_cycle == 17'd0)
                    inc_dec_flag <= 1'b0;
                else 
                    duty_cycle <= duty_cycle - 17'd 5;
            end
            else begin // 占空比递增
                if(duty_cycle == 17'd50)
                    inc_dec_flag <= 1'b1;
                else
                    duty_cycle <= duty_cycle + 17'd5;
            end
        end
        else // 未计数完一个周期,占空比保持不变
            duty_cycle <= duty_cycle;
    end
endmodule
module testbench(

    );
    reg clk;
    reg rst;
    wire led;
    initial begin
        clk = 1'b1;
        rst <= 1'b1;
        #20;
        rst <= 1'b0;
    end
    always #10 clk = ~clk;
    
    breathe_led 
    breathe_led_inst
    (
        .clk(clk),
        .rst(rst),
        .led(led)
    );
endmodule

标签:duty,cnt,led,第一版,zedboard,数值,板子,占空比,reg
来源: https://blog.csdn.net/xiong_xin/article/details/115473513