随着社会经济的快速发展和人民生活水平的不断提高,城市中车流量呈现出急剧增长的趋势,导致城市交通出现了巨大的压力。因此,改善十字路口的交通信号灯运行模式,提高十字路口的通行效率,对缓解城市交通堵塞有着重要的现实意义。而目前城市的交通控制,是固定的红绿灯转换周期,不灵活,在不同的时间段,十字路口的两个方向会出现车流量大小不平衡的情况,同时白天与夜间的车流量相差也较大,如采用固定的定时机制将严重降低实际十字路口的通行效率。由此,有人提出使用地感线圈检测车流量,根据车流量自动配时,但铺设地感线圈成本过高,且容易出现误差,公路网的现有网络资源也未得到充分利用。
鉴于以上原因,本文提出了基于FPGA的远程控制交通系统,能有效地利用公路网现有的网络资源,动态调节交通系统中车辆的通行时间,既提高了十字路口的车辆通行效率,又降低了成本。
1 系统总体设计与架构
该系统主要由交通系统自动配时模块、显示模块和控制中心远程控制模块组成,如图1所示。
交通系统自动配时模块采用50 MHz时钟源按照不同的配时方案进行定时计数,采用Altera公司的Cyclone IV代系列EP4CE15F17C8芯片作为主控芯片,利用Verilog HDL硬件语言完成整个交通灯定时配时控制模块的设计;交通系统显示模块是根据配时模块选择的方案对交通灯运行状态和数码管数字显示进行控制显示;控制中心远程控制模块使用Qt界面编程技术和TCP/IP传输协议,使得远程操作方便直观且控制信息传输可靠。
2 交通系统自动配时模块
此部分主要包括配时模块设计和定时计数模块设计两部分,主要实现配时方案的预存与计时。
2.1 交通系统自动配时模块设计
十字路口的交通分为主干道和副干道两个方向。主干道方向具有红灯(R1)、黄灯(Y1)、直行绿灯(G1)和左转绿灯(L1),副干道方向也具有红灯 (R2)、黄灯(Y2)、直行绿灯(G2)和左转绿灯(L2)。在交通高峰时期,十字路口两个方向的灯必须按照合理的顺序亮灭,根据十字路口的实际交通运行情况,此时系统的工作情况如下:
主干道方向的交通灯工作顺序为:绿灯→黄灯→左转绿灯→黄灯→红灯→黄灯。
副干道方向的交通灯工作顺序为:红灯→黄灯→绿灯→黄灯→左转绿灯→黄灯。
在实际交通中,两个方向交通信号灯的状态有着密切的联系,一个方向的交通信号灯状态影响着另一个方向的交通信号灯状态,只有这样才能协调好两个方向的车流,若两个方向的交通信号灯都各自独立变化,交通系统则会产生混乱。
其一个周期的交通状态对应情况如表1所示,状态从S0~S7,其中1表示灯亮,0表示灯灭。在文中编程实现时,可将主干道和副干道的状态分开进行,所以针对主干道S4~S7状态可合并,针对副干道S0~S3状态可合并。
实际交通中,白天和夜间的车流量相差较大,同时白天期间的主副干道车流量也会出现不均衡的现象,这就要求准备多套配时方案,以适应不同的需求。针对白天正常情况下,主干道车流量大于副干道车流量时,配时时间设置如表2所示,视为方案1;针对白天主干道车流量小于副干道车流量时,配时时间如表3所示,视为方案2;针对夜间车流量较小的情况下,配时时间可如表4所示设置,视为方案3;当发生交通事故或者有救护车、消防车等应急车辆需要优先通行时,所有路口均将红灯置亮,保证应急车辆的通行。这3种配时方案的选择是由控制中心综合所得到的交通信息之后,通过网络远程控制选择。
2.2 定时计数模块设计
系统使用50MHz时钟晶振,所以1 s对应50 000 000个时钟节拍,每过50 000 000个时钟节拍清零再重新计数,之后根据各盏灯的持续时间作为预置数按照1 s为一个单位递减计数,减到1以后再根据运行状态和配时时间重新预置数,依次循环。此模块无需设计单独的分频模块,整个系统可采用同一时钟信号,设计上更统一且不会出现时钟不匹配的问题。
3 交通系统显示模块
显示模块部分主要涉及交通红绿灯的显示和数码管的显示两部分,其中交通红绿灯的显示比较简单,FPGA以4位Alamp变量控制主干道上的4盏灯,其中Alamp[0]控制左转绿灯,Alamp[1]控制黄灯,Alamp[2]控制红灯,Alamp[3]控制绿灯,其值为1则表示相应的灯亮,如Alamp为4’b0001表示左转绿灯亮;同时以4位Blamp变量控制副干道上的4盏灯,其设置与Alamp类似。每个灯的亮灭持续时间都是按照配时模块设置的。
数码管的显示相比于交通红绿灯的显示更复杂,因为需要加上加码、动态扫描等部分。整个交通信号灯系统实际需要4对共8个数码管,由于相对的路口倒计时完全相同,所以为了节省逻辑资源,简化设计,可让相对路口共用一对数码管,所以只需对2对共4个数码管。数码管是共阳的,4个数码管的段选信号均共用同样的引脚,且均为低电平有效。文中主干道的倒计时时间设置为Number_Data1,副干道的倒计时时间设置为Number_Data2,数码管的显示设计思路如图2所示。
由图中可看出,通过“十位取位模块”分别对Number_Data1和Number_Data2进行取位的操作,将其十位和个位划分;之后通过“SMG加码模块”,即数码管显示加码模块,转换成数码管显示码;最后由“同步动态扫描模块”驱动点亮数码管。现针对每一个模块进行分析。
(1)十位取位模块。就是利用数学运算符“%”和“/”分别取得主副干道计时时间的十位和个位,将十位和个位分开进行处理。
(2)SMG加码模块。就是分别将两个路口倒计时时间的十位与个位的数字转换成数码管可显示的码型,每一个数字均是7段数码管a,b,c,d,e,f,g每段置亮置灭组合而成的,数码管显示示意图如图3所示。
(3)同步动态扫描模块。同步动态扫描模块利用时分原理和人类的视觉暂留效应,由于每个数码管点亮时间为1 ms,轮流驱动点亮4个数码管,人眼无法识别,所以目测为4个数码管同时点亮。此模块由两部分组成,分别为行扫描模块和列扫描模块,由于FPGA是可并行操作的,所以这两个模块可并行执行,达到真正的同步。列扫描模块相当于对数码管进行片选,每隔1 ms就使能不同的数码管;而行扫描模块是输出不同的SMG码,根据列扫描对数码管的片选使能,输出当前数码管的SMG码。
4 控制中心远程监控模块
此模块采用以太网技术将接收到的交通信息分析处理后,通过TCP/IP传输协议将控制信息发送给FPGA,FPGA根据控制信息选择配时模块当中的一套配时方案,将显示模块中的交通红绿灯和数码管按照配时方案显示出来。其中,FPGA控制整个交通系统作为服务端,控制中心作为客户端,其界面采用Qt编程技术。
4.1 服务端设计
服务端采用SOPC技术构建软核,移植TCP/IP协议栈实现网络通信。TCP/IP协议较为复杂,内容较多,主要是适合PC机的通信,针对FPGA服务端设计,文中采用精简的TCP/IP协议,既能达到设计要求,也能简化设计的复杂程度,其传输流程图如图4所示。
此协议栈中,需使用以下几个主要函数,实现数据接收:
(1)void init_ip_arp_udp_tcp(unsigned char * mymac,unsigned char * myip,unsigned char wwwp)。
此函数为初始化传输,主要用于填写MAC、IP、端口参数。函数返回值为空。
(2)unsigned char eth_type_is_arp_and_my_ip(unsigned char * buf,unsigned int len)。
此函数为数据包解析,是否接收到指向本地IP的ARP请求,若是返回值为1,若不是则返回值为0。
(3)chareth_type_is_ip_and_my_ip(unsigned char* buf,unsigned int len)。
此函数为数据包解析,是否接收到发送给本地IP的IP数据包,若是返回值为1,若不是则返回值为0。
(4)unsigned int get_tcp_data_pointer(void)。
此函数为获取有效数据位置,若有数据返回值为有效数据位置,若无数据则返回值为0。
4.2 客户端设计
Qt是一款跨平台的C++用户界面应用程序框架(C++GUI),能为应用程序开发者提供艺术级图形用户界面所需的所有功能,可以在不同的系统平台下使用,通用性好,具有良好的信号/槽封装机制,还有丰富的API函数,能够降低用户开发难度,其丰富的可扩展性使得图形化界面更加直观。在客户端设计中,为了能直观地显示IP地址、端口号以及接收到的交通信息等参数,同时能更加方便地发送控制信息,控制中心客户端采用Qt Creator工具实现了Qt界面设计。
这里使用QTextBrowser控件作为交通信息显示框,QLineEdit控件输入IP地址和端口号,QPushButton控件触发网络连接和相关控制信息的发送。由于设计中需要使用QTcp So cket网络套接字编程实现网络通信传输,所以需要在工程的pro文件中添加“QT+=network”,并添加QTcpSocket头文件,之后需要设置连接的IP地址和端口号,创建QTcpSocker对象tcpclient,连接服务器语句为:tcpclient.connectToHost(* ip,port)。连接成功后,需点击控制信息按钮,发射信号,从而触发数据发送槽函数的执行,其发送函数语句为:tcpclient.write(msg.toLoca18Bit())。控制中心的网络传输流程如图5所示。
为了实现更友好的界面显示,这里在Qt程序中添加了中文显示,具体设置语句如下:
QTextCodec::setCodecForLocale(QTextCodec::codecForName(“UTF-8”));
QTextCodec::setCodecForTr(QTextCodec::codec ForName(“UTF-8”));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(“UTF-8”)。
5 系统调试
将所有模块搭建连接好之后,在控制中心界面处,输入FPGA的IP地址及其间的端口号,点击“连接”,就建立起了FPGA与控制中心的通信,控制中心的图形化界面如图6所示。图中左边的文本框显示的是交通信息,根据图中交通信息可知先前主干道车流量大于副干道车流量,所以这里需要点击“日间模式1”按钮,FPGA控制交通系统选用方案1,其运行结果如图7所示。之后,图中出现一个车辆的呼救信息,所以需点击“紧急停止”按钮,终止交通系统的运行,处理事故,其运行结果如图8所示。
“日间模式2”按钮对应配时方案2的运行效果,“夜间模式”按钮对应配时方案3的运行效果,其实际测试结果正常,运行稳定,达到了控制中心远程精确控制交通系统的目的。
6 结束语
本设计以FPGA作为开发平台,使用Verilog HDL语言完成了交通系统自动配时模块和显示模块的设计,同时采用SOPC技术在FPGA上构建软核实现控制中心通过网络控制交通系统,控制中心的界面采用Qt设计,美观、操作方便且通用性好。整个设计较好地利用了现有公路的网络资源,配合智能车载系统车辆信息远程发送技术,能精确有效地控制整个交通系统,相比于其他依靠传感器,控制交通系统运行情况的设计,其可靠性更高,然而成本却相对较低。