# 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,合成電路會有怎樣不好的影響。