日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转载].怎样在有限状态机中延时

發布時間:2024/1/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载].怎样在有限状态机中延时 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址?http://www.cnblogs.com/yuphone/archive/2010/05/12/1733867.html#

感謝亞鋒前輩的精彩文章.

本文借一小例,來示范在FSM中如何延時。

案例

(1)fsm_with_delay_demo.v

001module?fsm_with_delay_demo(
002??input??????CLOCK_50,
003??input??????RST_N,
004???
005??output?reg?LED
006);
007?
008//++++++++++++++++++++++++++++++++++++++
009// 定時器1 開始
010// 時長:1秒
011//++++++++++++++++++++++++++++++++++++++
012parameter?TIMER1_VAL = 50_000_000;??????// 50M/50M = 1s
013?
014reg????????timer1_enable;
015reg?[25:0] timer1_cnt;
016wire???????timer1_done;
017?
018always?@(posedge?CLOCK_50)
019??if?(~timer1_enable)
020????timer1_cnt <= 0;
021??else?if?(~timer1_done)
022????timer1_cnt <= timer1_cnt +?1'b1;
023?????
024assign?timer1_done = (timer1_cnt == TIMER1_VAL - 1);
025//--------------------------------------
026// 定時器1 結束
027//--------------------------------------
028?
029?
030//++++++++++++++++++++++++++++++++++++++
031// 定時器2 開始
032// 時長:4秒
033//++++++++++++++++++++++++++++++++++++++
034parameter?TIMER2_VAL = 200_000_000;?????// 200M/50M = 4s
035?
036reg????????timer2_enable;
037reg?[27:0] timer2_cnt;
038wire???????timer2_done;
039?
040always?@(posedge?CLOCK_50)
041??if?(~timer2_enable)
042????timer2_cnt <= 0;
043??else?if?(~timer2_done)
044????timer2_cnt <= timer2_cnt +?1'b1;
045?????
046assign?timer2_done = (timer2_cnt == TIMER2_VAL - 1);
047//--------------------------------------
048// 定時器2 結束
049//--------------------------------------
050?
051?
052//++++++++++++++++++++++++++++++++++++++
053// 狀態機部分 開始
054//++++++++++++++++++++++++++++++++++++++
055parameter?S0 = 0;
056parameter?S1 = 1;
057?
058?
059reg?[5:0] current_state, next_state;????// 現態、次態
060?
061always?@ (posedge?CLOCK_50,?negedge?RST_N)
062begin:fsm_always_block1
063??if?(!RST_N)
064????current_state <= S1;
065??else
066????current_state <= next_state;
067end
068?
069// 根據條件轉移狀態,并給出相應邏輯
070always?@ *
071begin:fsm_always_block2
072??/* 用戶變量初始化? 開始*/
073??LED?????????? =?1'b0;
074??/* 用戶變量初始化? 結束*/
075???
076??/* 清定時器使能 開始 */
077??timer1_enable =?1'b0;
078??timer2_enable =?1'b0;
079??/* 清定時器使能 結束 */
080??case?(current_state)
081????S0 :
082??????begin
083????????timer1_enable = 1;??????????????// 使能定時器1
084?????????
085????????/* 用戶代碼? 開始*/
086????????LED =?1'b0;
087????????/* 用戶代碼? 結束*/
088?????????
089????????if?(timer1_done?/* && 用戶條件 */)
090??????????next_state = S1;
091????????else
092??????????next_state = S0;
093??????end
094????S1 :
095??????begin
096????????timer2_enable = 1;??????????????// 使能定時器1
097?????????
098????????/* 用戶代碼? 開始*/
099????????LED =?1'b1;
100????????/* 用戶代碼? 結束*/
101?????????
102????????if?(timer2_done?/* && 用戶條件 */)
103??????????next_state = S0;
104????????else
105??????????next_state = S1;
106??????end?
107??endcase
108end
109//--------------------------------------
110// 狀態機部分 結束
111//--------------------------------------
112?
113endmodule

(2)QII綜合的FSM

圖1 QII綜合的FSM

(3)實驗現象

該例中,FSM有兩個狀態,S0持續1s,S1持續4s,然后循環交替。

假設案例中的LED是送1亮,送0滅,那么LED滅1秒亮4秒,如此循環交替。

分析

眾所周知,FSM有三種寫法:1個always塊;兩個always塊;三個always塊。其中1個always塊的fsm,由于各種弊端,為大家所不齒。然而加入定時器這一動作在3個always塊又不能很好地實現,于是退而求其次,使用2個always塊的fsm。

這樣一來,我們只需在第一個always塊內實現現次態交替轉變即可。在第二個always塊內,根據狀態遷移,來寫各狀態的邏輯。由于定時器的加入,而其使能又是reg變量,所以在初始化時,必須將使能清零,以免無法實現定時效果。在各狀態中,如果只需持續一個clock,則無需使能定時器。倘若需要持續一段時間,使能定時器即可,然后等定時完畢,再轉移狀態;未定時完畢,則保持當前狀態。至于其他的用戶條件,可與定時完畢標志邏輯與在一起,以實現所需功能。

轉載于:https://www.cnblogs.com/whut-xxxy/archive/2011/05/21/2052652.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的[转载].怎样在有限状态机中延时的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。