FPGA project : water_led

 

 

module water_led 
#(
    parameter MAX_CNT = 25'd25_000_000 
)
(
    input           wire                sys_clk     ,
    input           wire                sys_rst_n   ,

    output          wire    [03:00]     led
);
    // signal
    reg     [24:00]     cnt_half_sec ;
    wire                add_cnt      ;
    wire                end_cnt      ;

    reg     [03:00]     led_r        ;
    reg                 ctrl         ;

    // cnt
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            cnt_half_sec <= 0 ;
        end else begin
            if(add_cnt) begin
                if(end_cnt) begin
                    cnt_half_sec <= 0 ;
                end else begin
                    cnt_half_sec <= cnt_half_sec + 1'b1 ;
                end
            end else begin
                cnt_half_sec <= 0 ;
            end
        end
    end
    assign add_cnt = 1'b1 ;
    assign end_cnt = add_cnt && cnt_half_sec == ( MAX_CNT - 1'b1 ) ;

    // // led_r <<
    // always @(posedge sys_clk or negedge sys_rst_n) begin
    //     if(~sys_rst_n) begin
    //         led_r <= 4'b0001 ;
    //     end else begin
    //         if((led_r == 4'b1000) && end_cnt ) begin
    //             led_r <= 4'b0001 ;
    //         end else begin
    //             if(end_cnt) begin
    //                 led_r <= ( led_r << 1 ) ;
    //             end else begin
    //                 led_r <= led_r ;
    //             end
    //         end
    //     end
    // end
    // led_r {}
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            ctrl <= 1'b1 ;
        end else begin
            if(end_cnt && led_r == 4'b0010) begin
                ctrl <= 1'b1 ;
            end else begin
                if(end_cnt && led_r == 4'b0100) begin
                    ctrl <= 1'b0 ;
                end else begin
                    ctrl <= ctrl ;
                end
            end
        end
    end

    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            led_r <= 4'b0001 ;
        end else begin
            if(ctrl) begin
                if(end_cnt) begin
                    led_r <= {led_r[2:0],led_r[3]} ;
                end else begin
                    led_r <= led_r ;
                end
            end else begin
                if(end_cnt) begin
                    led_r <= {led_r[0],led_r[3:1]} ;
                end else begin
                    led_r <= led_r ;
                end
            end
        end
    end
    // led
    assign led = ~led_r ;

endmodule
`timescale 1ns/1ns
module test();
    reg                 sys_clk     ;
    reg                 sys_rst_n   ;

    wire    [03:00]     led         ;

water_led 
#(
    .MAX_CNT (50) 
)
water_led_insert
(
    .sys_clk            ( sys_clk   ) ,
    .sys_rst_n          ( sys_rst_n ) ,

    .led                ( led       )
);

    parameter CYCLE = 20 ;

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b0 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( 210 )          ;
        sys_rst_n <= 1'b0 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( CYCLE * 50 * 20 ) ;
        $stop             ;
    end

    always #( CYCLE / 2 ) sys_clk = ~sys_clk ;


endmodule

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值