1. 程式人生 > >FPGA verilog HDL 呼吸燈及呼吸流水燈實現

FPGA verilog HDL 呼吸燈及呼吸流水燈實現

專案一:FPGA的呼吸燈實現

          專案介紹:呼吸燈,就是想人們呼吸頻率的一種led燈亮滅的一種表現形式。過程是慢慢變亮,然後變亮以後又慢慢變滅的一種過程。很多初學者會認為硬體邏輯語言怎麼能控制電流的高低呢,讓燈有多亮就調多亮,所以覺得不好實現,其實不用擔心,呼吸燈捅破窗戶紙就知道,其實是一個很簡單的一個小專案,下面我將一步一步的講解,並且實現。

          專案小知識講解:本次專案會用到計數器,計時器在我上一個文章裡有介紹,這裡就不多說了。此外再回顧一下佔空比的小知識,PWM(Pluse Width Modulation)脈衝寬度調製,是一種對模擬訊號電平進行數字編碼的方法。通過高解析度計數器的使用,方波的佔空比被調製用來對一個具體模擬訊號的電平進行編碼。並廣泛應用在從測量、通訊、功率控制與變換及LED照明等許多領域中。顧名思義,就是佔空比可調的訊號,那麼什麼是佔空比呢?

       佔空比(Duty Cycle or Duty Ratio),可以解釋為,在一脈衝序列中(方波),正脈衝序列的持續時間脈衝總週期的比值。也可理解為,電路釋放能量的有效時間與總釋放時間的比值。PWM是怎樣實現調光呢?想要調節LED的亮度變化,實則是調節控制流經LED的電流。電流增大則LED亮度增強,反之減弱。但由於電流為模擬訊號,所以這時就用到了PWM。

假設剛開始時佔空比為1%,慢慢的佔空比為2%、3%、4%……56%、57%……98%、99%、100%。

這就是LED燈亮的一個過程,我們可以讓佔空比為1%時,令LED燈亮,其餘的部分讓LED滅,慢慢的佔空比越來越大,亮的部分也越來越多,這就是一個由滅到亮的一個過程。

假設剛開始時佔空比為100%,慢慢的佔空比為99%、98%、97%……64%、63%……2%、1%、0%。

這就是LED燈滅的一個過程,我們可以讓佔空比為99%時,令LED燈滅,其餘的部分讓LED亮,慢慢的佔空比越來越小,滅的部分也越來越多,這就是一個由亮到滅的一個過程。

專案設計:

     首先我們要思考,如何設計這樣描述的一個過程,很多人應該想到了用計數器,沒錯,確實要用到計數器。下面我們可以先畫一下專案構思前的時序圖。

自己手動畫的,有點粗糙,就湊合的看一下吧.......時鐘的線只是為了對齊,真實的時鐘只對著2us計數的一個時鐘週期的;比如說晶振為50MHZ,那麼每一個時鐘週期相當於1/50M=20ns,故第一個計數器為一個2us的計數器,每計100次之後清零;第二個計數器為2ms計數器,每當2us計數器計數100次時,2ms就會增加一次。同理2s計數器也是一樣。

我們可以看出,當cnt_2s>=cnt_2ms的部分剛好是我們上面所說的佔空比的位置,而且當cnt_2s加到999的時候剛好佔空比為100%,所以我們就會多了一個條件,當cnt_2s>=cnt_2ms,我們讓LED亮,cnt_2s<cnt_2ms的部分我們讓他滅。

一個完整的呼吸燈時間為2s,也就是,由亮變暗需要2s,由暗變亮需要2s;將 2s分為1000等份,也就是由亮變暗,需要1000次的變化,每次為2ms,將,2ms分為1000等份,佔空比100%過渡到0%,需要100次的變化,每次為2us;

既然原理差不多有了解,下面我們就開始程式設計環節了:

上半段只是一個由滅到亮的一個過程,我們下面開始下下半段(有亮到滅的過程),很多人都會覺得那豈不是和上面一樣再寫很多程式嘛!!!!就不賣關子了,只需要加一個標誌位flag就可以了。

記得加了標誌位flag的時候,要把標誌位flag的判斷條件寫在LED模組當中。

下面是模擬圖

根據模擬圖我們可以看到燈只在一小段是亮的,其餘的時間都是滅的,故後面也是一樣的結果。

上圖是全亮的時候準備進行由亮到滅的過程。

專案二:雙向流水呼吸燈的實現

專案設計:實現流水燈的現象,並且在流水的時候每個LED燈都實現呼吸燈的效果。為了實現這個效果,本次的設計是像踏步一樣的小專案,第一個LED燈準備從最亮到滅的那個臨界點,第二個LED燈就開始準備由滅到亮的一個過程,全程實現一個雙向流水燈的效果,流水到最右邊再返回。也就是說0S時第一個LED燈開始亮,到2S時再慢慢熄滅,此時第二個LED燈準備開始慢慢變亮到4S時慢慢熄滅,此時第三個LED燈準備慢慢變亮,以此類推..........

程式設計:流水呼吸燈的方法多種多樣,仁者見仁,智者見智。比如將呼吸燈模組例化到頂層模組去設計;用狀態機控制每個燈的過程;設定標誌位訊號,用位拼接的方法去完成呼吸流水燈。此次設計為了方便初學者理解,用一種最簡單的方法,加一個計數器,去控制每個燈的變化。

讓它每次在每個2S末尾處觸發+1,在7的時候清零,共計8個2s;思路在專案設計處有說,只有在每塊加一個條件,即可以實現效果,但是在每個cnt計數的時候,要注意第一個專案程式中的flag是1還是0;

效果大概和模擬時一樣的(踏雪尋梅的效果),模擬圖如下:

下面是用例化到頂層檔案實現的流水呼吸燈的模擬:

一般很多人看著模擬圖便可以將程式寫出,若新手不懂的,可以自行下載一下程式,因為程式過長,我將源程式和模擬程式打包上傳了,有興趣的可以自行下載一下:

           寫部落格是為了方便學弟學妹們學習以及初學者學習,也歡迎大家交流,請勿盜用,感謝尊重原創!