圖一
圖三
圖二
Divider除頻器顧名思義就是用除的方式來降低頻率,頻率除以2n+1次方,n為輸出的[ _:n],
例如圖二這顆除頻器描述為可以使頻率降低219+1次方倍,由圖三可以看出為什麼這樣描述會
有除頻的效果。在20位數每進2次訊號一個週期,在21位數每進4次訊號一個週期,在22位數
每進8次訊號一個週期…以此類推。用波形圖表示如圖四。
圖四
圖四
圖五
圖六
這個Module是判斷sel進來的值去做圖五描述的相對應輸出,如圖六當sel是1101時,輸出counter的[7:4]即是0111。
圖七
圖八
圖九
U3是判斷sel進來的值去做圖八描述的相應輸出,如圖九當sel的[1:0]是11時,輸出scan為0111。
圖十
圖十一
圖十二
圖十三
U4是解碼器,把二進位的碼轉換成七段顯示器使用的編碼,一樣是判斷hex_in進來的值
去做圖十一描述的相應輸出,當20為0時圖十二的0部分會亮,依此類推可知若要七段顯
示器顯示5時需要亮起的部位是[0,5,6,2,3]所以0101解碼後得10010010。
圖十四
圖十五
圖十六
圖十七
U5在把Binary碼轉成BCD碼,圖十五是轉換的示意圖,輸出的[3:0]是個位數、[7:4]是十位數、
[9:8]是百位數。如圖十六:二進位的162轉成BCD編碼的就是4位元為一組,一組表示一位數。
圖十七的例子: A是10110011(179)轉換結果是ONE是1001(9)、TEN是0111(7)、HUN是01(1)。
圖十九
圖十八
圖二十
圖二十一
U6要把圖十九的程式碼跟圖二十配著看就會很清楚,一開始設初始直trigger_pulse=1'b0、value_latch=1'b0,State:IDLE時若按了
按鈕那就到下個State:TRIGGER,此時trigger_pulse=1'b1並到下個State:ECHO WAIT,echo_end為真前都一直在這個State直到為真後
進入下個State:COMPUTATION,並value_latch=1'b1再回到State:IDLE。
當按下RESET時State:IDLE。
U7: Ultrasound_DATA
圖二十二
圖二十三
輸入的device_echo是超音波模組的回傳值,輸出的device_trigger是用來啟動超音波模組的。如圖二十三,當我們給超音波模組一個高
電位模組就發射訊號並計算發射到接收過了多久。聲波在空氣中的傳遞速率約為340 m/s、系統頻率為50Mhz,而如圖二十三從發送
到收到回音的距離要除以二才是實際距離,所以計算式會是 (計算出的長度 x 340) / (500000 x 2) cm。
圖二十四
圖二十五
圖二十六
圖二十七
圖二十四是在描述輸出用來啟動超音波模組的device_trigger,從圖二十六可以可觀察當trigger_pulse為真,也就是
按下button時開始輸出一段高電位給超音波模組。圖二十五是敘述計算距離device_echo為真,也就是送出訊號直到
停止送訊號後echo_end為真時value_pulse也為真,此時開始計算distance=echo_length*340/1,000,000 cm(50Mhz system clock)
9'b101010100 = 9'd340 、>>20 右移20意思是除以220,(220 = 1048576 約等於1000000)。
圖二十二
圖二十三
當按下按鈕時,表面上只按了一下。但是訊號的傳遞並不是很單純的由’1’直接跳到’0’。實際上
的訊號會如圖二十三所示,當我們按下按鈕後,訊號會在高低電位之間彈跳(bounce)。雖然我
們只按了一下按鈕,電路可能會解讀成按了好幾下按鈕。
例如預期收到的訊息是1111111100000000但可能收到的是1110110111000000,而Debounce的目
的就是除去訊號高低電位之間彈跳所造成的不正確輸入。
圖二十四
圖二十四是模擬按下按鈕後得到不穩定的輸入0001100100111100001時輸出都持續為0。
圖二十五
圖二十五是模擬按一直按著按鈕沒放開的話得到輸出仍持續為0。
圖二十六
圖二十六是模擬按一下按鈕後輸出會得到1時脈的1。
外接電路
超音波模組Datasheet : http://www.micropik.com/PDF/HCSR04.pdf