基於FPGA的按鍵控制LED的迴圈左移一位

2021-07-23 07:25:44 字數 3090 閱讀 3232

今天早上開工,將按鍵控制led的迴圈左移一位,這一功能實現了一把,這是乙個基礎功能,我想要的最終實現方式是:狀態機fsm;

高階版本是:狀態機通過按鍵控制其條件的轉變,實現多個功能的輪流展示

1)按鍵消抖有幾種方法呢?

兩種2)哪兩種呢?

硬體方法 + 軟體方法;

3)軟體方法如何實現呢?

避過按鍵的抖動時間

4)按鍵的抖動期是多長?

5ms~~10ms(網路給出的,其實也差不多了,10ms的抖動期,一般課題,都可以正確實現)

說到消抖,微控制器裡已經給出了方法,也就是:如果監測到按鍵按下(按鍵出現低電平),跳過10ms的抖動期,然後再檢測,是否仍然為低電平,如果是,那就是真的按下了;

那麼fpga呢,是不是也是這種方法?

也可以這樣做的,沒有問題的,但是使用fpga延時,需要注意的是:當按鍵按下後,會不會多次操作某一功能;這是關鍵,切記;

我推薦的是另一種方法;計數停止法。

核心思想:

如果監測到按鍵按下(按鍵出現低電平),那麼就開始計數,如果計數到10ms時,仍然為0,則確定為:按鍵按下,計數停止

如果監測到按鍵未按下,或者,按鍵鬆開,計數值清零,然後一直計數,知道計滿10ms為止。

在此簡略,稍後附上

迴圈左移是乙個簡單地 實驗,新增了按鍵消抖,在簡單裡加點料。

我現在還沒有嘗試使用狀態機,寫出描述語句,我的打算是:等所有課題或者專案的語句,描述了清楚後再用狀態機;

簡單鑄就雄偉

我先將目前學習過的知識進行乙個彙總,然後再逐個提公升,簡單心思,如此而已;

什麼都想做,什麼都想一步到位,那是牛人幹的事情,作為乙個普通人士,我選擇逐層提公升;

不要瞧不上,led燈迴圈左移之類的,舉3個例子:串列埠db9,使用序列資料傳輸;spi,使用序列資料傳輸;iic,使用序列資料傳輸,資料需要移動,左移和右移是不是就用上 了。

大專案也是是由諸多的小專案彙總而成,小專案都還沒用搞定,大專案也只能望海興嘆.。

就寫這麼多的,沒法口吐蓮花,簡單的東西都能講出花,就此擱筆,與諸君分享。

//***********************************===//

//==fosc : 50mhz

//==timescale : 1ns/1ns

//==file name : huxideng.v

//==date : 2016-09-28

//==author : cy

//==function : 每按鍵一次,乙個led燈迴圈亮滅

//==description:

// 當沒有按鍵 按下時,flag—_10ms=1'b0;

// 當有 按鍵 按下時,flag_10ms=1'b1;

// //***********************************===//

module key_new(

input wire sclk,

input wire rst_n,

input wire key_in,

output reg key_value

); //*************************=//

parameter t_10ms=19'd499_999;

//*************************=//

reg [18:0] cnt_10ms;

reg flag_10ms;

//**********cnt_10ms**********//

always@(posedge sclk or negedge rst_n)

if(!rst_n)

cnt_10ms <=19'd0;

else if(key_in==1'b1) //沒有這一句,意味著是可以累積計數的,如此會出現,即使遇到1就停止計數,一旦監測到0就會累加計數;

cnt_10ms <=19'd0; //我們實際需要的是:key_in=1時,清零,遇到0時就累積加,所以,必須要新增此句

else if(cnt_10ms==t_10ms) //為的是cnt_10ms>t_10ms,如此就不會執行 cnt_10ms <=cnt_10ms+1'b1;

cnt_10ms <=19'd500_000;

// else if(key_in==1'b0) //

else if(key_in==1'b0&&cnt_10ms<=t_10ms) //目的 是:計數t_10ms+1'b1之後,就不加1

cnt_10ms <=cnt_10ms+1'b1;

//**********flag_10ms*****===//

always@(posedge sclk or negedge rst_n)

if(!rst_n)

flag_10ms <=1'b0; //因為key_value要取反,所以光有flag_10ms=0是不行的,還需要key_in==1'b0;按下了才有效果

else if(cnt_10ms==t_10ms-1'b1)

flag_10ms <=1'b1;

else

flag_10ms <=1'b0;

//***************===//

always@(posedge sclk or negedge rst_n)

if(!rst_n)

key_value <=1'b0; //我看到是led上電就亮,我還就奇怪了,不可能的啊!後來看看電路圖,

// else if(flag_10ms==1'b1) //原來led是高電平亮,我的初始化key_value<=1'b1;

else if(flag_10ms==1'b1&&key_in==1'b0)//所以不管怎麼修改電路,都是led開機就亮,修正為0時,就可以 了

key_value <=~key_value;

// key_value<=1'b0;

// else

// key_value <=1'b1;

endmodule

按鍵控制led

本教程來至yingcloud.com 使用arduino的i o 口的輸入功能即為讀取外接裝置的輸出值,我們用乙個按鍵和乙個led 小燈完成乙個輸入輸出結合使用的實驗,讓大家能簡單了解i o 的作用。按鍵開關1個 led燈乙個 220 10k 電阻各乙個 麵包板 跳線若干 arduino板 分析上圖...

基於FPGA的按鍵控制4盞LED燈迴圈左移點亮

一 背景介紹 本篇文章是對昨天程式的乙個再使用,關於led的迴圈移動,我有話說,其他的就沒什麼要說的了。迴圈左移有兩種方法 乙個是 左移運算子 還有一種是 verilog描述語言特有的拼接符號 我個人推薦 拼接符號,簡約,快捷,清晰明朗。二 程式 fosc 50mhz timescale 1ns 1...

中斷 按鍵控制LED燈

xjp的資源 初始化函式 init.c 進行一些初始化 include s3c24xx.h led1,led2,led4對應gpf4 gpf5 gpf6 define gpf4 out 1 define gpf5 out 1 define gpf6 out 1 define gpf4 msk 3 d...