# 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)