---
# System prepended metadata

title: 2017 IC Design Contest Preliminary(數位電路設計)-Distance Transform

---

# 2017 IC Design Contest Preliminary(數位電路設計)-Distance Transform
## FSM
---- 整體流程是先從sti_ROM中將資料讀至res_RAM中，因為res_RAM是pixel-address，所以在進行後續的FORWARD和BACKWARD進行鄰居比對時，資料的讀取會較為直觀且方便計算。將sti_ROM的資料載入至res_RAM後開始跑FORWARD運算，如果當前pixel為0就繼續讀取res_RAM，如果當前pixel為1就進行鄰居比對，比對完後將結果寫入res_addr指向的位置。直到res_addr等於16254時，代表FORWARD運算已到盡頭，因為題目有註明圖片外圈不會有物件像素，因此只須掃描到16254這個pixel即可。反之，接續在FORWARD之後的為BACKWARD運算，同理FORWARD，res_addr從16254逐一遞減至第129個pixel即代表BACKWARD運算結束，電路運算終止。
![](https://i.imgur.com/UZMWLlk.png)
|state|說明|
|-----|---|
|READ_STI|1. 從sti_ROM中讀取測資，資料在sti_ROM中為16-pix-address方式存放，因此一次讀取16個pixel。</br>2. 讀取完後下個cycle直接進入WRITE_STI進行寫入res_RAM動作。 |
|WRITE_STI| 1. 在這個階段的初始，counter會從15開始遞減直到為0，並將sti_di[counter]寫入res_RAM中。</br>2. counter等於0時進入WRITE_STI_DONE。|
|WRITE_STI_DONE|1. 這一階段是為了延遲一個cycle，以便讓sti[0]可以正確寫入res_RAM。</br>2. 當res_addr到了16383，進入READ_F_CUR，如果還沒就繼續READ_STI。|
|READ_F_CUR|1. 此階段是FORWARD運算在讀取current pixel的狀態，從res_RAM[0]開始。</br>2.如果current pixel為0，並且res_addr還沒到16254時，讀取下一個pixel。</br>3. 如果current pixel為0，且res_addr為16254時，代表FORWARD運算結束，進入BACKWARD運算模式。</br>4. 如果current pixel為1，進入READ_F_NEI讀取鄰居。|
|READ_F_NEI|1. 顧名思義，依序讀取W，NW，N，NE。</br>2. 當counter為4時，跳至COMPARE_DONE_F，否則繼續讀取鄰居。|
|COMPARE_DONE_F|此狀態是為了讓最後一個鄰居NE的值可以被比大小的單元正確吃到所創立。|
|WRITE_F_RES|1. 將比大小單元最後吐出的值寫入res_RAM。</br>2. 如果res_add已經到16254時，跳至READ_B_CUR進行BACKWARD運算。|
|READ_B_CUR|參照READ_F_CUR，只是從res_RAM[16254]倒退至res_RAM[129]。|
|READ_B_NEI|1. 依序讀取自己，E，SE，S和SW。</br>2. 因為需要與自己比大小，所以當counter為5時才會跳至COMPARE_DONE_F，否則繼續讀取鄰居。|
|COMPARE_DONE_B|此狀態是為了讓最後一個鄰居SW的值可以被比大小的單元正確吃到所創立。|
|WRITE_B_RES|1. 將比大小單元最後吐出的值寫入res_RAM。</br>2. 如果res_add已經到129時，跳至DONE，否則跳回READ_B_CUR。|
|DONE|電路運算結束，done訊號發出，回到IDLE。|

### 小記
在posedge clk的always block中吃next state，電路結果會對，但對合成不好。
### Future work
研究在always @(posedge clk)中吃next state，合成電路會有怎樣不好的影響。
