按键防抖动电路编码器的VHDL实现(有限状态机设计方法总结)

您所在的位置:网站首页 防抖动开关电路 按键防抖动电路编码器的VHDL实现(有限状态机设计方法总结)

按键防抖动电路编码器的VHDL实现(有限状态机设计方法总结)

2023-12-23 06:07| 来源: 网络整理| 查看: 265

        本文首先通过一个具体的问题入手,然后对有限状态机的设计进行分析和总结。 一、题目说明

        下图是键盘编码和防抖动控制电路,一般采用扫描和轮询的方法来检测对键盘的敲击,这样可以减少键盘与主电路之间的连线数量。该电路每次将outp0、outp1、outp2中的一个置‘0’,然后读入inp1、inp2、inp3、inp4,而其他行输入inp仍保持为1。

设计的电路需要完成:

①编码功能:每个数字必须被编为ASCII码。编码电路通过将new_data置为‘1’,表示电路检测到一次键盘敲击并输出有效编码。这种做法可以避免长期按下一个键而出现一长串相同的数字。

②防抖动电路:机械开关存在开关抖动问题,即开关在形成最终稳定接触之前的不稳定状态,其持续时间一般有几个ms。因此,时钟的频率非常重要,选择一个时钟频率使得5ms内至少进行3次读取操作,只有在5ms内的读数相同时,才会认为该键被触发。

二、题目分析

分析题目可知,我们需要设计的电路应满足以下特征:

1)功能:实现按键防抖动电路编码器,可以将状态分为轮询状态一(ROLL_POLING_1)、轮询状态二(ROLL_POLING_2)、轮询状态三(ROLL_POLING_3)、触发状态(TRIGGER)、输出状态(OUTPUT)。

2)端口:输入时钟CLK、复位信号RST、四位宽按键输入INP,三位宽轮询输出OUTP、按键有效输出信号NEW_DATA、七位宽按键编码信号DATA。

3)触发方式:时钟上升沿触发,RST异步且高电平有效。

4)时序解释说明:

        1>触发电路复位后,默认进入轮询状态一(ROLL_POLING_1)。

        2>时钟上升时若处于轮询状态一、轮询状态二或轮询状态三(ROLL_POLING_1、ROLL_POLING_2、ROLL_POLING_3),分别输出对应的OUTP。如果INP符合按键触发则进入触发状态(TRIGGER),如果INP不符合按键触发则进入对应的下一轮询状态。

        3>时钟上升时若处于触发状态(TRIGGER),判断INP是否为按键触发,若是,则计数累加,若否,则计数清零,且进入轮询状态一(ROLL_POLING_1)。当计数为3时,进入输出状态(OUTPUT)。

        4>时钟上升时若处于输出状态(OUTPUT),进入轮询状态一(ROLL_POLING_1)。

        5>无论何时,若为输出状态(OUTPUT)则NEW_DATA置‘1’,同时输出编码后的DATA。

状态转移图如下:  

三、实现与总结

        对于这个问题可以使用有限状态机来描述,一般情况下,我们可以选择使用三进程来描述有限状态机,这样的结构清晰,可读性很高。但是对于本问题来说,这种方法并不适用。

        首先,先介绍一下描述有限状态机的三种方法,即单进程描述、双进程描述和三进程描述。

        根据功能来分,有限状态机由三部分结构组成,分别是由输入信号和现态决定的次态逻辑、由时钟、次态和复位信号控制的状态寄存器、由现态(或输入)决定的输出逻辑。

        大家平时见到的有限状态机通常被分为两部分,即组合逻辑部分和时序逻辑部分。这两者都是对有限状态机的描述,一般来说,次态逻辑和输出逻辑就是组合逻辑电路,状态寄存就是时序逻辑电路。

        对于三进程描述,次态逻辑、状态寄存器、输出逻辑各自分别由一个进程块来描述,因此称之为三进程描述。对于双进程描述,将次态逻辑、状态寄存器合并为一个进程块(状态转移块)来描述,因此称之为双进程描述。对于单进程描述,将三部分合并为一个块来描述,这种方法很少见,只有当问题简单时才会使用,当问题复杂时,单进程描述的代码可读性大大下降。

        通过上面的描述,我们需要明确双进程和三进程的区别。

三进程描述:次态逻辑和输出逻辑都是组合逻辑,他们不需要时钟和复位信号,他们的进程敏感触发列表是现态和输入。举个例子,在某个现态下,输入突然改变,此时次态逻辑块会被触发,根据新的输入改变次态,然后等到下个时钟沿,现态才发生变化。这会存在状态转移的延迟。这当然是必要的,这可以使得状态的转移是时钟同步的。

以下是三进程描述的代码模板:

---------------三进程描述----------------- ----------------STATE_REG---------------- PROCESS(CLK,RST)BEGIN --根据时钟和复位,决定现态的转移(时序逻辑) CASE RST IS WHEN '1'=> PR_STATE IF CLK'EVENT AND CLK='1'THEN --时钟上升沿时,将次态赋给现态,完成状态的转移 PR_STATENULL; END CASE; END PROCESS; --------------NX_STATE_LOGIC------------- PROCESS(PR_STATE,INPUT)BEGIN --根据现态和输入,决定次态(组合逻辑) CASE PR_STATE IS WHEN INITIAL=> IF INPUT='1'THEN NX_STATE COUNT:=1; CASE INP IS WHEN "0111"=> STATE


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3