28 / 37 · अवधारणा
अवस्था मशीन: अवस्था, संक्रमण और आउटपुट को अलग करना
विनिर्देश तालिका से FSM बनाएँ और Moore/Mealy आउटपुट, अवैध अवस्थाएँ तथा अनुरोध नीति की तुलना करें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
अवस्था केवल आवश्यक पिछली जानकारी का सार रखती है
जब केवल वर्तमान इनपुट से आउटपुट तय नहीं होता, तो संग्रहित की जाने वाली अवस्था परिभाषित करें। पूरा इनपुट इतिहास रखने के बजाय केवल वे अंतर रखें जो भविष्य का व्यवहार तय करने के लिए आवश्यक हैं।
काम शुरू करने और पूरा करने वाले controller को देखें। IDLE अनुरोध की प्रतीक्षा, BUSY कार्य जारी और DONE एक चक्र का पूर्णता संकेत है।
| वर्तमान अवस्था | शर्त | अगली अवस्था | busy | done |
|---|---|---|---|---|
| IDLE | start=0 | IDLE | 0 | 0 |
| IDLE | start=1 | BUSY | 0 | 0 |
| BUSY | work_done=0 | BUSY | 1 | 0 |
| BUSY | work_done=1 | DONE | 1 | 0 |
| DONE | हमेशा | IDLE | 0 | 1 |
busy और done वर्तमान अवस्था के आउटपुट हैं। उदाहरण के लिए BUSY में पूर्णता देखने वाले किनारे के बाद अवस्था DONE होती है और done=1 होता है। यह Moore आउटपुट की परिभाषा है।
हर स्तंभ एक उदयी किनारेउदयी किनारा (rising edge) क्लॉक के 0 से 1 होने का क्षण। यह CLK=1 के पूरे स्तर-अंतराल से अलग है। और पढ़ें का अवलोकन है। इनपुट किनारे से ठीक पहले के हैं; नाम में after वाली अवस्थाएँ अद्यतन के तुरंत बाद की हैं। स्तंभों का क्रम नमूनों का क्रम दिखाता है, भौतिक प्रसार विलंबप्रसार विलंब इनपुट बदलने के बाद आउटपुट सही मान पर स्थिर होने तक का समय। तार्किक समतुल्यता और समय-संबंधी गुण अलग हैं। और पढ़ें नहीं। शुरुआत IDLE से होती है। work_done स्वीकारने वाले किनारे के बाद अवस्था DONE और done=1 होता है। DONE के बाद start से स्वतंत्र IDLE आता है।
तरंगरूप डेटा देखें
| संकेत | तरंगरूप | बस मान |
|---|---|---|
| edge | 2345 | E0 → E1 → E2 → E3 |
| start | 10.1 | |
| work_done | 0.10 | |
| अवस्था बाद में | 2.34 | BUSY → DONE → IDLE |
| busy बाद में | 1.0. | |
| done बाद में | 0.10 |
संक्रमण और संग्रहण अलग रखने वाला RTL
typedef enum logic [1:0] {IDLE, BUSY, DONE} state_t;
state_t state, next_state;
always_comb begin
next_state = state;
case (state)
IDLE: if (start) next_state = BUSY;
BUSY: if (work_done) next_state = DONE;
DONE: next_state = IDLE;
default: next_state = IDLE;
endcase
end
always_ff @(posedge clk)
if (rst) state <= IDLE;
else state <= next_state;
assign busy = (state == BUSY);
assign done = (state == DONE);यह SystemVerilog उदाहरण नियंत्रण संरचना समझाता है। जुड़े हुए processing block का work_done निर्माण और इनपुट synchronization अलग लागू करने होंगे।
विनिर्देश में आसानी से छूटने वाले प्रश्न
ऊपर का परिपथ BUSY और DONE में start अनदेखा करता है। पूर्णता के साथ नया अनुरोध भी स्वीकारना हो, तो पहले संक्रमण तालिका बदलें। Mealy आउटपुट अवस्था और वर्तमान इनपुट दोनों का उपयोग करके जल्दी प्रतिक्रिया कर सकता है, लेकिन उसके संयोजन आउटपुट पथ की timing और glitch भी देखने होंगे। Binary या one-hotone-hot कई बिटों में ठीक एक 1 वाला निरूपण। सभी 0 की अनुमति वाली शर्त को अलग से one-hot-or-zero कहते हैं। और पढ़ें अवस्था encoding और Moore/Mealy वर्गीकरण अलग निर्णय हैं।
खुद आज़माएँ
DONE अवस्था में start=1 एक चक्र के लिए आता है। क्या ऊपर का FSM तुरंत नया काम शुरू करेगा? लगातार कार्य स्वीकारने के लिए क्या बदलना होगा?
व्याख्या पढ़ें
ऊपर की तालिका DONE→IDLE करती है, इसलिए अनुरोध स्वीकार नहीं होता। DONE में start होने पर BUSY जाना जोड़ें या अनुरोध संग्रहित करने वाला protocol बनाएँ। तब done की चौड़ाई और अनुरोध स्वीकारने का समय नए विनिर्देश के अनुसार जाँचें।