# 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。 ![](https://i.imgur.com/B572iVF.png =300x) ### Schematic 利用邏輯閘表達電路架構,如下圖所示。 ![](https://i.imgur.com/DNjbs3i.png) >說明: >![](https://i.imgur.com/3rL6oEW.png =300x) > >* 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,沒有完全將細節畫出來。 ![](https://i.imgur.com/thVe45i.png) Mux 有通用圖形表示,如下圖所示。 ![](https://i.imgur.com/B572iVF.png =300x) >說明: ![](https://i.imgur.com/qTV7X61.png) >* 上圖為 Mux 元件通用圖形,圖中須表達: >* Input signal >* Output signal >* Select signal,此 signal 代表是在何種 condition 下選擇 input signal。 ## 系統架構圖 利用上述 Design Entry 的方式,依照讀者的設計想法,先畫出**系統架構圖**,再進行 Verilog 語言撰寫。 下列為範例說明,詳細內容課程中會再說明。 ### I/O pin diagram 說明系統的 I/O port (包含 Signal name 與 Width)。 ![](https://i.imgur.com/NAYkih6.png) >說明: >* 此圖只是範例,並不是固定格式。 >* Width 部分,若為 1 bit,則不畫斜線。 ### System diagram 表達系統與外在系統如何溝通。 ![](https://i.imgur.com/tSmlSpM.png) >說明: >* 此圖只是範例,並不是固定格式。 >* 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 的值。 ![](https://i.imgur.com/5zzhkq9.png =400x) >說明: >* 須表達剛開始預設的 state 為何,系統要從哪個 state 開始,也就是圖中的 start 線。 >* 每個 state 都應給予一個適當的名字。 >* state 轉換部分,固定格式為 **條件/輸出值**,另外,若是無條件進入下一個 state,則用 ' * ' 表示。 #### Moore Machine output 的值只跟 state 有關。 ![](https://i.imgur.com/jPDioG3.png =400x) >說明: >* 須表達剛開始預設的 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)