新聞中心

        EEPW首頁 > 嵌入式系統 > 牛人業話 > 【從零開始走進FPGA】非同于MCU的獨立按鍵消抖動

        【從零開始走進FPGA】非同于MCU的獨立按鍵消抖動

        作者: 時間:2015-03-02 來源:網絡 收藏
        編者按: 進入電子,無處不用到按鍵, FPGA中的按鍵消抖動更是非同一般,并針對不同情況有相應的對策。

          3. 中的

        本文引用地址:http://www.104case.com/article/270304.htm

          對于中的消抖動,很多教科書上都沒有講述。但Bingo覺得這個很有必要。對于信號穩定性以及準確性分析,按鍵信號必須有一個穩定的脈沖,不然對系統穩定性有很大的干擾。

          此處Bingo用兩種方法對動分析。其中第一種是通過狀態機的使用直接移植以上的代碼,這個思想在FPGA狀態機中很重要。第二種,通過循環n次計數的方法來確認是否真的被按下,這種方法很實用在FPGA這種高速并行器件中。

          (1)利用狀態機移植

          此模塊由Bingo無數次修改測試最后成型的代碼,在功能上可適配n個按鍵,在思想上利用單片機采用了單片機消抖動的思想。具體代碼實現過程請有需要的自行分析,本模塊移植方便,Verilog代碼如下所示:

          /*************************************************

          * Module Name : key_scan_jitter.v

          * Engineer : Crazy Bingo

          * Target Device : EP2C8Q208C8

          * Tool versions : Quartus II 11.0

          * Create Date : 2011-6-26

          * Revision : v1.0

          * Description :

          **************************************************/

          module key_scan_jitter

          #(

          parameter KEY_WIDTH = 2

          )

          (

          input clk,

          input rst_n,

          input [KEY_WIDTH-1:0] key_data,

          output key_flag,

          output reg [KEY_WIDTH-1:0] key_value

          );

          reg [19:0] cnt; //delay_5ms(249999)

          reg [2:0] state;

          //-----------------------------------

          always @(posedge clk or negedge rst_n)

          begin

          if(!rst_n)

          cnt <= 20'd0;

          else

          begin

          cnt <= cnt + 1'b1;

          if(cnt == 20'd249999)

          cnt <= 20'd0;

          end

          end

          //-----------------------------------

          reg key_flag_r;

          reg [KEY_WIDTH-1:0] key_data_r;

          always@(posedge clk or negedge rst_n)

          begin

          if(!rst_n)

          begin

          key_flag_r <= 1'b0;

          key_value <= {KEY_WIDTH{1'b0}};

          end

          else if(cnt == 20'd249999) //Delay_5ms

          begin

          case(state)

          0:

          begin

          if(key_data != {KEY_WIDTH{1'b1}})

          state <= 1;

          else

          state <= 0;

          end

          1:

          begin

          if(key_data != {KEY_WIDTH{1'b1}})

          state <= 2;

          else

          state <= 0;

          end

          2:

          begin

          key_flag_r <= 1'b1;

          key_value <= key_data; //lock the key_value

          state <= 3;

          end

          3:

          begin

          key_flag_r <= 1'b0; //read the key_value

          if(key_data == {KEY_WIDTH{1'b1}})

          state <= 4;

          else

          state <= 3;

          end

          4:

          begin

          if(key_data == {KEY_WIDTH{1'b1}})

          state <= 0;

          else

          state <= 4;

          end

          endcase

          end

          end

          //---------------------------------------

          //Capture the falling endge of the key_flag

          reg key_flag_r0,key_flag_r1;

          always@(posedge clk or negedge rst_n)

          begin

          if(!rst_n)

          begin

          key_flag_r0 <= 0;

          key_flag_r1 <= 0;

          end

          else

          begin

          key_flag_r0 <= key_flag_r;

          key_flag_r1 <= key_flag_r0;

          end

          end

          assign key_flag = key_flag_r1 & ~key_flag_r0;

          endmodule

          信號線說明如下:

          clk

          系統最高時鐘

          rst_n

          系統復位信號

          Key_data

          按鍵信號(可根據需要配置為n位)

          Key_flag

          按鍵確認信號

          Key_vaule

          按鍵返回值

          雷同上述按鍵消抖動的狀態,此模塊可以模擬成一下5個狀態,見state machine:


        wps_clip_image-28120

        fpga相關文章:fpga是什么




        關鍵詞: FPGA MCU 按鍵消抖

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 龙州县| 涿州市| 民县| 新巴尔虎右旗| 车险| 瓦房店市| 恩施市| 会理县| 临沧市| 阿拉尔市| 山阳县| 三穗县| 南乐县| 柏乡县| 和政县| 肥城市| 永安市| 佛坪县| 长垣县| 巍山| 襄城县| 富川| 杨浦区| 开阳县| 时尚| 仙桃市| 绥宁县| 凌源市| 渝中区| 洪洞县| 寻乌县| 兴安县| 仁怀市| 秭归县| 石渠县| 聂荣县| 广汉市| 建瓯市| 宁乡县| 鄂托克旗| 合阳县|