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

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

3天内不再提示

SDRAM控制器设计之按键的处理

友晶FPGA 来源:友晶FPGA 2025-03-19 11:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

按键边沿检测

边沿检测经常用于按键输入检测电路中,按键按下时输入信号 key 变为低电平,按键抬起变为高电平。当输入的信号为理想的高低电平时(不考虑毛刺和抖动),边沿检测就发挥了很重要的作用。

由于输入的信号为一个连续值,我们需要通过时钟进行采样。根据采样定理,采样时钟的频率需要至少为被采信号频率的 2 倍。

设计的边沿检测电路的功能为:检测到 1 个下降沿或上升沿时,对应的下降沿输出信号 edge_pos、edge_neg 分别输出 1 个脉冲(即一个时钟周期的高电平)。下面以下降沿进行分析。

分析:在边沿检测的过程中,通过 1 个寄存器来寄存上一个时钟沿的输入值 D ,当寄存器输出 Q 与输入 D 的值分别为1、0时,证明检测到下降沿。

92e78796-039a-11f0-9310-92fbcf53809c.png

如上图所示,在第 2 个时钟周期的低电平期间,D 由高变低,在第 3 个时钟周期的上升沿,Q由高变低。在 D 由高变低的时刻,Q 为 1 ,D 为 0 ,证明检测到下降沿。

按键边沿捕获模块:

92fbae42-039a-11f0-9310-92fbcf53809c.png

测试验证模块:

930c92d4-039a-11f0-9310-92fbcf53809c.png

按一次按键,对应的LED灯就会亮。LED亮代表检测到了下降沿。

Signaltap 波形图:

931cc1b8-039a-11f0-9310-92fbcf53809c.png

按键硬件消抖电路

友晶科技很多板子的按键(都是按下为低电平)其实是已经有硬件消抖电路的, 这样的板子的按键的值 直接input 进来后 直接用就可以。

比如DE2-115 DE1-SOC DE10-Standard 等等。这里都用74HC245芯片来消抖:

93512aa2-039a-11f0-9310-92fbcf53809c.png

9366a328-039a-11f0-9310-92fbcf53809c.png

按键Verilog消抖电路

如果没有硬件上的消抖,我们可以手写Verilog代码替代消抖电路。

模板一

模板一的Verilog消抖的原理主要为按键按下或松开后延时 1ms—20ms 采样(这个时间是根据按键的机械特性自行决定)。

假设时钟是50M,按键消抖的思路是检测到按下时延时 50000个时钟周期,再检测,如果状态仍为按下,则确认是按下的;如果状态为弹起的,则确认是干扰,无按键按下。

按键消抖的Verilog实现的模板一如下:

module key_debounce        //按键消抖模块
(  input clk,          //系统时钟
  input rst_n,        //系统复位
  input key[0],          //按键输入
  output reg key_value,  //有效的按键值
);


  reg [31:0]cnt;//计数器
  reg value;//中间寄存器


  always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
      cnt <= 0;                //初始状态下寄存器清零
            key_value <= 0;        //有效按键值清零        
            value <= 0;                //中间寄存器清零            
        end    
        else begin
            if(cnt == 50000) begin
                cnt <= 0;//每隔0.001秒检测一次 将key的值寄存到value寄存器当中(如果系统时钟是50MHz)
                value <= key[0];
                    
                if(value == 1 && key[0] == 0) //按键按下为0,平时为1
                    key_value <= 1;


            end                        
            else begin
                cnt <= cnt + 1;
                key_value <= 0;
            end
        end    
    end                
endmodule

模板二

模板二的检测原理是只有按键按下的状态持续50000个周期(这个时间可以自己再定义)以上,才认定是按键被按下了一次,否则算作是干扰被忽略掉。

模板二实现的是多个按键的去抖。

按键消抖的Verilog实现的模板二如下:

module debounce (
 clk,
 reset_n,
 data_in,
 data_out
);


 parameter WIDTH = 32;      // set to be the width of the bus being debounced
 parameter POLARITY = "HIGH";  // set to be "HIGH" for active high debounce or "LOW" for active low debounce
 parameter TIMEOUT = 50000;   // number of input clock cycles the input signal needs to be in the active state
 parameter TIMEOUT_WIDTH = 16;  // set to be ceil(log2(TIMEOUT))
 
 input wire clk;
 input wire reset_n;
 
 input wire [WIDTH-1:0] data_in;
 output wire [WIDTH-1:0] data_out;
 
 reg [TIMEOUT_WIDTH-1:0] counter [0:WIDTH-1];
 wire counter_reset [0:WIDTH-1];
 wire counter_enable [0:WIDTH-1];
 
 // need one counter per input to debounce
 genvar i;
 generate for (i = 0; i < WIDTH; i = i+1)
  begin:  debounce_counter_loop
    always @ (posedge clk or negedge reset_n)
    begin
      if (reset_n == 0)
      begin
        counter[i] <= 0;
      end
      else
      begin
        if (counter_reset[i] == 1)  // resetting the counter needs to win
        begin
          counter[i] <= 0;
        end
        else if (counter_enable[i] == 1)
        begin
          counter[i] <= counter[i] + 1'b1;
        end
      end
    end
 
    if (POLARITY == "HIGH")
    begin
      assign counter_reset[i] = (data_in[i] == 0);
      assign counter_enable[i] = (data_in[i] == 1) & (counter[i] < TIMEOUT);
      assign data_out[i] = (counter[i] == TIMEOUT) ? 1'b1 : 1'b0;
    end
    else
    begin
      assign counter_reset[i] = (data_in[i] == 1);
      assign counter_enable[i] = (data_in[i] == 0) & (counter[i] < TIMEOUT);
      assign data_out[i] = (counter[i] == TIMEOUT) ? 1'b0 : 1'b1;    
    end
    
  end  
  endgenerate
  
endmodule

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

    关注

    31

    文章

    5589

    浏览量

    129069
  • Verilog
    +关注

    关注

    30

    文章

    1370

    浏览量

    114144
  • 边沿检测
    +关注

    关注

    0

    文章

    6

    浏览量

    7932
  • 消抖电路
    +关注

    关注

    0

    文章

    7

    浏览量

    8706
  • 按键消抖
    +关注

    关注

    2

    文章

    28

    浏览量

    10797

原文标题:09-SDRAM控制器的设计——按键的处理(边沿捕获电路、硬件消抖、Verilog消抖电路)

文章出处:【微信号:友晶FPGA,微信公众号:友晶FPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SDRAM控制器的设计——Sdram_Control.v代码解析(异步FIFO读写模块、读写SDRAM过程)

    前言 SDRAM控制器里面包含5个主要的模块,分别是PLL模块,异步FIFO 写模块,异步FIFO读模块,SDRAM接口控制模块,SDRAM
    的头像 发表于 03-04 10:49 2185次阅读
    <b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>的设计——<b class='flag-5'>Sdram</b>_Control.v代码解析(异步FIFO读写模块、读写<b class='flag-5'>SDRAM</b>过程)

    FPGASDRAM控制器设计(二)精选资料分享

    FPGASDRAM控制器设计(二):刷新这次要来解决上次留下来的刷新问题,在100us后首先要经过两次刷新才进行模式寄存设置。这颗SDRAM
    发表于 07-30 07:48

    使用Verilog实现基于FPGA的SDRAM控制器

    摘 要:介绍了SDRAM的特点和工作原理,提出了一种基于FPGA的SDRAM控制器的设计方法,使用该方法实现的控制器可非常方便地对SDRAM
    发表于 06-20 13:04 2443次阅读

    PDMA在测试SDRAM控制器中的应用

    我们设计了一个PDMA(Programmable Direct Mem o ry Access)用于测试SDRAM控制器的性能。在SoC中,SDRAM控制器往往跟多个IP模块(图形
    发表于 07-02 18:31 2027次阅读
    PDMA在测试<b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>中的应用

    SDRAM控制器简易化设计

    SDRAM存储芯片拥有快速读写的性能,可以应用以回波模拟系统作为数据高速缓存SDRAM芯片是由SDRAM控制器
    发表于 10-24 15:08 0次下载
    <b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>简易化设计

    基于EPM1240的SDRAM控制器的设计

    通过设计基于CPLD 的SDRAM 控制器接口,可以在STM系列、ARM系列、STC系列等单片机和DSP等微处理器的外部连接SDRAM,增加系统的存储空间。
    发表于 02-16 17:06 45次下载
    基于EPM1240的<b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>的设计

    DDR SDRAM控制器参考设计VHDL代码

    Xilinx FPGA工程例子源码:DDR SDRAM控制器参考设计VHDL代码
    发表于 06-07 11:44 19次下载

    基于VHDL的SDRAM控制器的实现

    基于VHDL的SDRAM控制器的实现
    发表于 01-22 13:43 12次下载

    EPM1240的SDRAM控制器的设计

    EPM1240的SDRAM控制器的设计
    发表于 10-31 08:24 21次下载
    EPM1240的<b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>的设计

    SDRAM控制器的设计

    逻辑复杂,接口方式与普通的存储差异很大。为了解决这个矛盾,需要设计专用的SDRAM控制器,使用户像使用SRAM -样方便的使用SDRAM。考虑到
    发表于 11-28 19:51 5次下载
    <b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>的设计

    FPGA读写SDRAM的实例和SDRAM的相关文章及一些SDRAM控制器设计论文

    本文档的主要内容详细介绍的是FPGA读写SDRAM的实例和SDRAM的相关文章及一些SDRAM控制器设计论文主要包括了:FPGA读写SDRAM
    发表于 12-25 08:00 57次下载
    FPGA读写<b class='flag-5'>SDRAM</b>的实例和<b class='flag-5'>SDRAM</b>的相关文章及一些<b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>设计论文

    如何使用FPGA设计SDRAM控制器

    针对SDRAM 操作繁琐的问题,在对SDRAM 存储和全页突发式操作进行研究的基础上,提出一种简易SDRAM 控制器的设计方法。该设计方法
    发表于 12-18 16:13 6次下载
    如何使用FPGA设计<b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>

    DDR SDRAM控制器的设计与实现

    本文首先分析了DDR SDRAM的基本特征,并提出了相应的解决方案详细介绍了基于J EDEC DDR SDRAM规范的DDR SDRAM控制器设计方案。该
    发表于 03-28 10:57 23次下载

    基于SDRAM控制器软核的Verilog设计

    SDRAM控制逻辑复杂,使用很不方便。 为了解决这个矛盾,需要设计专用的SDRAM控制器,使系统用户象使用SRAM一样方便的使用SDRAM
    的头像 发表于 06-30 09:16 3358次阅读
    基于<b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>软核的Verilog设计

    PIC32系列参考手册DDR SDRAM控制器

    电子发烧友网站提供《PIC32系列参考手册DDR SDRAM控制器.pdf》资料免费下载
    发表于 09-25 11:39 0次下载
    PIC32系列参考手册<b class='flag-5'>之</b>DDR <b class='flag-5'>SDRAM</b><b class='flag-5'>控制器</b>