# Verilog HDL 撰寫前置作業
Verilog HDL 為硬體描述語言,而不是程式語言,撰寫前應先畫出**架構圖**,再用此語言**描述電路行為**。
## Design Entry
當要展示個人想法,說明電路是如何設計時,介紹以下兩種方式。這裡以 Multiplexer(Mux) 元件為例。
>說明:以下圖中的 Mux 元件為例。
>* Sel signal 命名含義在於 select signal,因有 Sel signal 使此元件具有選擇的功用。
>* Mux 元件透過給予 Sel signal,決定 Y 值應為 A 或是 B。
>* Input signal 有 1 bit 的 A 與 B,還有 1 bit Sel signal (為了告訴元件需要選擇 A 還是 B)。
>* Output signal 則有 1 bit 的 Y。
>* 當 Sel = 1 時,Y = A。反之, Y = B。

### Schematic
利用邏輯閘表達電路架構,如下圖所示。

>說明:
>
>
>* And Gate: Input 皆為 1(True) 才輸出 1。
>* Or Gate: Input 只要有出現 1(True),就輸出 1。
>* Not Gate(Invertor): Output 為 Input 的反向,假設目前輸入 1(True),則會輸出 0(False)。
>
* Mux 元件的設計:
* 當 Sel 為 1 時, 會只輸出 A 的值。
* 因 Not Sel(1 反向為 0) 與 B 的 And Gate 只會輸出 0。
* 最後的 Or Gate 相當於 Y = (A or 0) = A 。
### Block Diagram
如同黑箱子般,只知道 input 與 output,沒有完全將細節畫出來。

Mux 有通用圖形表示,如下圖所示。

>說明:

>* 上圖為 Mux 元件通用圖形,圖中須表達:
>* Input signal
>* Output signal
>* Select signal,此 signal 代表是在何種 condition 下選擇 input signal。
## 系統架構圖
利用上述 Design Entry 的方式,依照讀者的設計想法,先畫出**系統架構圖**,再進行 Verilog 語言撰寫。
下列為範例說明,詳細內容課程中會再說明。
### I/O pin diagram
說明系統的 I/O port (包含 Signal name 與 Width)。

>說明:
>* 此圖只是範例,並不是固定格式。
>* Width 部分,若為 1 bit,則不畫斜線。
### System diagram
表達系統與外在系統如何溝通。

>說明:
>* 此圖只是範例,並不是固定格式。
>* Width 部分,若為 1 bit,則不畫斜線。
>* 此部分是以 host 想成 Testbench 角色,傳遞 Input signal 給系統,並接收 Output signal,以驗證系統的正確性。
### Finite State Machine(FSM) (此部分在課程後半部會介紹)
可用來表示系統在哪一個狀態,因什麼原因而跳到下一個狀態,也須表示 outputs 為何。
FSM 可分為 Mealy 與 Moore Machine,大部分可描述同樣的行為,兩種 Machine 的 output 皆與 state 有關,但因 Mealy Machine output 同時也與 input 有關(可即時作轉換),使得兩種 Machine 輸出結果會差一個 cycle (timing 差異),此部分可參考 [Circuits 範例](https://hackmd.io/s/H1lFtSgYg)。
在設計系統時,依照個人習慣選擇 FSM 的撰寫方式,另外,兩種 Machine 是可以混著使用,不是一定要切割說目前在使用何種 Machine。
#### Mealy Machine
input 與 state 決定 output 的值。

>說明:
>* 須表達剛開始預設的 state 為何,系統要從哪個 state 開始,也就是圖中的 start 線。
>* 每個 state 都應給予一個適當的名字。
>* state 轉換部分,固定格式為 **條件/輸出值**,另外,若是無條件進入下一個 state,則用 ' * ' 表示。
#### Moore Machine
output 的值只跟 state 有關。

>說明:
>* 須表達剛開始預設的 state 為何,系統要從哪個 state 開始,也就是圖中的 start 線。
>* 每個 state 都應給予一個適當的名字。
>* state 轉換部分,固定格式為 **條件**,另外,若是無條件進入下一個 state,則用 ' * ' 表示。
>* 因 output 只跟 state 有關,所以寫在 state 裡。
### Datapath (此部分在課程後半部會介紹)
此部分請直接閱讀 [Circuits 範例](https://hackmd.io/s/H1lFtSgYg) 。
## 總結
請撰寫 Verilog HDL 前,先對系統有全盤規劃,並依個人想法畫出來,此作法對於系統撰寫與 Debug 相當有幫助。
# [Home Page:hatched_chick: ](https://hackmd.io/s/BkYeCF5Og)