FPGA学习——按键控制LED流水灯(附源码 无按键消抖版本)

这篇具有很好参考价值的文章主要介绍了FPGA学习——按键控制LED流水灯(附源码 无按键消抖版本)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

在博主的cyclone4开发板上一共有4个按键,本次实验的目的是为了实现每按下一次按键,都会使开发板上的4个LED灯切换一次状态,博主一共设计了四种状态,分别是:

按键 状态
按键1按下 自右向左的流水灯
按键2按下 自左向右的流水灯
按键3按下 四灯常亮
按键4按下 四灯闪烁

二、开发板按键原理图

fpga按键控制流水灯,fpga开发,学习

  • 由原理图可以看出,开发板按键按下代表低电平

三、源码

在源码中博主设计了一个0.2s的计数器和两位的cstate状态寄存器,用来控制LED的状态及流水灯闪烁。同时可以看出博主设计了一个flag寄存器,由于本次实验未添加按键消抖模块,因此按键按下后需要一直按住才能实现效果,而引入flag后,我们便可以通过按键按下后一瞬间的电平改变从而改变flag的状态,再由flag的状态控制LED的状态,以此算是一种无按键消抖的平替。

注意:这并不能算是按键消抖,只是因为抖动时间极短,难以在LED灯上体现出来,实际上flag最后还是采样的稳定的低电平信号。
按键消抖及按键消抖控制led请查看博主此篇博文!!
这算是博主在初学FPGA是犯下的错误!!!

module key_led (
    input   wire            clk,
    input   wire            rst_n,
    input   wire    [3:0]   key,

    output  reg     [3:0]   led
);
    parameter MAX = 10_000_000;
    reg [23:0]  cnt;
    reg [1:0]   cstate;
    reg [3:0]   flag;

//0.2s计数器
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)begin
            cnt <= 1'b0;
        end
        else if(cnt == MAX - 1'b1)begin
            cnt <= 1'b0;
        end
        else begin
            cnt <= cnt + 1'b1;
        end
    end

//状态控制 之所以不需要在状态计满后清零,是因为后续在计数至11后再加1值来到100
//而我们的状态设置为两位寄存器,因此只取后两位变为00,相当于清零
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cstate <= 2'd0;
        end
        else if(cnt == MAX - 1'b1)begin
            cstate <= cstate + 1'b1;
        end
        else begin
            cstate <= cstate;
        end
    end
//根据按键状态改变flag状态
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            flag <= 4'b0000;
        end
        else if(key[0] == 1'b0)begin
            flag <= 4'b0001;
        end
        else if(key[1] == 1'b0)begin
            flag <= 4'b0010;
        end
        else if(key[2] == 1'b0)begin
            flag <= 4'b0100;
        end
        else if(key[3] == 1'b0)begin
            flag <= 4'b1000;
        end
        else begin
            flag <= flag;
        end
    end
//根据flag状态改变led状态
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            led <= 4'b0000;
        end
        else if(flag == 4'b0001)begin
            case (cstate)
               2'd0 : led <= 4'b0001;
               2'd1 : led <= 4'b0010;
               2'd2 : led <= 4'b0100;
               2'd3 : led <= 4'b1000;
                default: led <= 4'b0000;
            endcase
        end
        else if(flag == 4'b0010)begin
            case (cstate)
               2'd0 : led <= 4'b1000;
               2'd1 : led <= 4'b0100;
               2'd2 : led <= 4'b0010;
               2'd3 : led <= 4'b0001;
                default: led <= 4'b0000;
            endcase
        end
        else if(flag == 4'b0100)begin
            case (cstate)
               2'd0 : led <= 4'b1111;
               2'd1 : led <= 4'b0000;
               2'd2 : led <= 4'b1111;
               2'd3 : led <= 4'b0000;
                default: led <= 4'b0000;
            endcase
        end
        else if(flag == 4'b1000)begin
            case (cstate)
               2'd0 : led <= 4'b1111;
               2'd1 : led <= 4'b1111;
               2'd2 : led <= 4'b1111;
               2'd3 : led <= 4'b1111;
                default: led <= 4'b0000;
            endcase
        end
        else begin
            led <= 4'b0000;
        end
    end

endmodule

四、实现效果

fpga按键控制流水灯,fpga开发,学习文章来源地址https://www.toymoban.com/news/detail-735703.html

到了这里,关于FPGA学习——按键控制LED流水灯(附源码 无按键消抖版本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机学习--按键控制流水灯模式&定时器时钟

    TMOD负责确定T0和T1的工作模式,TCON控制T0和T1的启动或停止计数,同时包含定时器状态 TF1:定时器1溢出标志 TF0:定时器0溢出标志 0~65535 每隔1微秒计数器+1,总时间65535微秒,赋上初值64535,则只有1000微秒即1毫秒 首先配置TMOD 所以初始化TMOD = 0x01; //0000 0001 整体操作:TMOD = TM

    2024年02月14日
    浏览(46)
  • FPGA入门————LED流水灯(超详细教程)

    本文使用软件为vivado,其实用哪个软件都是一样的,主要是掌握核心编程思想。 如有需要下载vivado软件下载可以参考: vivado及ISE各版本软件下载方法、链接及详细步骤,官方网页下载_ise软件下载_千寻xun的博客-CSDN博客 目录 一、新建工程及设计文件 二、编写LED流水灯程序

    2024年02月08日
    浏览(43)
  • 51单片机按键控制流水灯

    1独立按键的原理图 按键所对应的引脚为P3的0、1、2、3引脚口,并且这里总共有四个独立按键,它们公共的一段都接到了 GND 电源的负极。这样我们就知道按键上电的默认电平为高电平。所以我们只需要控制按键按下时给一个低电平0,不按下时默认高电平1就行。  2按键控制

    2024年02月11日
    浏览(55)
  • 【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯

    实验内容: 利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测按键输入电平。         1.选中 8 位数码管的其中 1 位数码管,当独立按键 1 每按下一次,数码管加一(按下期间加 1),范围为 0—F;         2.选中 8 位数码管的另 1 位数码管,当独立按键 2

    2024年02月06日
    浏览(47)
  • 51单片机通过两个按键控制流水灯方向

    按键一接单片机P3_1,按键2接P3_0 8个流水灯接P2口 以下是代码:

    2024年02月11日
    浏览(48)
  • 5.2 FPGA:基于verilog的LED流水灯设计(多种方法)

    目录 设计目标:8个LED灯以每0.5s的速率进行循环闪烁 方法1:移位法实现 设计模块 仿真代码 实验结果  方法2:循环移位方法  设计模块 方法3:使用三八译码器实现流水灯 顶层模块 底层模块 当仿真时时间长,可以减小设计代码的计数次数,对分析移位功能没有影响。 设计

    2024年02月06日
    浏览(44)
  • 51单片机--定时器与按键控制流水灯模式

    51单片机上的定时器是一种硬件模块,用于计时和生成特定的时间延迟。 它的电路和运转都在单片机内完成 ,它是嵌入在单片机内部的一个功能模块,具有多种工作模式和功能。 在51单片机中,通常有两个定时器/计数器:定时器0(Timer 0)和定时器1(Timer 1)。每个定时器都

    2024年02月13日
    浏览(43)
  • 在51单片机中使用一个独立按键控制流水灯方向

    用独立按键控制流水灯转向,按下独立按键流水灯向右移动,再按下独立按键流水灯向左移动 此代码用到 逻辑左移:_crol_(移动对象,移动的位数) 逻辑右移:_cror_(移动对象,移动的位数)

    2024年02月07日
    浏览(40)
  • 51单片机入门 - 详解定时器实现按键控制流水灯方向

    操作系统:Windows 10 x84-64 单片机:STC89C52RC 编译器:SDCC 烧录软件:stcgal 1.6 开发板:普中51单片机开发板A2套件(2022) 在 VS Code 中新建项目到烧录的过程: 左侧EIDE图标 - 新建项目 - 空项目 - 8位MCU项目 - 保存文件夹。 更改构建配置: SDCC ;更改烧录配置: stcgal 。 在项目文件

    2024年02月06日
    浏览(47)
  • 【小作业】基于AT89C51的按键控制流水灯作业

    单片机与4个独立按键k1~k4及8个LED指示灯的一个独立式键盘。4个按键接在P1.0~P1.3引脚,P3口接8个LED指示灯,控制LED指示灯亮与灭。 按下k1键,P3口8个LED正向(由上至下,间隔1盏灯)流水点亮; 按下k2键,P3口8个LED反向(由下而上,间隔1盏灯)流水点亮; 按下k3键,P3口8个LE

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包