---
# System prepended metadata

title: FPGA Lab0

---

# FPGA Lab0

## 報告連結

## FSM 說明
此個數計數器共有4種模式，分別計算不同區域內的座標點個數。而我們是以**逐點座標計算**的方式來實作，亦即從座標(1,1)~(8,8)逐點計算與圓心的距離，並同時計算半徑平方。經過距離比對後，決定計數器是否加一，大致流程如下:
1. 從tb取圓心、半徑的資料。
2. 從座標(1,1)~(8,8)逐點計算與圓心距離(不同模式下，計算距離的數量不同，詳見狀態說明)。
3. 距離符合該模式下之區塊，則計數器加一，否則計數器不變。接著回到第2步驟，計算下一座標點。
4. 座標點(8,8)計算完成，輸出計數器結果。

- <font size=5>FSM diagram:</font>
![](https://i.imgur.com/OJduT8R.png =500x400)


- <font size=5>狀態說明: </font>

|state|說明|
|-----|---|
|IDLE|閒置狀態。當接收到輸入en訊號時，接收並**儲存**圓心、半徑資料開始工作。|
|BUSY|逐點計算，從座標(1,1)~(8,8)計算與圓心之間的距離，並與半徑比對。比對符合該模式條件，則計數器加一。|
|LAST|與BUSY功能相同，但此狀態為最後座標點(8,8)與圓心之距離計算結果。|
|OUTPUT|輸出計數器累計結果到RAM中。|

`BUSY`狀態中計算座標點(1,1)~(8,8)之距離，共64點。但該狀態不是固定64個cycle完成。隨著mode不同所需的cycle數也不同。若是該mode下需要判斷兩個圓，則需要$64*2 = 128cycle$；若是需要判斷3個圓則需要$64*3 = 192cycle$。這與時間換面積的方式有關，詳見問題討論。

## 模擬結果
波行解釋
拉拉拉


## 問題討論
- **如何節省面積?**
在mode=4時，需要一次計算座標與3個圓心的距離，而一次的距離計算則需要2個4-bit乘法器，3個圓的就需要6個乘法器。再加上半徑平方的計算，則總共需要6 + 3 = 9個乘法器，這會需要非常大的面積。
我用時間換面積，如下圖timing所示，原先需要在同一clk cycle產生的3個distance，我使用3個cycle依序計算3個distance，第4個cycel則可以開始比較3個distance與半徑之大小。此外，會有pipline的概念加入，第4個cycle乘法器閒置，則開始計算下一個座標的distance 1。
block diagram解釋在乘法器的輸入端依序給3個Circle對應的圓心座標，則可控制此模塊的距離計算。
![](https://i.imgur.com/q3fQC5o.png)