0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA零基础学习之Vivado-按键使用教程

FPGA技术江湖 来源:FPGA技术江湖 2023-04-28 14:01 次阅读

大侠好,欢迎来到FPGA技术江湖。本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子信息通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。

系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,按键的使用教程。话不多说,上货。

按键的使用教程

作者:李西锐校对:陆辉

按键是我们使用比较多的器件之一,其结构简单,使用方便。在玩具、家电等方面有广泛的应用。

按键是一种应用比较多的一种电子开关,在我们开发板上有两种按键开关:第一种是本章节需要讲解的轻触开关,第二种是自锁按键,按键按下后保持自锁状态,整个按键处于一直连通状态,再次按下,开关断开,同时开关按钮弹出。

本次我们实验任务,将使用按键控制LED灯点亮,当按键按下时,LED灯亮,松开熄灭。

我们的按键是共阴极设计,电路图如下:

9ee6e1d2-e582-11ed-ab56-dac502259ad0.png

分析电路可知,当我们的按键没有按下时,FPGA管脚为高电平,按键按下,FPGA管脚被短路,电平为低电平。所以我们的按键按下为低松开为高。那么在我们设计实验逻辑时,可以用按键的低电平控制LED灯点亮。

9efc9b9e-e582-11ed-ab56-dac502259ad0.png

对应的XDC约束语句如下:

9f06a300-e582-11ed-ab56-dac502259ad0.png

我们按键信号作为控制信号来使用,但是我们不能直接去使用,因为轻触按键在按下或者松开时,信号非常不稳定,会导致在按键没有完全按下或者松开时,信号出现很多的毛刺,这样的信号不能作为我们的控制信号,所以我们在写控制逻辑之前,我们首先需要对按键做一下消抖处理,实现信号稳定。我们处理的原理是,当信号一直处于低电平或者高电平一段时间后,我们默认信号处于稳定状态,这个时间我们暂定为10ms。

接下来我们先进行新建工程,首先点击create project。

9f151f98-e582-11ed-ab56-dac502259ad0.png

然后在打开的界面修改工程名字为key_led。

9f2d2be2-e582-11ed-ab56-dac502259ad0.png

保存位置确定后,点击next。

9f3ddeec-e582-11ed-ab56-dac502259ad0.png

我们选择RTL Project,点击next。

9f47f3aa-e582-11ed-ab56-dac502259ad0.png

我们在搜索窗口搜索我们板子的芯片型号,确定好之后点击next。

9f57c852-e582-11ed-ab56-dac502259ad0.png

点击Finish完成新建工程。新建完成之后,我们开始根据前面我们所讲的理论开始写代码。

9f649b72-e582-11ed-ab56-dac502259ad0.png

点击上图红色方框的加号开始新建代码文件。

9f71bd52-e582-11ed-ab56-dac502259ad0.png

点击next。选择创建文件。

9f7fcac8-e582-11ed-ab56-dac502259ad0.png

比如我们新建顶层文件,名字为key_led。

9f8e1344-e582-11ed-ab56-dac502259ad0.png

点击OK之后开始写代码,代码内容如下:

01  module jitter(
02      
03      input   wire        clk,
04      input   wire        rst_n,
05      input   wire        key,
06      
07      output  reg         flag
08  );
09
10      parameter t = 500_000;
11      
12      reg         [18:0]          cnt;
13      reg                         state;
14
15      always @ (posedge clk, negedge rst_n)
16      begin
17          if(rst_n == 1'b0)
18              begin
19                  cnt <= 19'd0;
20                  state <= 1'd0;
21                  flag <= 1'd1;
22              end
23          else
24              case(state)
25                  1'd0    :   begin
26                                  if(key == 1'b0)
27                                      begin
28                                          if(cnt == t - 1)
29                                              begin
30                                                  cnt <= 19'd0;
31                                                  state <= 1'd1;
32                                                  flag <= 1'b0;
33                                              end
34                                          else
35                                              begin
36                                                  cnt <= cnt + 1'b1;
37                                                  state <= 1'd0;
38                                                  flag <= 1'b1;
39                                              end
40                                      end
41                                  else
42                                      begin
43                                          cnt <= 19'd0;
44                                          state <= 1'd0;
45                                          flag <= 1'b1;
46                                      end
47                              end
48                  1'd1    :   begin
49                                  if(key == 1'b1)
50                                      begin
51                                          if(cnt == t - 1)
52                                              begin
53                                                  cnt <= 19'd0;
54                                                  state <= 1'd0;
55                                                  flag <= 1'b1;
56                                              end
57                                          else
58                                              begin
59                                                  cnt <= cnt + 1'b1;
60                                                  state <= 1'b1;
61                                                  flag <= 1'b0;
62                                              end
63                                      end
64                                  else
65                                      begin
66                                          cnt <= 19'd0;
67                                          state <= 1'b1;
68                                          flag <= 1'b0;
69                                      end
70                              end
71              endcase
72      end 
73  endmodule
74

接下来是按键控制LED的逻辑,当按键为低电平时,LED灯点亮。代码如下:

01  module key_ctrl(
02      
03      input   wire            clk,
04      input   wire            rst_n,
05      input   wire            flag,
06      
07      output  reg             led
08  );
09
10      always @ (posedge clk, negedge rst_n)
11      begin
12          if(rst_n == 1'b0)
13              led <= 1'b0;
14          else if(flag == 1'b0)
15              led <= 1'b1;
16          else
17              led <= 1'b0;
18      end
19  endmodule

两个模块做好之后,我们在顶层文件中例化子模块:

01  module key_led(
02      
03      input   wire            clk,
04      input   wire            rst_n,
05      input   wire            key,
06      
07      output  wire            led
08  );
09      
10      wire            flag;
11      
12      jitter jitter_inst(
13      
14      .clk                (clk),
15      .rst_n              (rst_n),
16      .key                (key),
17      
18      .flag               (flag)
19  );
20
21      key_ctrl key_ctrl_inst(
22      
23      .clk                (clk),
24      .rst_n              (rst_n),
25      .flag               (flag),
26      
27      .led                (led)
28  );
29      
30  endmodule

逻辑控制写好之后,我们做一下仿真,在仿真中,我们为了快速看到现象,我们将参数修改的小一些。代码如下:

01  `timescale 1ns / 1ps
02
03  module key_led_tb;
04
05      reg             clk;
06      reg             rst_n;
07      reg             key;
08      
09      wire            led;
10      
11      defparam key_led_inst.jitter_inst.t = 100;
12      
13      initial begin
14          clk = 0;
15          rst_n = 0;
16          key = 1;
17          #105;
18          rst_n = 1;
19          #1000;
20          
21          //模拟按键按下时的抖动
22          key = 0;
23          #20;
24          key = 1;
25          #30;
26          key = 0;
27          #30;
28          key = 1;
29          #10;
30          key = 0;
31          
32          #5000;
33          
34          //模拟按键松开时的抖动
35          key = 1;
36          #30;
37          key = 0;
38          #30;
39          key = 1;
40          #10;
41          key = 0;
42          #50;
43          key = 1;
44          
45          #1000;
46          $stop;
47      end
48      
49      always #10 clk = ~clk;
50      
51      key_led key_led_inst(
52      
53      .clk            (clk    ),
54      .rst_n          (rst_n  ),
55      .key            (key    ),
56
57      .led            (led    )
58  );
59
60  endmodule

仿真波形:

9f993bb6-e582-11ed-ab56-dac502259ad0.png

Flag信号等效按键,flag拉低时,LED灯为高电平,此时灯亮。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1627

    文章

    21685

    浏览量

    602322
  • led
    led
    +关注

    关注

    242

    文章

    23174

    浏览量

    658802
  • 电路图
    +关注

    关注

    10331

    文章

    10719

    浏览量

    528757
  • 按键
    +关注

    关注

    4

    文章

    223

    浏览量

    57580
  • Vivado
    +关注

    关注

    19

    文章

    808

    浏览量

    66369

原文标题:FPGA零基础学习之Vivado-按键使用教程

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【ZYNQ Ultrascale+ MPSOC FPGA教程】第九章Vivado按键实验

    按键FPGA设计当中最常用也是最简单的外设,本章通过按键检测实验,检测开发板的按键功能是否正常,并了解硬件描述语言和FPGA的具体关系,
    的头像 发表于 01-22 09:46 2388次阅读
    【ZYNQ Ultrascale+ MPSOC <b class='flag-5'>FPGA</b>教程】第九章<b class='flag-5'>Vivado</b>下<b class='flag-5'>按键</b>实验

    零基础入门FPGA,如何学习?精选资料分享

    问:本人零基础,想学FPGA,求有经验的人说说,我应该从哪入手,应该看什么教程,应该用什么学习板和开发板,看什么书等,希望有经验的好心人能够给我一些引导。如果想速成,那就上网看视频吧,这...
    发表于 07-20 07:28

    FPGA零基学习Vivado-LED流水灯实验

    及打算进阶提升的职业开发者都可以有系统性学习的机会。系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,本篇为FPGA零基
    发表于 04-18 21:12

    FPGA零基学习Vivado-数码管驱动设计实验

    不多说,上货。FPGA零基学习Vivado-数码管驱动设计实验数码管作为SANXIN-B04的显示装置,具有易控制,显示方便的特点。那么
    发表于 04-19 19:21

    FPGA零基学习Vivado-按键使用教程

    及打算进阶提升的职业开发者都可以有系统性学习的机会。 系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,按键的使用教程。话不多
    发表于 06-13 18:33

    FPGA零基学习Vivado-锁相环使用教程

    大侠好,欢迎来到FPGA技术江湖。本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白
    发表于 06-14 18:09

    零基学习LEBVIEW】06 IO接口

    零基学习LEBVIEW】06 IO接口,感兴趣的朋友一定要学习
    发表于 12-31 10:28 0次下载

    零基学习LEBVIEW】08 智能仪器

    零基学习LEBVIEW】08 智能仪器,感兴趣的朋友一定要学习
    发表于 12-31 10:28 0次下载

    FPGA零基础入门教程

    本文档的主要内容详细介绍的是FPGA零基础入门教程免费下载。
    发表于 01-18 16:47 58次下载
    <b class='flag-5'>FPGA</b>的<b class='flag-5'>零基</b>础入门教程

    【ZYNQ Ultrascale+ MPSOC FPGA教程】第九章Vivado按键实验

    按键FPGA设计当中最常用也是最简单的外设,本章通过按键检测实验,检测开发板的按键功能是否正常,并了解硬件描述语言和FPGA的具体关系,
    发表于 01-25 08:27 5次下载
    【ZYNQ Ultrascale+ MPSOC <b class='flag-5'>FPGA</b>教程】第九章<b class='flag-5'>Vivado</b>下<b class='flag-5'>按键</b>实验

    【四】零基础上手HAL库—GPIO按键

    【四】零基础上手HAL库—GPIO按键3.1前言我们在上一节已经知道了点灯操作,相当于是学会了GPIO输出的配置,接下来是GPIO输入完成按键扫描的操作。前期准备STM32各类型的板
    发表于 12-05 13:51 0次下载
    【四】<b class='flag-5'>零基</b>础上手HAL库<b class='flag-5'>之</b>—GPIO<b class='flag-5'>按键</b>

    FPGA零基学习Vivado-数码管驱动设计实验

    系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,本篇为数码管驱动设计实验。话不多说,上货。
    的头像 发表于 04-09 09:20 1836次阅读

    FPGA零基学习Vivado-锁相环使用教程

    PLL锁相环由以下几部分组成:前置分频计数器、相位频率检测器电路、电荷泵、环路滤波器、压控振荡器、反馈乘法器计数器和后置分频计数器。在工作室,相位频率检测器检测其参考频率和反馈信号之间的相位差和频率差,控制电荷泵和环路滤波器将相位差转换为控制电压
    的头像 发表于 05-31 17:42 2319次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>零基</b>础<b class='flag-5'>学习</b><b class='flag-5'>之</b><b class='flag-5'>Vivado-</b>锁相环使用教程

    FPGA零基学习Vivado-ROM使用教程

    系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,ROM使用教程。话不多说,上货。
    的头像 发表于 06-07 12:27 1219次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>零基</b>础<b class='flag-5'>学习</b><b class='flag-5'>之</b><b class='flag-5'>Vivado</b>-ROM使用教程

    【教程分享】 FPGA零基学习按键控制LED

    系统性学习的机会。 系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。后续会陆续更新 Xilinx 的 Vivado、ISE 及相关操作软件的开发的相关内容,学习
    的头像 发表于 06-13 08:05 1596次阅读