FPGA Lab0

報告連結

FSM 說明

此個數計數器共有4種模式,分別計算不同區域內的座標點個數。而我們是以逐點座標計算的方式來實作,亦即從座標(1,1)~(8,8)逐點計算與圓心的距離,並同時計算半徑平方。經過距離比對後,決定計數器是否加一,大致流程如下:

  1. 從tb取圓心、半徑的資料。
  2. 從座標(1,1)~(8,8)逐點計算與圓心距離(不同模式下,計算距離的數量不同,詳見狀態說明)。
  3. 距離符合該模式下之區塊,則計數器加一,否則計數器不變。接著回到第2步驟,計算下一座標點。
  4. 座標點(8,8)計算完成,輸出計數器結果。
  • FSM diagram:

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

  • 狀態說明:

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下需要判斷兩個圓,則需要

642=128cycle;若是需要判斷3個圓則需要
643=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對應的圓心座標,則可控制此模塊的距離計算。
    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →