--- title: Derivation of State Graphs and Tables|第十三週 tags: 數位系統與實驗 --- # 如何畫出 Finte State Machine / FSM 老師說,有時候打造一個 FSM 是蠻靠直覺的,順著你對問題的理解,依照直覺寫出來,然後同時確認邏輯是正確的就對了。 當然課本有給一些建議: - 先畫出一些例子幫助自己理解題目要的條件 - 就很像寫題目的時候自己想一些測資那樣子 - 然後想一下甚麼狀態會回到 Initial State,然後也可以先定義怎樣是 Initial State - 如果很多情況都會讓輸出都是 1,那麼可以直接來構建 - 或者去想有什麼樣的情況是必須要被記錄的,這樣的話他就是一個 State - 當要建立一個箭頭的時候,要去想清楚到底是要接到已經建立的 State,還是要建立新的 State - 建立好後,要確認每次接到一個輸入,不會讓你走到兩種 State 以上,或是讓你無法移動到任何 State 包括自己 - 畢竟 FSM 就是你接到一個輸入,就一定會跳到下一個 State 但是老師還是建議照著自己的直覺與正確的邏輯,會比較容易打造。 ## 例子:010 和 1001 偵測器 假如我們現在要打造一個偵測器,在最近的 3 個 bit 他偵測到 010 的話就會輸出 1;或者在最近的 4 個 bit 他偵測到 1001 的話就會輸出 1。其他都是輸出 0。 下面的敘述請搭配著圖來看: ![](https://drive.google.com/uc?id=1bsq1zZ9XofF2wJjZex8M4ULsE1aEAEoA&export=download) - S~0~:初始狀態,或者說 Reset。 - S~1~:讀到了 0。由於 S~0~ 是 Reset,所以可以知道當前狀態是: - 0 - 而不是 10 或 100 - S~2~:讀到了 1。由於 S~1~ 是讀到 0,所以可以知道當前狀態是: - 01 - S~3~:讀到了 0。由於 S~2~ 是讀到 1,所以可以知道當前狀態是: - 10 - S~4~:讀到了 1。由於 S~0~ 是 Reset,所以可以知道當前狀態是: - 1 - 而不是 01,01 是 S~2~ - S~5~:從 S~3~ 之後讀到 0,所以可以知道當前狀態是: - 100 --- # Serial Data Transmission 在傳送數據的時候,除了要傳送的序列數據,我們還會連同 CLK 一起傳送,這樣接收方才知道要不要讀入該值;但是有時候我們不是直接傳 CLK 過去,而是某種程度包含在我要傳的資料「裡面」,所以我們會需要給他還原。 ![](https://drive.google.com/uc?id=1LCcoLvMGj6RJjVQZSWfrAyTe1ZxDKsrm&export=download) ## Coding schemes 下面介紹幾種常見的對資料編碼的方式,初始值都是 0: - NRZ:就是讀到的資料 D,沒有任何改變 - NRZI:如果讀到的 D 是 0,代表「不會改變」,但如果讀到的是 1,代表「要改變」 - 一開始讀到的 D 是 0,所以就不改變 0,然後讀到了 1,所以把 0 改變得到 1 - 然後又讀到 1,所以再把 1 改變得到 0 - RZ:就是把讀到的資料 D ,如果讀到 1 就拆成兩半,讀到 0 保持 0 - Manchester:把讀到的資料 D 都拆成兩半,讀到 1 拆成 10,讀到 0 拆成 01 ![](https://drive.google.com/uc?id=19kENF-seXGuRg-gZVKZd-vZPJ8XoRVty&export=download) ## Schemes Conversion ![](https://drive.google.com/uc?id=183hOYrMka5cVfrn2CIvmXqrUG8vFBPSZ&export=download) 假如我現在有一個 NRZ 的資料,我想要把他轉成 Manchester 編碼,下面用我們學到的兩種 FSM 實作: ## Mealy 由於從 NRZ 一次讀到的 1 個 bit,在 Manchester 中長度會變成兩倍,也就是等同讀到兩個 bit,所以可以看到我們的狀態圖長相非常簡單。 ![](https://drive.google.com/uc?id=1tz-t-Z_dqKH9zEF2ABv3KUQdM1uJIkcO&export=download) 例如 S~0~ 從 NRZ 讀到 一個 1,但是其實對 Manchester 來說是讀到 2 個 1,所以可以看到我們是先跳去 S~2~,輸出 1,然後又跳回來,輸出 0。 下面就是時序圖當中,第二行的 Manchester 是我們想要達成的目標,而底下的 Z 是我們藉由 Mealy 達成的樣子;可以看到樣子很像,不過多了一些 Glitches。 ![](https://drive.google.com/uc?id=1AUeqGuyTwIJVejONMy27RrLOf2pOvtRa&export=download) ## Moore 如果換成用 Moore 來實作的話樣子也差不多,然後也會因為 NRZ 的 1 個 bit 等同 Manchester 的 2 個 bit 的原因,可以看到 S~0~ 跟 S~3~ 之間和 S~1~ 跟 S~2~ 之間都有雙向箭頭。 ![](https://drive.google.com/uc?id=14ZhLWEdF5JzwfAJJCPPCfOZ9oAzhAIbY&export=download) 下面的時序圖也可以看到我們使用 Moore 打造出沒有 Glitch 的 Z;不過因為 Moore 完全只有在 CLK 變動時會更改值,這裡是 Falling 才會更改值,所以整體向右移動了一個 CLK。 ![](https://drive.google.com/uc?id=1XsnxAwxoxzMMVJSTyV8uhcTa6L3_Qoy8&export=download) --- # Alphanumeric State Graph 有時候狀態不一定要用 0 跟 1 來表示,我們可以用字母來表示想要輸出的值,例如: ![](https://drive.google.com/uc?id=1tDoYz7CU8MlOYzQAYaH8eYq2CcSPAH8j&export=download) 其中 F Forward 代表前進, R Reverse 代表後退。 但是用字母表示的時候,要小心少判斷情況,像上面的例子中,其實有可能 FR 同時為 1 或同時為 0,但是我的狀態圖並沒有說明這種時候要跳到哪裡,所以我們有了更完整的版本: ![](https://drive.google.com/uc?id=1SWRFVH6F0WomZaz80fRzBBECb1tdG28b&export=download) 像這樣把全部的判斷做好,比較正確。可以看到這裡有給予優先順序,要先看 F 是不是 1。 ## Completely Specified State Graph 如果上面的用字母表示的狀態圖,符合下面兩個情形,那麼我們就保證這個狀態圖每次都只有一條路可以走: - 把全部的路徑可能情況 OR 起來,並且結果得到 1 - 以上面的例子來說就是 F + F'R' + F'R - 這個可以很明顯的看出結果是 1 - 代表說我考慮了全部的狀態,任何 input 進來我都可以判斷 - 從任何一個狀態出去的路徑,任兩個的情況 AND 起來,並且結果得到 0 - 以 S~0~ 作為例子,可以知道有下面 3 種選擇: - $F'R'\bullet F$ - $F'R'\bullet F'R$ - $F'R\bullet F$ - 這些都是 0,代表我一次只有一條路可以走