verilog 实现不同按键的LED 闪烁效果

需求

使用开发板上的四个按键控制四个 LED 灯。按下不同的按键时,四个 LED 灯显示不同效果。

按键状态 LED 显示效果
无按键按下 四个 LED 灯全灭
按下 KEY0 自右向左的流水灯
按下 KEY1 自左向右的流水灯
按下 KEY2 四个 LED 同时闪烁
按下 KEY3 四个 LED 灯全亮

系统框图

  • 内部模块:0.2 秒计数器->状态计数器->LED 模式选择
  • 外部驱动:50MHZ 时钟,RST 复位信号,四个按键
  • 展示:四个 LED 灯

代码

0.2 秒计时器模块

always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        cnt <= 24'd0;//复位清零
    else
        if(cnt < 24'd1000_0000)
            cnt <= cnt +1'b1;//未到清零时间加1
        else
            cnt <= 24'd0;//计时清零
end

状态计数器模块

always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        led_strl <= 24'd0;//复位清零
    else
        if(cnt  == 24'd1000_0000)
            led_strl <= led_strl + 1'b1;//未到清零时间加1,到达3的时候会加一自动清零
        else
            led_strl <= led_strl;//未到时间不变
end

按键控制模块

always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        led <= 4'b0000;//复位清零
    else
        if(key[0] == 1'b0)//按键0按下
            case(led_strl)
                2'd0:led <= 4'b1000;
                2'd1:led<=4'b0100;
                2'd2:led<=4'b0010;
                2'd3:led<=4'b0001;
            endcase
        else if(key[1] == 1'b0)//按键1按下
            case(led_strl)
                2'd0:led <= 4'b0001;
                2'd1:led<=4'b0010;
                2'd2:led<=4'b0100;
                2'd3:led<=4'b1000;
            endcase
        else if(key[2] == 1'b0)//按键2按下
            case(led_strl)
                2'd0:led <= 4'b1111;
                2'd1:led<=4'b0000;
                2'd2:led<=4'b1111;
                2'd3:led<=4'b0000;
            endcase
        else if(key[3] == 1'b0)//按键3按下
            led<=4'b1111;
        else
            led<=4'b0000;//都未按下则都不亮
end

你可能感兴趣的:(Verilog,入门,FPGA)