今天早上開工,將按鍵控制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...