FPGA智能傳感系統(二)基於FPGA的交通燈設計

  在上一節FPGA智能傳感系統(一)Verilog基礎入門有介紹基本的語法知識。本節主要是實戰交通燈設計。

設計目的及功能

設計目的

  採用Verilog編寫程序,並在QUARTUS II工具Modelsim平臺仿真,在一個十字交叉路口,每個路口都有紅、綠、黃三盞燈。即北、東、南、西方向都有紅綠黃三盞燈。紅燈亮時表示禁止通行,綠燈亮是表示允許通行,黃燈亮則給行駛中的車輛有時間停在禁行線外。系統狀態轉移如圖1所示:

  四個方向之後某一個方向會爲綠燈,其餘方向爲紅燈。綠燈亮時,表示其它三個方向都能行駛至綠燈方向。每次綠燈亮27s,黃燈3s,然後轉90s紅燈。

  顯示採用LED光柱或數碼管倒計時的方式。具有復位功能。具有緊急情況下的按鈕功能。每個路口都採用2個七段共陽數碼管倒計時。

方案論證與選擇

  通過分析可以知道,所要設計的十字路口交通燈控制電路要能夠使北、東、南、西方向依次從27綠燈倒計時,再3s黃燈,再90s紅燈。由於系統時鐘是50Mhz,所以我們首先需要的就是分頻模塊產生1hz的頻率。可以不採用狀態機方式。直接以進程方式實現主支幹道的交通燈效果。也可以採用狀態機方式。每一種狀態爲一種效果,以切換狀態的方式實現交通燈效果。

  通過分析可以知道,所要設計的十字路口交通燈控制電路要能夠使北、東、南、西方向依次從27綠燈倒計時,再3s黃燈,再90s紅燈。由於系統時鐘是50Mhz,所以我們首先需要的就是分頻模塊產生1hz的頻率。可以不採用狀態機方式。直接以進程方式實現主支幹道的交通燈效果。也可以採用狀態機方式。每一種狀態爲一種效果,以切換狀態的方式實現交通燈效果。

  本次設計較複雜,如果不採用狀態機的方式實現起來會非常繁瑣,所以在功能中採用狀態機的方式實現。主要包含8種狀態,以狀態1到狀態8表示表示。

  • 狀態1:北方向綠燈27s,其餘紅燈,此時led輸出爲010_100_100_100。
  • 狀態2:北方向黃燈3s, 其餘紅燈,此時led輸出爲001_100_100_100。
  • 狀態3:東方向綠燈27s,其餘紅燈,此時led輸出爲100_010_100_100。
  • 狀態4:東方向黃燈3s, 其餘紅燈,此時led輸出爲100_001_100_100。
  • 狀態5:南方向綠燈27s,其餘紅燈,此時led輸出爲100_100_010_100。
  • 狀態6:南方向黃燈3s, 其餘紅燈,此時led輸出爲100_100_001_100。
  • 狀態7:西方向綠燈27s,其餘紅燈,此時led輸出爲100_100_100_010。
  • 狀態8:西方向黃燈3s,其餘紅燈,此時led輸出爲100_100_100_001。

基本原理

  通過分析可以知道,系統設計要求交通控制電路能夠從北方向順時針轉,每個方向都有27s的綠燈,3s的黃燈,之後就是90s的紅燈。對於其中任何一個方向,其信號的點亮順序爲綠燈亮27s,綠燈熄滅之後黃燈閃爍亮3s,黃燈閃爍亮3s之後紅燈亮,如此循環下去。因此設計系統流程框架如下圖2所示:

  如上圖所示,先由系統50Mhz產生1hz的分頻信號,用於狀態轉移和計時,同時系統時鐘分頻產生黃燈閃爍的分頻信號。依據狀態和黃燈閃爍信號產生LED控制信號。

  系統時鐘和當前狀態去決定控制數碼管倒計時,當倒計時時間確定之後就可以產生各個方向的個位和十位信號,依據系統時鐘產生位選信號對數碼管進行顯示,再通過段選信號去顯示結果。

  所設計的八個狀態如下所示:

狀態1:北方向綠燈27s,其餘紅燈,此時led輸出爲010_100_100_100。

  此時北方向的倒計時n_time從27s開始,東方向倒計時e_time從30s開始,南方向的倒計時s_time從60s開始,西方向倒計時w_time從90s開始。

  當北方時間n_time遞減到1時,之後被賦值爲3s黃燈(0s直接跳變爲3s),東方時間e_time也被賦值爲3s紅燈,南方時間s_time被賦值爲33s紅燈,西方時間w_time爲63s紅燈。

狀態2:北方向黃燈3s,其餘紅燈,此時led輸出爲001_100_100_100。

  到達狀態2的時候,北方向倒計時n_time被重新賦值爲2s,東方倒計時e_time也被重新賦值爲2s,南方倒計時s_time被賦值爲32s,西方倒計時被賦值爲62s。

  當北方時間倒計時到1s之後北方時間被賦值爲90s(0s直接被賦值到90s)紅燈,東方時間e_time被賦值爲27s綠燈,南方時間s_time被賦值爲爲30s紅燈,西方時間被賦值爲60s紅燈。

狀態3:東方向綠燈27s,其餘紅燈,此時led輸出爲100_010_100_100。

  到達狀態3時,東方時間被賦值爲27s綠燈遞減,南方時間s_time被賦值爲30s紅燈遞減,西方時間被賦值爲60s紅燈遞減,北方時間被賦值爲90s紅燈遞減。

  當東方時間e_time遞減到1時,之後被賦值爲3s黃燈(0s直接跳變爲3s),南方時間s_time也被賦值爲3s紅燈,西方時間w_time被賦值爲33s紅燈,北方時間n_time爲63s紅燈。

狀態4:東方向黃燈3s,其餘紅燈,此時led輸出爲100_001_100_100。

  到達狀態4的時候,東方向倒計時e_time被重新賦值爲2s,南方倒計時e_time也被重新賦值爲2s,西方倒計時w_time被賦值爲32s,北方倒計時被賦值爲62s。

  當東方時間倒計時到1s之後東方時間被賦值爲90s(0s直接被賦值到90s)紅燈,南方時間s_time被賦值爲27s綠燈,西方時間w_time被賦值爲爲30s紅燈,北方時間被賦值爲60s紅燈。

狀態5:南方向綠燈27s,其餘紅燈,此時led輸出爲100_100_010_100。

  到達狀態5時,南方時間被賦值爲27s綠燈遞減,西方時間w_time被賦值爲30s紅燈遞減,北方時間被賦值爲60s紅燈遞減,東方時間被賦值爲90s紅燈遞減。

  當南方時間s_time遞減到1時,之後被賦值爲3s黃燈(0s直接跳變爲3s),西方時間w_time也被賦值爲3s紅燈,北方時間n_time被賦值爲33s紅燈,東方時間e_time爲63s紅燈。

狀態6:南方向黃燈3s,其餘紅燈,此時led輸出爲100_100_001_100。

  到達狀態6的時候,南方向倒計時s_time被重新賦值爲2s,西方倒計時e_time也被重新賦值爲2s,北方倒計時w_time被賦值爲32s,東方倒計時被賦值爲62s。
  當南方時間倒計時到1s之後南方時間被賦值爲90s(0s直接被賦值到90s)紅燈,西方時間w_time被賦值爲27s綠燈,北方時間n_time被賦值爲爲30s紅燈,東方時間被賦值爲60s紅燈。

狀態7:西方向綠燈27s,其餘紅燈,此時led輸出爲100_100_100_010。

  到達狀態7時,西方時間被賦值爲27s綠燈遞減,北方時間n_time被賦值爲30s紅燈遞減,東方時間被賦值爲60s紅燈遞減,南方時間被賦值爲90s紅燈遞減。
  當西方時間w_time遞減到1時,之後被賦值爲3s黃燈(0s直接跳變爲3s),北方時間n_time也被賦值爲3s紅燈,東方時間e_time被賦值爲33s紅燈,南方時間e_time爲63s紅燈。

狀態8:西方向黃燈3s,其餘紅燈,此時led輸出爲100_100_100_001。

  到達狀態8的時候,西方向倒計時w_time被重新賦值爲2s,北方倒計時n_time也被重新賦值爲2s,東方倒計時e_time被賦值爲32s,南方倒計時被賦值爲62s。

  當西方時間倒計時到1s之後西方時間被賦值爲90s(0s直接被賦值到90s)紅燈,北方時間n_time被賦值爲27s綠燈,東方時間e_time被賦值爲爲30s紅燈,南方時間被賦值爲60s紅燈。

方案的實現與調試

  根據設計要求和系統所要求得功能,進行了前期調研,查閱相關書籍和文獻,確定本設計需要的所有器件以及模塊,制定設計方案,現確定主要完成以下任務:

1、系統時鐘的設計

  本設計需要提供一個50Mhz的系統時鐘。

2、控制電路的設計

  本設計中需要復位功能及遇有緊急情況可人爲將兩個方向都置爲紅燈功能,通過按鈕,按照控制要求,控制key鍵相應輸入的高低電平,繼而通過程序的運行達到控制的目的。

3、數碼管顯示模塊的設計

  本設計中需要將三種燈(紅、黃、綠)的點亮時間通過數碼管顯示出來,由於各方向的燈的倒計時時間不相同,需要用8個數碼管對各個方向進行顯示。

4、LED燈顯示模塊設計

  本設計中需要控制東西、南北兩個方向的信號燈,一共12個燈,由於各個方向顯示不相同,即需要控制4組信號燈。

程序調試

  接下來設置基本的參數信息,比如黃燈的發光時長,紅燈的發光時長,綠燈的發光時長等。WIDTH參數用於控制分頻,產生1s的時鐘,由於系統時鐘是50Mhz,所以系統時鐘的波形週期爲20ns,之後基於這個20ns一個上升沿就可以計數產生分頻信號:

  其中WIDTH爲25_000_000(仿真用25_000爲其系統頻率的一半,只要計數器clk_t小於WIDTH就不斷累加,若達到這個值,或者復位信號來了,就歸零,由此就產生了0.5s的計數器。依據這個0.5s的計數器,我們就可以產生1hz的時鐘。

  有了1hz的時鐘之後就可以改變狀態機,切換交通信號燈工作的8個狀態。在開始狀態切換之前有一個復位信號,狀態復位到狀態1,計時爲27s。

led_module.v

  led寄存器從高到低分別驅動:北、東、南、西向紅綠黃燈。

  整個實現爲:

  led燈控制模塊(led_module):根據接收到的實時狀態信號state[3:0],驅動北、東、南、西方向的led發光。

bit_seg_module.v

  數碼管顯示模塊(bit_seg_module):接收交通燈控制模塊傳遞過來的北、東、南、西方向的實時時間數據n_time[9:0]、e_time[9:0]、s_time[9:0]和w_time[9:0],並以此驅動對應的數碼管,將數據顯示出來。主要就是產生位選和段選信號以驅動數碼管。

  所以數碼管顯示模塊的輸入爲系統時鐘信號,系統復位信號,東西方向數碼管要顯示的數值,南北方向數碼管要顯示的數值。輸出就是數碼管的位選信號和段選信號。

  之後依據數字num去驅動數碼管顯示:

  除此之外還寫了頂層模塊traffic_led.v和測試文件test.v。

仿真結果

總結

  這次設計給我最大的收穫就是做什麼事都不要急,要一步一步的做好前提工作,我開始看到這個課題的時候就動手去寫程序,只是憑着自己腦子裏想一點就寫一點,但是經過幾次反覆的修改還是沒有成功,看不到效果,所以後來乾脆就放下來先把每一步每一個模塊都弄清楚再動手去寫,可以再本子上把各個模塊的端口以及連接都畫好,再去寫,這樣能做到事半工倍的效果,而且在設計的時候不懂得地方可以參考別人寫的程序,畢竟,不管做什麼課程設計都是爲了讓自己弄懂、學好,只要將別人的程序設計轉爲自己的知識就ok了,在次基礎上加上自己的一些想法,學會變通,或許還有 些知識沒學到,比如鍵盤輸入控制這部分,但是通過別人的程序能讓自己學到更多的知識,而且能鞏固知識,所以我覺得要想把程序寫好平常一定要多寫多練多參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章