FPGA实验按键控制流水灯

Posted zstar-_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FPGA实验按键控制流水灯相关的知识,希望对你有一定的参考价值。

配置选择

上篇【FPGA实验】流水灯实验记录了如何上手FPGA,实现简单的流水灯效果,本篇将稍微升级一些,通过按钮实现多种形态的流水灯。此次仍使用正点原子的开拓者FPGA开发板,配置和上篇一致。

功能描述

按键1按下时,从右向左的流水灯效果;
按键2按下时,从左向右的流水灯效果;
按键3按下时,LED闪烁;
按键4按下时,LED全亮;
无按键按下时,LED熄灭 ;

verilog代码

先贴官方给的例程代码:

module flow_light(
    input               sys_clk  ,    //50Mhz系统时钟
    input               sys_rst_n,    //系统复位,低有效
    input        [3:0]  key,          //按键输入信号
    output  reg  [3:0]  led           //LED输出信号
    );

//reg define     
reg  [23:0] cnt;
reg  [1:0]  led_control;

//用于计数0.2s的计数器
always @ (posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        cnt<=24'd9_999_999;
    else if(cnt<24'd9_999_999)
        cnt<=cnt+1;
    else
        cnt<=0;
end 

//用于led灯状态的选择
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        led_control <= 2'b00;
    else if(cnt == 24'd9_999_999) 
        led_control <= led_control + 1'b1;
    else
        led_control <= led_control;
end

//识别按键,切换显示模式
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
          led<=4'b 0000;
    end
    else if(key[0]== 0)  //按键1按下时,从右向左的流水灯效果
        case (led_control)
            2'b00   : led<=4'b1000;
            2'b01   : led<=4'b0100;
            2'b10   : led<=4'b0010;
            2'b11   : led<=4'b0001;
            default  : led<=4'b0000;
        endcase
    else if (key[1]==0)  //按键2按下时,从左向右的流水灯效果
        case (led_control)
            2'b00   : led<=4'b0001;
            2'b01   : led<=4'b0010;
            2'b10   : led<=4'b0100;
            2'b11   : led<=4'b1000;
            default  : led<=4'b0000;
        endcase
    else if (key[2]==0)  //按键3按下时,LED闪烁
        case (led_control)
            2'b00   : led<=4'b1111;
            2'b01   : led<=4'b0000;
            2'b10   : led<=4'b1111;
            2'b11   : led<=4'b0000;
            default  : led<=4'b0000;
        endcase
    else if (key[3]==0)  //按键4按下时,LED全亮
        led=4'b1111;
    else
        led<=4'b0000;    //无按键按下时,LED熄灭     
end

endmodule 

代码解读

LED点亮

和之前类似,开发板上共有四个LED灯。
因此用一个四位寄存器led来存储每个灯的状态,1亮0灭。这里值得注意的是,四位存储的状态方向和实际方向是相反的。

按键判断

开发板上共四个按键,由于按键的信息不需要存贮(直接获取判断即可),因此采用四位的线网类型的key来判断按键是否被按下。若按下,则key获取到的是低电平,即0。

LED状态切换

考虑到流水灯的情况,因此最多有4个状态。这里用两位led_control来进行状态的切换,每0.2s切换一次状态,00,01,10,11周而复始。

频率

频率的实现在上篇的流水灯中已经介绍过,这里采用是计数器累加的方式。

功能拓展

这里基于上面的分析,可以进一步拓展功能。

改变形态

如果需要按下按键,改变流水灯的花样,多设置几个led_control即可。

改变速率

如果需要改变流水灯的速率,采用不同的cnt即可。

管脚分配

最后基于引脚图进行管脚分配。

以上是关于FPGA实验按键控制流水灯的主要内容,如果未能解决你的问题,请参考以下文章

FPGA实验流水灯实验

正点原子FPGA连载第九章按键控制LED灯实验 -摘自正点原子新起点之FPGA开发指南_V2.1

FPGA实验蜂鸣器

09A-独立按键消抖实验01——小梅哥FPGA设计思想与验证方法视频教程配套文档

流水灯实训报告

[FPGA] Verilog 燃气灶控制器的设计与实现