生活随笔
收集整理的這篇文章主要介紹了
[转载].怎样在有限状态机中延时
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文地址?http://www.cnblogs.com/yuphone/archive/2010/05/12/1733867.html#
感謝亞鋒前輩的精彩文章.
本文借一小例,來示范在FSM中如何延時。
案例
(1)fsm_with_delay_demo.v
| 001 | module?fsm_with_delay_demo( |
| 002 | ??input??????CLOCK_50, |
| 008 | //++++++++++++++++++++++++++++++++++++++ |
| 011 | //++++++++++++++++++++++++++++++++++++++ |
| 012 | parameter?TIMER1_VAL = 50_000_000;??????// 50M/50M = 1s |
| 014 | reg????????timer1_enable; |
| 015 | reg?[25:0] timer1_cnt; |
| 016 | wire???????timer1_done; |
| 018 | always?@(posedge?CLOCK_50) |
| 021 | ??else?if?(~timer1_done) |
| 022 | ????timer1_cnt <= timer1_cnt +?1'b1; |
| 024 | assign?timer1_done = (timer1_cnt == TIMER1_VAL - 1); |
| 025 | //-------------------------------------- |
| 027 | //-------------------------------------- |
| 030 | //++++++++++++++++++++++++++++++++++++++ |
| 033 | //++++++++++++++++++++++++++++++++++++++ |
| 034 | parameter?TIMER2_VAL = 200_000_000;?????// 200M/50M = 4s |
| 036 | reg????????timer2_enable; |
| 037 | reg?[27:0] timer2_cnt; |
| 038 | wire???????timer2_done; |
| 040 | always?@(posedge?CLOCK_50) |
| 043 | ??else?if?(~timer2_done) |
| 044 | ????timer2_cnt <= timer2_cnt +?1'b1; |
| 046 | assign?timer2_done = (timer2_cnt == TIMER2_VAL - 1); |
| 047 | //-------------------------------------- |
| 049 | //-------------------------------------- |
| 052 | //++++++++++++++++++++++++++++++++++++++ |
| 054 | //++++++++++++++++++++++++++++++++++++++ |
| 059 | reg?[5:0] current_state, next_state;????// 現態、次態 |
| 061 | always?@ (posedge?CLOCK_50,?negedge?RST_N) |
| 062 | begin:fsm_always_block1 |
| 064 | ????current_state <= S1; |
| 066 | ????current_state <= next_state; |
| 071 | begin:fsm_always_block2 |
| 073 | ??LED?????????? =?1'b0; |
| 077 | ??timer1_enable =?1'b0; |
| 078 | ??timer2_enable =?1'b0; |
| 080 | ??case?(current_state) |
| 083 | ????????timer1_enable = 1;??????????????// 使能定時器1 |
| 089 | ????????if?(timer1_done?/* && 用戶條件 */) |
| 090 | ??????????next_state = S1; |
| 092 | ??????????next_state = S0; |
| 096 | ????????timer2_enable = 1;??????????????// 使能定時器1 |
| 102 | ????????if?(timer2_done?/* && 用戶條件 */) |
| 103 | ??????????next_state = S0; |
| 105 | ??????????next_state = S1; |
| 109 | //-------------------------------------- |
| 111 | //-------------------------------------- |
(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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的[转载].怎样在有限状态机中延时的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。