新聞中心

        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 按鍵消抖

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大关县| 中牟县| 香格里拉县| 上栗县| 威海市| 万载县| 九龙城区| 扶沟县| 松潘县| 军事| 锦州市| 万载县| 巴东县| 合水县| 龙胜| 嘉义县| 贡觉县| 当雄县| 永善县| 资溪县| 汽车| 保山市| 商水县| 托克托县| 丰宁| 德庆县| 藁城市| 沙湾县| 新龙县| 衡水市| 莎车县| 芜湖市| 绵竹市| 奈曼旗| 西乌珠穆沁旗| 邢台县| 东宁县| 洞头县| 社旗县| 凭祥市| 灵山县|