---
# System prepended metadata

title: 2016 IC Design Contest Preliminary(數位電路設計)-Local Binary Patterns

---

# 2016 IC Design Contest Preliminary(數位電路設計)-Local Binary Patterns
## 總覽
題目有註明圖片最外圈不進行LBP計算，並且在lbp_mem中依照圖片擺放的位置來看，影像最外圈的值必須填入0。因此在reset結束後，狀態機進入WRITE_MEM階段，直接開始將0寫入lbp_mem，直到當寫入地址lbp_addr為128時，下一個cycle須進入READ_MEM階段讀取gray_mem，開始比對3x3方格中的八個鄰居並進行計算，當比對完成後再次進入WRITE_MEM將結果寫入lbp_mem，直到lbp_addr等於16383時運算結束。
## 狀態圖
![](https://i.imgur.com/7CPZT5Y.png)
## 思考核心
必須先建立清楚甚麼時間點要進入WRITE_MEM，甚麼時間點要進入READ_MEM的觀念。在這之前需先將讀取以及寫入記憶體的protocal建立好，我的設計是在**next state時就必須先將讀取/寫入記憶體的致能訊號以及地址和資料都先決定好**，並在current state時即時給記憶體，有了這個protocal之後再進行狀態轉換之間的條件判斷。

## 狀態間的跳轉判斷
**WRITEMEM至READ_MEM**: 跳轉條件的判斷就是在判斷next state的走向，所以要從WRITE_MEM跳轉至READ_MEM的條件很直觀，就是當row介於在1和126之間並且col在0和125之間，因為只有當lbp_addr在這個區間中，next state才會進入到紅色的框框中。
**READ_MEM至WRITE_MEM**: 當比較運算結果得到後即進入至WRITE_MEM階段寫入記憶體。
![](https://i.imgur.com/Lgj3kq5.jpg)
## 寫入記憶體資料的決定
依照題目敘述，圖片外圍都不用讀取gray_mem，直接寫入0即可，所以需要讀取記憶體的pixel都坐落在紅色框框中。WRITE_MEM有分成兩部分，一部份是寫入資料為0，另一部分是寫入資料為READ_MEM時的比較結果，那lbp_data在何時須為0，何時須為READ_MEM的運算結果呢?
理論上lbp_data是在next state為WRITE_MEM所決定的，但因為當current state的col為126時，next state是WRITE_MEM且須寫入0，所以在col為126時的資料寫入比對後的資料的下一個cycle，lbp_data須為0，如波型圖中的黃色實線所示，因此在這裡我的寫法是考量current state為WRITE_MEM時，並且lbp_addr為126時，lbp_data為0。其餘的lbp_data都是依照next state去判斷的。
![](https://i.imgur.com/BcFi3aa.png)