---
# System prepended metadata

title: Analysis of Clocked Sequential Circuits|第十二週
tags: [數位系統與實驗]

---

---
title: Analysis of Clocked Sequential Circuits|第十二週
tags: 數位系統與實驗
---

在前一個章節中我們是有一個想要達成的目標，然後設計出電路來；而這裡我們則是給一個電路，然後要分析他做了甚麼事情。

# Parity Checker

## Error detection & Parity bit

傳送資料的時候，可以用一個很簡單的方式達成資料的校驗，就是「奇偶校驗」。
而實現的方法，就是在資料的最尾端加上 1 個 bit 代表這串數據中「 1 的個數」有幾個，這個最尾端的 bit 就是[「同位位元 Parity bit」](https://zh.wikipedia.org/zh-tw/%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C%E4%BD%8D)。

![](https://drive.google.com/uc?id=1MPHFwKNQn4cQwT2yg2f-he94t4r54DWC&export=download)

你可以有兩種表達方式，如上圖：

- Even Parity：
    - 最尾端的 bit 會讓整體 1 的個數變成偶數
- Odd Parity：
    - 最尾端的 bit 會讓整體 1 的個數變成奇數

例如左邊第一個的 00000000，因為他已經是偶數了，所以 Parity bit 就是 0。

### 實際使用的可能方式如下

將接收到的資料全部 XOR 起來後，將得到的值跟最後一個 bit 做比較，如果一樣的話代表傳輸成功，不一樣的話就是傳輸失敗。
[參見 wiki](https://en.wikipedia.org/wiki/Parity_bit#Error_detection)

## 設計一個 Odd-Parity Checker

如果我們想要設計一個可以檢查 Odd-Parity 正確性的電路，例如下圖

![](https://drive.google.com/uc?id=1sfVy4XEYT5QGBgpuiId9gz2uQed2SKss&export=download)

我希望有個一個一個讀入 X，然後輸出的 Z 會告訴我們現在的 1 的個數是否是奇數個。

例如下面的時序圖(Falling Edge)：

![](https://drive.google.com/uc?id=13xhJ351z_maVhf-WSFipXu2FE53kPj7j&export=download)

## 狀態 State

那麼這時候，畫出狀態圖 State Graph 就是一個很好的辦法：

![](https://drive.google.com/uc?id=10vKFu1RTRnvem2xX1IBiR-8KjsKFss4r&export=download)

或者我們也可以畫出狀態表 State table；首先先畫出 State 的變化關係：

![](https://drive.google.com/uc?id=1EM8DXh6n6pEmgmh-g8DekB6kRs1gdGvV&export=download)

然後再把該 State 的值填入，在這裡就是 Z 值：

![](https://drive.google.com/uc?id=1cUf_6n4Kl6hk_ah01hkwLaQkuHHanFl8&export=download)

這時候觀察一下 Present Output，也就是「當前 State」的輸出，你會發現：

- 如果 X = 1，則 Q^+^ 跟 Present Output 是顛倒的
- 如果 X = 0，則 Q^+^ 跟 Present Output 是一樣的

這不就是 TFF 在做的事情嗎，於是我們就可以用 TFF 來達成我們的目的。

![](https://drive.google.com/uc?id=1Jzrj0dqKpLoh96tq4LiS-JhALkk5U4hp&export=download)

---

# Find the output sequence

接下來我們要學會如何分析有時序的序列電路 Analyze the Clocked Sequential Circuits，也就是畫出輸出值的序列。

下面也順便介紹計概提到的 Moore Machine 跟 Mealy Machine。

# Moore Machine 例子

:::info
Moore Machine：輸出只跟「當前狀態 Present State」有關
:::

首先我們有一個電路：

![](https://drive.google.com/uc?id=1BtRTWAqhO_1UqUJlkHw5CViZEFEJXQkS&export=download)

## 時序圖

開始分析的方法，我們先從時序圖下手：

上面假設一開始 ABX 都是 0，然後你可以根據各個 DFF 前面的邏輯閘將結果依序產生出來。
例如第一個 CLK，AB 都是 0，X 也是 0，所以我們可以知道

$$
A^{+} = D_{A} = B'\oplus X = 1\\
B^{+} = D_{B} = A+X=0\\
Z = A\oplus B = 1\\
$$

![](https://drive.google.com/uc?id=1VYphUcjU7Q-xBUc73cQcE_c5QEFz8wp4&export=download)

從過程可以發現，Z 的結果只跟 AB，也就是當前的 State 有關係，所以可以知道這是一個 Moore Machine

# Mealy Machine 例子

我們換一個更複雜的電路，這裡我們用 JK FF：

![](https://drive.google.com/uc?id=1AkjLnqaxutoNauhjwEnfyAyAWn4mF6vl&export=download)

而我們的 Z 長得像下面這樣

![](https://drive.google.com/uc?id=16-k72sabvXycuzPFWwHV8DzDH9EDkAKh&export=download)

$$
Z=XB'+XA+X'A'B
$$

## 時序圖

此時我們一樣來分析時序圖；在一開始，AB 都是 0，X 是 1，根據上面的邏輯，可以看到由上數來第 1 個 AND 閘輸出會是 1，所以 Z 是 1 沒有錯。

![](https://drive.google.com/uc?id=1DE69e4VjOcsQlbfxF539e78GoJdq6WJp&export=download)

首先看向第 1 個 Falling，首先根據 JK 的邏輯，可以知道 AB 在這個 CLK 之後會變成 1 跟 0；所以 X 是 1、A 是 0、B 是 1，根據上面的邏輯閘，Z 的輸出會是 0。

但是這時候，可以看到 X 之後又等於 0，我們這裡假設延遲沒有很高，所以這個時刻 X = 0，A = 0，B = 1，根據上面的邏輯，可以知道 Z 會等於 1。

### Glitches 或 Spikes

所以可以看到 Z 在那段時間有個小小的凹陷；在後面的第 3 個 CLK 也可以看到 Z 有個小小的突起，這些突然的改變叫做 Glitches 或 Spikes。

那麼這些東西好嗎？

## 在意的點

從 Mealy Machine 的時序圖可以看到可能會有一些小小的突然變化，但是呢，這些變化只會在 CLK Falling 後出現。

**所以我們 Mealy 在意的是 CLK 改變之前 Z 的狀態**

從上圖也可以知道，在 CLK 改變之前的 Z 值依序為 1 1 0 0 1，這也跟他的邏輯式子告訴我們的結論是一樣的。

雖然這個電路會有 Glitches 或 Spikes 的存在，但是不會影響我們電路想要的結果的正確性。

---

# Construct the State Table

現在換要如何建立狀態表格。

# Moore Machine 例子

這是跟剛剛一樣的電路：

![](https://drive.google.com/uc?id=1BtRTWAqhO_1UqUJlkHw5CViZEFEJXQkS&export=download)

## 寫出式子

找出表格的第一步，就是把他們的式子寫下來，並畫出卡諾圖：

$$
A^{+} = D_{A} = B'\oplus X = 1\\
B^{+} = D_{B} = A+X=0\\
Z = A\oplus B = 1\\
$$
![](https://drive.google.com/uc?id=1RBgOb9ca0EfcaF0KR9NW-wYTCAyUuObf&export=download)

然後就可以建立好狀態表格了。
例如第一列是 AB 都是 0，那麼就會對應到上面兩個卡諾圖的第一列。

![](https://drive.google.com/uc?id=1L4mbFWi8cSaqUor5_0vcHcb5gzMW1SdI&export=download)

## 建立狀態圖 State Graph

有了上面的狀態表格後，我們來定義狀態的名稱。下面給個定義的例子：

![](https://drive.google.com/uc?id=1gkWU4O_AjI_cTiSnJbRs_u5MhEAsgsDV&export=download)

我們給 AB = 00 定義為 S~0~，AB = 01 定義為 S~1~，以此類推。
這樣我們就得可以畫出我們的狀態圖了：

![](https://drive.google.com/uc?id=11nOMJPhuVAQChwrADS9X1KVnJhdKtX7r&export=download)

# Mealy Machine 例子

這是跟剛剛一樣的電路：

![](https://drive.google.com/uc?id=1AkjLnqaxutoNauhjwEnfyAyAWn4mF6vl&export=download)

而我們的 Z 長得像下面這樣

![](https://drive.google.com/uc?id=16-k72sabvXycuzPFWwHV8DzDH9EDkAKh&export=download)

## 寫出式子

所以一樣，先找出每個式子：

$$
J_{A} = XB\\
K_{A} = X\\
J_{B} = X\\
K_{B} = XA\\
A^{+} = J_{A}A' + K_{A}'A = XBA'+X'A\\
B^{+} = J_{B}B' + K_{B}'B = XB' + X'B + A'B\\
Z=XB'+XA+X'A'B\\
$$

然後一樣畫出卡諾圖；最後有了卡諾圖，一樣可以畫出狀態表格：

![](https://drive.google.com/uc?id=15LZMQU48U5DnCsQuO5r7Vk7XdBiIzPpx&export=download)

![](https://drive.google.com/uc?id=1DTmjVBMxSfc43Yji0m8NuHyaUnkBWZgv&export=download)

## 狀態圖

有了狀態表格後，剩下的就是自己定義狀態了：

![](https://drive.google.com/uc?id=1THGNNH0CS2y-ZLM4maS2zAD6VLtkyzDm&export=download)

然後就可以畫出下面的狀態圖：

![](https://drive.google.com/uc?id=1NCeWiXHZykDuDIQ3gybIXvwamOKPKbXo&export=download)

可以看到跟 Moore 的畫法不一樣的是，在狀態跟狀態之間的連線，表示法變成了「a/b」，其中 a 代表的是輸入的值，b 代表的是輸出的值。
而 moore 因為跟輸入沒有直接的關係，所以才只有一個值，代表輸出。

# Multiple Inputs and Outputs

如果覺得上面的還不過癮的話，下面有多變數的例子：

![](https://drive.google.com/uc?id=1Ur526I5fJBGIGSd9Z75_8JbpOBY3DVWz&export=download)

可以看到這是一個兩個輸入和兩個輸出的例子。


![](https://drive.google.com/uc?id=18uEufa3Z9l78y3KOkLdDZacfHX8RrBba&export=download)

---

# General Model

## Moore Machines

下面是普遍的模型樣子。可以看到輸出 Z 前面的 Combinational Subcircuit 的輸入就只有「當前的輸入 Q」。

![](https://drive.google.com/uc?id=1KNjRR53wDi7sOgm6JcyO6afvqTo2aEK_&export=download)

## Mealy Machines

下面是普遍的模型樣子。可以看到輸出 Z 的 Combinational Subcircuit 是跟輸入的 Combinational Subcircuit 在一起的，代表輸出除了跟「當前的狀態」有關係之外，也跟「當時的輸入」有關係。

![](https://drive.google.com/uc?id=1BEs_5qMInaXZ1vGPy5hVA_RuNkdkw4jA&export=download)

:::warning
小小結論：
可以發現，FF 的右手邊都是「當前的狀態 Current State」，而左邊 Combinational Subcircuit 產生的結果是「新的狀態 Next State」。
因此左邊的電路又叫做「Transitional Logic」或「Next State Logic」，而右邊的電路可以叫做「Output Logic」；
然後雖然 Mealy 的兩個看起來是合在一起的，但是其實你一樣可以把「Next State Logic」跟「Output Logic」分開來畫。
:::