【摘要】:交通信号灯以其工程上易实现以及易理解的逻辑规则的特性被广泛认可。交通绿波带的主要原理是通过模拟一个恒流速的交通流获得一路段的通行时间,以此协调各个路口的交通灯变化,从而实现绿波交通。本文探析一种交通绿波带系统,本质上是基于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 男 汉族 湖南常德 本科 高级实验师 研究方向:电子设计