点灯大师第一步:LED流水灯

1. 需求分析

      实现四个led灯每500ms流水循环闪烁

2. 设计关键

a. 计数器实现500ms间隔

//时间参数定义
    parameter TIME_500MS = 25_000_000;//500ms

//内部信号定义
    reg     [24:0]      cnt_500ms       ;//500ms计数器计数值
    wire                add_cnt_500ms   ;//加1条件
    wire                end_cnt_500ms   ;//结束条件

//计数器
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin 
            cnt_500ms <= 25'd0; 
        end
        else if(add_cnt_500ms)begin 
            if(end_cnt_500ms)begin 
                cnt_500ms <= 25'd0;
            end
            else begin 
                cnt_500ms <= cnt_500ms + 1'b1;
            end
        end
    end

    assign add_cnt_500ms = led_en_1;
    assign end_cnt_500ms = add_cnt_500ms && cnt_500ms == TIME_500MS - 1;

b. 移位寄存器实现流水灯

always @(posedge clk ,negedge rst_n)begin 
        if(!rst_n)begin 
            led_out <= 4'b0001;
        end
        else if(end_cnt_500ms)begin
            led_out <= {led_out[2:0],led_out[3]};
        end
    end

c. 移位运算符实现流水灯

//移位运算符
    always @(posedge clk ,negedge rst_n)begin 
        if(!rst_n)begin 
            led_out <= 4'b0001;
        end
        else if(end_cnt_500ms)begin
            led_out <= led_out << 1;
        end
    end

3. 完整代码

//流水灯,间隔500ms

module flow_led(
    input               clk     ,//输入时钟信号,50MHz 
    input               rst_n   ,//输入复位信号,低有效
    input               led_en_1,
    output  reg [3:0]   led_out  //输出led驱动信号
);

//时间参数定义
    parameter TIME_500MS = 25_000_000;//500ms

//内部信号定义
    reg     [24:0]      cnt_500ms       ;//500ms计数器计数值
    wire                add_cnt_500ms   ;//加1条件
    wire                end_cnt_500ms   ;//结束条件

//描述输出(时序逻辑、组合逻辑)
//计数器
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin 
            cnt_500ms <= 25'd0; 
        end
        else if(add_cnt_500ms)begin 
            if(end_cnt_500ms)begin 
                cnt_500ms <= 25'd0;
            end
            else begin 
                cnt_500ms <= cnt_500ms + 1'b1;
            end
        end
    end

    assign add_cnt_500ms = led_en_1;
    assign end_cnt_500ms = add_cnt_500ms && cnt_500ms == TIME_500MS - 1;

    //循环移位寄存器
    // always @(posedge clk ,negedge rst_n)begin 
    //     if(!rst_n)begin 
    //         led_out <= 4'b0001;
    //     end
    //     else if(end_cnt_500ms)begin
    //         led_out <= {led_out[2:0],led_out[3]};
    //     end
    // end
    
    //移位运算符
    always @(posedge clk ,negedge rst_n)begin 
        if(!rst_n)begin 
            led_out <= 4'b0001;
        end
        else if(end_cnt_500ms)begin
            led_out <= led_out << 1;
        end
        else if(led_out == 4'b0000)begin
            led_out <= 4'b0001;
        end
    end

    

endmodule 

4. 上板验证

代码比较简单,不进行仿真了

流水灯效果实现如下:

led流水灯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值