# Lab5 Image Processing Filters Lab5 設計主要目的在於讓同學練習影像相關處理,藉由 testbench 提供的 mode 訊號,判斷目前需做哪些處理,此次 Design 主要考慮與 Memory 互動,其中的 Data 如何抓取,該在什麼時機點存放,請同學先規劃好再撰寫 code。 ![](https://i.imgur.com/1uAcDxt.png) ==Lab5 只要求同學實作 Local Binary Patterns,另外兩種 Filter 則為 Bonus 部分。== 備註:依據 testbench 給予的 mode,對影像進行不同的處理。 * mode: 00, Filter: __Local Binary Patterns__ * mode: 01, Filter: __Shift and Subtract__。 * mode: 10, Filter: __Edge detection__ --- ## __Interface__ 下圖為 Lab5 的 Interface。 ![](https://i.imgur.com/yK94k62.png) ### Input | Name | Width | Description | | --- | --- | --- | | clk | 1-bit | clock signel。| | reset | 1-bit | 此次 reset signal 與之前不同,是在 posedge 時進行重置動作。| | gray_ready | 1-bit | 當 gray_ready 拉起為 1 時,就代表可以開始對 gray memory 進行抓取值的動作,相當於之前 Lab 的 Start 線。| | gray_data | 8-bit | 接收 gray memory 所傳入的 data。| | mode | 2-bit | 代表目前需要對圖像做什麼樣的處理,處理同一張圖時會是維持相同的 mode,也就是模擬時,mode 會維持同值,不會更動。| ### Output | Name | Width | Description | | --- | --- | --- | | gray_req | 1-bit | 當要讀取 gray memory 時,請將 gray_req 拉成 1,反之為 0。| | gray_addr | 14-bit | 此為想要讀取 gray memory 的位址。| | ipf_addr | 14-bit | 此為想要存入 ipf memory 的位址。| | ipf_data | 8-bit | 處理後需存入的 Pixel value。| | ipf_valid | 1-bit | 當 ipf_valid 為 1,才會將此時的 ipf_data 依 ipf_addr 進行寫入的動作。 | | finish | 1-bit | 當所有 pixel 都已計算完畢後,請將此訊號線拉為 1,代表結束計算。| #### <font color=red>注意:Module IO port 必須與圖中 IO port 命名一致 !!</font> --- ## __Top View__ 此次同學需要與兩個 memory 進行互動,一個是 gray memory,此 memory 存放著未處理的圖片,另一個則是 ipf memory,需存放處理後的圖片。 ![](https://i.imgur.com/l97wkQu.png) --- ## __Memory__ 接下來介紹 memory 的存放架構,兩個 memory 都是依照 row 順序一個個擺放,如下圖所示,第 0 列(Pixel 0 ~ 127)擺放後,換擺放第 1 列(Pixel 128 ~ 255),依此類推。 ![](https://i.imgur.com/TsmmYjQ.png) 另外,ipf memory 部分,內部都已全部初始化為 0。 ![](https://i.imgur.com/8igr0cB.png) ## __Local Binary Patterns__ 此部分將介紹 Local Binary Patterns 如何運作。 ![](https://i.imgur.com/VFdGQPX.png) * 原圖大小固定為 128*128 pixels。 * 影像處理中不同的 filter,差異就在於其 kernel 的設計,可抓出不同的 pattern 出來,此次 Lab5 的 kernel 設計為 3*3 的大小。 * 藉由 sliding window 的方式掃過整張圖。 * 如果我們想要計算上圖 window 裡黑點位置(window 的中心點),則需要外圍八個點的資訊,才能計算出中心點位置的 Pixel value。 --- ![](https://i.imgur.com/zRxaenx.png) * 計算方式是將外圍八個點各自跟中心點進行比較,在大於等於的情況下,則得 1,反之得 0。 * 比較後放在相對應的位置上,其代表著 weight 比重,將八個點的 weight 值(2^擺放位置)做加總,則可得到中心點新的 Pixel value。 --- ![](https://i.imgur.com/Ok4FHw1.png) * 假設目前有九個點的資訊,然後需要計算中心點位置新的 Pixel value。 1.先將外圍每個點都跟中心點做比較。 2.大於等於則得 1,反之得 0(請對照 weight 表格內容)。 3.依照相對應的權重值,進行 Pixel value 計算,得到新的 Pixel value。 --- ![](https://i.imgur.com/D9KiEeH.png) * 此部分展示 sliding window 在滑動時,所對應的 Pixel index 的部分,所以當我們需要計算 Pixel index 為 129 位置時,我們需要外圍這些 address 的資訊,請注意計算 Pixel 時,都是抓取 gray_mem 的值進行計算,不會拿新的 Pixel value進行之後運算。 --- ![](https://i.imgur.com/Yrp9Pg2.png) * Sliding window 滑動~ move~ move~ --- ![](https://i.imgur.com/dMmqjiq.png) * 題目設計上為外圍不進行運算,設為 0 即可,但因原先 ipf memory 已初始化為 0,所以同學們只需計算 126 * 126 pixels 即可。 ## __Hint__ 介紹助教版本的做法,同學們可當作參考,同學也可自行設計其他架構撰寫。 ![](https://i.imgur.com/SMJT034.png) * sliding window 在滑動時,可發現其中的 data 部分可存下來之後還可以繼續使用。 * 可設計 9 個 DFF,存放這些值,在滑動時,只要再抓三筆 data 就可得到計算並得到下一個 output, --- ![](https://i.imgur.com/RRj0N7a.png) * 再來則是可以不用做加總的部分,因 weight,其實相當於將 index 對應到 ipf_data(output signal)的各別 bit index 上。 --- ## __波形圖__ 此部份再從波形圖作講解。 ![](https://i.imgur.com/xU7IFx7.png) * reset = 1 時進行重置動作。 * 對 gray memory 進行讀取時,請將 gray_req 拉成 1。 * 丟入想讀取的 addr(gray_addr),在下一個 cycle 就可拿到想要的 Pixel value(gray_data)。 * 當計算出新的 Pixel value 後,請進行寫入動作,將 ipf_valid 拉成 1,才會是有效的 ipf_addr 與 ipf_data。 --- ![](https://i.imgur.com/qM2eWl3.png) * 搭配上圖(wave form),可發現抓取 Pixel 是依 0, 128, 256 抓取,助教作法是抓取完三筆後再一起shift 到下一排,其他情況則 hold 住原值不變。 --- ## __模擬驗證__ 提供 makefile 給同學進行模擬驗證。 指令說明: * make: mode = 2'b00。 * make sim1: mode = 2'b01。 * make sim2: mode = 2'b10。 * synthesis 指令類推。 ![](https://i.imgur.com/s8jmHT2.png) --- ## __繳交文件__ 請依下圖所示,繳交所需檔案,檔名請依照規範。 ![](https://i.imgur.com/9G6Mzdz.png) 請將所有檔案打包成 <font color=red> 壓縮檔(.zip or .tar)</font>,上傳至iLMS 作業繳交區,格式如下: lab5_student#.zip (Example: lab5_102345678.zip) --- ## <font color=red>__Bonus__</font> ![](https://i.imgur.com/cxXjdjq.png) Bonus 則是多增加兩個 mode 可進行切換,表格則為 kernel 設定部分。 ==mode 實作各增加總分 1.5 分== --- ## __Shift and Subtract 作法說明__ ![](https://i.imgur.com/DOWUWzv.png) * 當得到新的值後,透過乘上 weight 的部分並加總,就可得到新的 Pixel value。 * 在這部分同學們可不需要考慮小數,此次設計請直接去掉小數即可。 * 因為此 mode 牽涉負數部分,與原先 LBP 部分,在想像上要有所不同,在此 mode,data 為有號數。 * 另一個 mode 也為同樣做法,請同學們自行類推。 --- ## __Deadline__ * <font color=red>6/2 (週五) 下午 17:00 不接受補交!!</font> # [Home Page:hatched_chick: ](https://hackmd.io/s/BkYeCF5Og)