【摘要】:交通信號燈以其工程上易實現以及易理解的邏輯規則的特性被廣泛認可。交通綠波帶的主要原理是通過模擬一個恒流速的交通流獲得一路段的通行時間,以此協調各個路口的交通燈變化,從而實現綠波交通。本文探析一種交通綠波帶系統,本質上是基于VHDL的多個路口的交通控制系統,采用硬件描述語言進行程序設計和Quartus Ⅱ軟件仿真測試。仿真結果表明,三個路口的交通燈能夠實現雙向的交通綠波帶。如果付諸實踐,在各個路段都采用這種基于FPGA的交通綠波系統,預計會大大提升車輛流速以及在此路段的行車體驗。
【關鍵詞】:交通綠波系統 仿真 VHDL語言
解決城市主干道擁堵問題,行之有效的方法是搭建交通綠波帶,讓車輛盡快通過,從而提高單位時間內車輛通行效率。對此,需要先設計出各個路口合適的交通燈模式,測算和獲取設計所需的交通參數和信號燈參數,測算出最人性化的行人綠燈時間,選擇合適的交通燈變換周期。本文選擇某城市WY大道上的三個路口,利用VHDL硬件描述語言進行綠波帶交通燈系統設計,具有很強的移植性,稍作改編,可用于更大更復雜的交通綠波帶設計。
1 參數的獲取與處理
在設計一條在主干線上的交通綠波帶時,主要原則利用優化算法對各種參數進行處理,從而確定出一條延誤時間最短的干線綠波帶。有很多參數需要實地考察或者建模計算來確定。
1、路段長度及車速:
路段選擇以WY大道牌樓口為起點A,其與WY大道桃子湖路口B相距476米,而B與WY大道新民路口C相距924米。從起點A到終點C總長達1.4公里。
經實地考察,南北走向車輛速度一般為60Km/h,而東西走向直行都是行人和非機動車,東西左轉的車流量較小。
2、周期時長
為了干線上的各交叉口的信號燈能協調統一,各個信號燈的周期必須相同。一般情況下,信號燈周期不能小于一分鐘,否則會出現車輛和行人無法及時通過路口以致交叉路口堵塞。周期也不能太長,因為A路口到B路口的距離只有四百多米,在車流速度平均為50-60Km/h的情況下,只需半分鐘車輛就可以穿過,若周期時長大于三分鐘,就會造成較長放入延誤時間,甚至會導致延誤放入車輛由第一個路口延伸到下一路口。本文將A、B、C三個路口的信號燈周期都定為180秒。
3、綠信比
綠信比定義為:在一個周期下,一個路口的綠燈時長與總周期時長的比率。綠信比是調節其所在路口的通行能力的重要參數。在交叉路口中,一個方向的綠信比增加必須是以減少另一方向的綠信比為代價,所以在確定綠信比時一定要如實反映路口的車流量,以達到各個方向的通行能力一致。
4、相位及相位差
一個路口的交通燈相位設置要兼顧各個方向車輛通行的需求,不合理的相位設置會導致交通混亂及交通堵塞。
本文所實現的交通綠波帶主要靠調節相位差,使相位差的時間剛好是車流通過這些交叉口的時間差。這樣,當車輛從路口出發到達下一路口時,剛好是綠燈。由于三個路口的信號燈周期一致,只要實現第一次信號燈相位差優化成綠波帶,接下來每個周期的相位差就固定下來了,從而實現一條持續的綠波帶。
在測得各路口的車流速度和路段距離的情況下,可依據公式pn=sn/v求得相位差。
其中pn為相位差,單位是秒,sn為路段的長度,單位是米,v是平均車流速度,單位是m/s。實際中不同方向的平均車速是一個不定值,它會隨著上下班高峰期、節假日出城高峰或返程高峰、上下學時間變動。為了工程上的簡便,讓相位差是整數,取v=57Km/h,s1=476m,s2=924m代入上式,得p1=30s,p2=60s。
2 綠波系統的設計及仿真
2.1 系統框架和程序設計
本文采用雙向綠波帶模式進行設計,可以全時段地實現干線的上行和下行無滯留調制。對于兩個端口,要求當其開放主干線的通行權時,既要作為入口去放行一波將駛入綠波帶的車流,同時要作為出口去精準無滯留地放行一波已駛過綠波帶的車流。對于路段中間的交叉口,由于上下游的路口距離不同,很難做到每次放行都是剛好囊括兩個方向的綠波帶,所以其主干線的通行時間較長,同時綠信比增大、效率下降。這是無法避免卻可以通過系統設計來優化的問題。
2.1.1 綠波系統框架的設計
在一個周期中A、C路口相位1的通行權時間為80s,其他相位的總通行時間為100s,而B路口的相位1通行時間為140s,其他相位的總通行時間為40s。對于A、C路口,其綠信比是能夠忠實反映個方向的車流量的,在對其進行信號燈設計時,按照正常的相位依次轉換模式設計即可。而對于B路口,顯然其主干線的綠信比過大,留給其他的相位的通行權時間總共只有40s,再采用上述模式是行不通的,需要適當權衡和改變。
假設0s時刻C點交叉口調制出80s主干道的通行權,那么大概在60s的時刻,放行的這一波車流開始通過B點交叉口,大概在90s時刻開始通過A點交叉口。在A點交叉口開放80s通行權時,也有自A至C的車流駛入,這時候反向推算上述綠波即可。A、B、C交叉口的信號周期皆為180s,其中C路口的綠波帶從0s開始,B路口的綠波帶從60s開始,A路口的綠波帶從90s開始。值得注意的是:由于雙向綠波帶的特性,B路口的相位1的綠信比要大于A、C兩路口的,故對其要單獨設計。
對于C路口,主干線綠波帶從0s開始,持續80s,所以在0-80s,主干線直行綠燈亮,其他方向紅燈亮,爾后跳轉到其他相位通行;如果選擇相位2通行,會造成支干線的紅燈大于100s,由于交通燈的計時顯示設計大多兩位數,產生計時溢出;如果選擇相位3通行,就可以完美避免這種問題。所以在80-110s,相位3獲得通行權,支干線直行綠燈亮,其他方向紅燈亮。在110-150s,相位2獲得通行權,主干線左轉綠燈亮,其他方向紅燈亮。在150-180s,相位4獲得通行權,支干線左轉綠燈亮,其他方向紅燈亮。至此,一個周期完畢,進入下一個周期循環。
對于A路口,其相位1的綠信比與C路口一樣,但是其綠波帶開始時間要滯后于C路口90s。為了工程簡便,A、C路口交通燈設計一樣。
B路口的情況要復雜一些,140s的相位1需轉換成70s的相位1通行權加上70s的相位1和相位2的通行權。在前70s,自C至A方向的綠波帶所帶來的車流差不多都通行完畢,而后70s的車流量主要是自A至C方向的車輛,再結合WY大道特殊的T字型路口,這時候主干線的直行和左轉(也就是相位1和相位2)一起進行,不會給B路口帶來大的交通混亂。所以B路口可以實行以下信號燈模式:從C路口周期時間的60s起,前70s相位1獲得通行權,主干線直行綠燈亮,其他方向紅燈亮。接下來70s里,相位1和相位2獲得通行權,主干線直行和主干線左轉綠燈亮,其他方向紅燈亮。然后是20s的相位3獲得通行權,支干線直行綠燈亮,其他方向紅燈亮。最后是20s的相位4獲得通行權,支干線左轉綠燈亮,其他方向紅燈亮。至此一個180s為周期的信號燈設計完畢。
2.1.2 單個交通燈的程序設計
本文只采用紅綠兩種燈色和兩位LED倒計時顯示器來設計。根據系統框架所設計的四種相位,狀態機也應有四種狀態:zz、zl、cz、cl,分別代表相位1、相位2、相位3、相位4。采用TYPE類型(用戶自定義的數據類型)來定義這些狀態。
type states is (zz,zl,cz,cl);
variable change0,change1,change2:states;
然后再具體的狀態下進行減數計時和狀態判斷轉換。
elsif change0=zz then
if a='0' then zhu0<="10000000";zhi0<="10000000";
led0<="100001";a:='1';
else if zhu0="00000000" then a:='0'; change0:=cz;
elsif zhu0(3 downto 0)=0 then zhu0<=zhu0-7;zhi0<=zhi0-7;
else zhu0<=zhu0-1;zhi0<=zhi0-1;
end if; end if;
其中要注意存儲倒計時的變量是8位二進制,要轉換成8為BCD碼,以便于顯示模塊的表達。轉換方法是遇到第四位全為0且減數計時上升沿發生時,整個向量減去7,其他情況均是減去1。
設計時鐘計時模塊時,假設外部時鐘源的頻率是10MHZ,要利用其生成一個頻率為1HZ的一位字,以供減數計時參考。這個模塊需要用進程子程序來實現,優勢是只要外部時鐘源有變動,進程就會順序執行一次內部命令。
process(f)
begin
if f'event and f='1' then
if cnt= 4999999 then
cnt<=0;
clk<=not clk;
else cnt<=cnt+1;
end if;
end if;
end process;
2.1.3 程序設計
VHDL語言IF語句是并行執行的,而三個路口聯動需要順序判斷。首先在系統剛開始就讓C路口進入工作狀態,任一工作狀態皆可。如果計時所用存儲變量超過正常的數值,就強制其進入周期的開始階段。
if zhu0>"10000001"then
a:='0';change0:=zz;zhu0<="01111001";zhi0<="01111001";
接著是判斷C路口的狀態從而讓B路口適時進入新的周期循環,綠波系統設計指明在C路口開始計數60s后B路口開始新的周期,這就需要if判斷語句:
If zhu0="00100000" and led0="100001"
then zhu1<="01110000";zhi1<="01110000";led1<="100001";b:='1';
b的作用有兩個,一個是起始標記向量,當周期開始條件滿足時,b為1,表示B路口交通燈程序已經在運行,b為0時,表示B路口交通燈程序還未開始。另一個是狀態機轉換標記向量,在程序運行中,要不停的判斷是否進行狀態轉換,b=0時,表示正在轉換,b=1時,表示無需轉換。
最后是A路口的交通燈聯動,A路口的程序設計與B路口類似,只是觸發周期條件不同,A路口是在C路口交通燈周期開始后的90s開始循環。
if zhu0="00100000" and led0="001010"
then zhu2<="10000000";zhi2<="10000000";led2<="100001";
c:='1';change2:=zz;
三個交通燈的周期時長都是180s,可以很完美的嵌合循環。
頭文件中需引用std_logic_unsigned程序包文件,便于不同的數據類型相互賦值和計算。分別用Process進程語句構建時鐘計時模塊和交通狀態機模塊。
2.2 運用QuartusⅡ匯編與仿真
為了方便仿真,將f分配為一組每2ns改變一次電平的方波,選擇QuartusⅡ Simulator下的功能仿真。
仿真結果表明,在外部時鐘源跳變的開始,C路口就進入了工作狀態的相位1并且開始倒數計時,對應的存儲倒計時變量zhu0和zhi0一起從10000000開始減數變化,代表著從80s開始倒計時。
在C路口開始工作后的60s之內,B路口的交通燈一直處于待機狀態,各種變量持續為0。從60s時起,B路口開啟工作狀態,進入以180s為周期的交通燈循環。
在C路口的80s倒計時結束時,C路口的交通燈模式便發生了轉換。zhu0和zhi0計時寄存器重載數值為30s倒計時,而且led0的數值變為001010,標志著相位2獲得通行權。
從90s時起,zhu0和zhi0寄存器數值為00100000,A路口開始進入工作狀態,工作模式和運作流程與C路口一樣,只是在周期上延遲了90s。結果表明這些波紋圖形和數據表明仿真結果與預期一致。
結論
本文通過VHDL語言設計交通綠波帶,并通過QuartusⅡ的編譯仿真功能來解決WY大道存在的擁堵問題,通過交通燈所需的各種參數分析,比如岔路口形狀、相位差、綠信比、平均車速等,根據測算出的數據構建出綠波帶系統的框架,然后根據硬件描述語言的特性去編寫程序,選擇芯片,編譯分析與仿真。仿真結果表明本設計能很好地達到預期效果。
【參考文獻】:
【1】 高銳, 高芳. 可編程邏輯器件設計項目教程[M]. 機械工業出版社, 2012.
【2】 吳厚航. FPGA設計實戰演練 : Practice-based learning of FPGA logic level design, 邏輯篇[M]. 清華大學出版社, 2015.
【3】 Zwoliński M. Digital System Design with VHDL[M]// Digital system design with VHDL =. Pub. House of Electronics Industry, 2002.
【4】 李俊. EDA技術與VHDL編程[M]. 電子工業出版社, 2012.
【5】 PeterJ.Ashenden. VHDL設計指南[M]. 機械工業出版社, 2005.
作者簡介:薛開伍 1964.8 男 漢族 湖南常德 本科 高級實驗師 研究方向:電子設計