---
# System prepended metadata

title: 新訓FPGA
tags: [新生訓練, FPGA]

---

[TOC]

# 數位邏輯電路基礎知識

## 重要性
- 數位電路使用離散的電壓水平（例如高電壓和低電壓）來表示數據。這種二進制表示法（0和1）不容易受到噪聲和干擾的影響，因此具有更高的穩定性和可靠性。
- 可編程、可集成性等等其他優勢，可上網自己查

## 處理器與FPGA
- [微處理器基礎](https://hackmd.io/6Rj1vNC5S2ya2y2MNScFbg)
- [MCU 與 FPGA](https://hackmd.io/@metal35x/BJamZmpVL)
    - 亦可見 <手把手教你DSP> - "什麼是DSP" 章節
    - 在MCU(CPU)晶片中，固定好的電路形成的是可操控的算術邏輯單元(ALU)，直接實現運算
    - FPGA晶片中，內部電路形成的是可操控(重新連接輸入與輸出)的邏輯閘，實際上電路沒有變，但形式上開發者每次開發出的功能電路都是不同的邏輯閘編排，如同新電路一樣。
    - 以實現加法來說，CPU像是有一個module可以直接做加法，開發者只能用不能改，FPGA則需要使用者自行刻出一個加法器module，加法器具體如何由電路實現完全可以讓開發者自由發揮。

## 數位電路

### 組合邏輯電路（Combinatorial logic)
- 組合邏輯電路的輸出僅取決於當前的輸入信號，沒有記憶或存儲能力
- 也就是純由一堆邏輯閘形成的電路，一般的加法器、比較器都是。

### 時序邏輯電路（Sequential logic)
- 時序邏輯電路的輸出不僅取決於當前的輸入信號，還取決於先前的輸入狀態，也就是說它具有記憶能力，見 [flip-flop](#latch-與-flip-flop)
- 通常包含了時鐘信號，電路的輸出狀態可能會根據時間的推移而變化
- ![image](https://hackmd.io/_uploads/r170LMxoA.png)

## [同步與異步電路](https://medium.com/@joe82512/soc%E8%A8%AD%E8%A8%88%E6%96%B9%E6%B3%95%E8%88%87%E5%AF%A6%E7%8F%BE-2dd997a364d6)
- 依時鐘源是否相同做區分
- 通常使用同步電路做設計，設計簡單、可靠，現代數位系統多使用同步電路。
- <font color="red">請記得同步電路這張圖</font>
    - ![image](https://hackmd.io/_uploads/SkFO0zgoR.png =80%x)

## 同步與異步訊號
- 取決於訊號變為有效狀態時，是否受時鐘clk的[限制](https://blog.csdn.net/XPhp95/article/details/108455056)
    - 同步與異步復位(reset)
        - 異步:復位訊號一產生，系統就立即復位
        - 同步:復位訊號一產生，須等下一個時鐘延(clk edge)出現，系統才復位。

## 有限狀態機(Finite State Machine, FSM)概念
- 狀態機教學我只推[天璇](https://youtu.be/1iHzcralz1E)
- 狀態機概念也可用在程式設計中，簡化複雜的邏輯判斷
- [verilog實現](##實現狀態機)
- 

## 其他你應該要知道(先確定這些都知道)

### 類比與數位

### 布林運算與邏輯閘

### 進位制

### 負數與補數

### latch 與 flip-flop

### 時序圖
- 首先看到反向器的時序圖
    - ![image](https://hackmd.io/_uploads/Sy1rQQxiA.png =60%x)
    - 上圖為理想，下圖為現實情況，會產生一個propagation delay，一般時序圖不會特別畫出來
- 考慮JK flip-flop的時序圖
    - 一般長這樣
        - ![image](https://hackmd.io/_uploads/rkNZr7goC.png =70%x)
    - **Q** : 在clk上升瞬間J、Q有變動但都畫在同一條線上，怎麼從JK flip-flop得真值表看出做動原因?
    - **A** : 可以在心裡把圖看成實際有延遲的樣子，就會看出輸出Q的變動與輸入J和時鐘上升當下的Q有關，也就是我們熟知的JK flip-flop運作方式喔
        - 把輸出Q往後移一點
        - ![image](https://hackmd.io/_uploads/HJl6NXejR.png =80%x)




# Verilog

## 語法與使用
- 一開始不認識語法可以同時搭配這兩個一起看
    - [verilog HDL教學講義](https://hom-wang.gitbooks.io/verilog-hdl/content/index.html)，作為筆記用，忘記可翻一翻
    - [教學](https://youtube.com/playlist?list=PLuhWBQnV46Q-3oMz33PFSqjhJOvDDVUbJ&si=vjxkgB_RJiQg2Hdy)
- 確定以下問題都清楚，能說得出來嗎
    - module的概念
    - 變數什麼時候用wire，什麼時候用reg，為什麼
    - assign、=、<=使用時機，代表什麼意思，blocking、nonblocking是什麼
    - always@()，括弧內的變量有什麼功用，always是幹嘛的
    - 以上語法代表的概念，你能夠在同步電路示意圖中指出是哪個部份嗎![image](https://hackmd.io/_uploads/SkFO0zgoR.png =80%x)
    
## 實現狀態機
- 見[範例](https://www.runoob.com/w3cnote/verilog-fsm.html)或sample code

## testbench撰寫
- [介紹與寫法](https://hackmd.io/@dppa1008/testbench#Testbench-%E4%BB%8B%E7%B4%B9)
- [`timescale用法](https://blog.csdn.net/super_haifeng/article/details/50110371)

# Quartus與ModelSim
Quartus主要用於燒錄用，ModelSim模擬看波型，可以有兩種做法:
1. 只使用Quartus建立專案，在Quartus(或其他編輯器軟體)打好主要的.v檔與testbench，然後從Quartus開啟ModelSim模擬，OK後進燒錄步驟
2. 一開始在ModelSim建立專案，在ModelSim(或其他編輯器軟體)打好主要的.v檔與testbench並進行模擬，都OK後將檔案加入至Quartus，進燒錄步驟

- ModelSim 教學見PPT
- Quartus 教學見PPT


# 實作

## 板子
- 使用DE0-CV Board，Cyclone V 5CEBA4F23C7N Device
- 請至FTP下載manual

## 流程
1. 思考你的module有哪些輸入輸出
2. 畫出你的狀態機
3. 依狀態機打程式
4. 寫testbench
5. 模擬
6. 燒錄
7. 
## hint
- 思考一下按鈕事件該如何判斷
- 狀態機的設計全憑開發者，一個系統的狀態機可以不只一個，兩個狀態機可能交互影響對方

# 新訓項目
- [demo](https://youtube.com/playlist?list=PLMZMEiIur5WdNAFBSu73WYQ_LzzhDAegV&si=BdSivlERDIgNvZ9g)
    
## 項目1 -- 學號顯示
- 功能描述 : 
    - 每按一次按鈕就使7段顯示器依序顯示學號，按reset鍵則都不顯示

## 項目2 -- 青蛙跳
- 至少完成ver1
- ver1 功能描述 : 
    - 在10顆LED燈上以燈亮作為青蛙在該位置，兩隻青蛙各用一顆按鈕控制。
    - 按reset後，兩隻青蛙在最左邊與最右邊(表示最左邊與最右邊的LED燈亮起)
    - 按下控制左邊青蛙的按鈕，左邊青蛙往右跳1格，按下控制右邊青蛙的按鈕，右邊青蛙往左跳1格。
    - 當兩隻青蛙相遇時(兩顆LED相鄰)，青蛙跳要跳過對方。
    - 當青蛙到達邊緣時，例如，左邊青蛙到達最右邊，再繼續跳的話要回到最左邊。

- ver2 功能描述 :
    - 兩隻青蛙可以往左跳也可以往右跳
    - 多新增2顆按鈕，一隻青蛙對應兩顆按鈕，控制青蛙往左跳或往右跳
    - 其他同ver1

## 新訓項目3 -- QEP
- QEP(Quadrature Encoder Pulse)介紹
    - 專指DSP中事件管理器內的一個模組電路，該電路功能為對引腳輸入的正交編碼脈衝信號進行譯碼和計數
    - 一般用於旋轉編碼器，以獲得其位置和速率信息
    - [編碼器與正交編碼脈衝信號](https://youtu.be/Y5HBvbbmW_g)
    - 思考一下如何從AB相波形判斷應該加1或減1
- 功能描述 : 
    - 使用7段顯示器顯示編碼器計數，需能增加也能減少
    - 以下情況擇一自我挑戰
        - 1(基礎). 
            - 3個7段顯示器，從0上數直至7段顯示器最高顯示數值(999)，回歸到0，從0下數會跳至7段顯示器最高顯示數值(999)再繼續往下數
        - 2(進階). 
            - 4個7段顯示器，最左邊的用於顯示正或負，從0下數後顯示負值，從0上數至最高顯示數值(999)後跳至最低顯示數值(-999)
    
        
            









