本文采用Verilog HDL语言,自上向下完成了红绿灯交通信号系统的设计。设计过程中,利用QuartusII软件进行编译综合和时序仿真。
红绿灯交通信号系统采用经典的三段式状态机描述。在实验要求的基础上,增加了对左拐、右拐的单独控制,具备急车强通、单一通道优先通行功能。时序仿真通过后,把程序下载到康芯FPGA开发系统进行验证,Device选择ACEX1k family中的EP1k30TC144-3,达到预想的效果。
关键字:交通灯 Verilog HDL Quartus II
目 录
摘 要 2
目 录 3
第一篇 红绿灯交通信号系统 5
1.1 交通灯控制系统的功能概述 5
1.2 设计基本要求 5
1.2.1实验要求 5
1.2.2实验提示 6
1.3设计方案 6
1.4 Verilog HDL程序设计 8
1.4.1程序结构 8
1.4.2程序模块实现 8
1.5系统仿真与验证 12
1.5.1系统时序仿真 12
1.5.2 FPGA实验系统验证 15
第一章红绿灯交通信号系统
1.1 交通灯控制系统的功能概述
交通灯控制系统主要是实现城市十字交叉路口红绿灯的控制。在现代化的大城市中,十字交叉路口越来越多,在每个交叉路口都需要使用红绿灯进行交通指挥和管理,红、黄、绿灯的转换要有一个准确的时间间隔和转换顺序.这就需要有一个安全、自动的系统对红、黄、绿灯的转换进行管理。同时,由于系统的自动控制往往难以满足交叉路口某些特殊的交通要求,所以,控制系统需要增加交警干预控制的功能,如急车强通、单一通道优先通行等。
交通灯系统的硬件电路包括:两组红黄绿灯(配合十字路口的双向指挥控制)、两组七段显示数码管(配合红黄绿灯倒计时显示)、一组手动与自动控制开关(针对交通指挥交通控制使用)。实现路口交通灯系统控制的方法很多,可以用标准逻辑器件、可编程序控制器PLC、单片机等方案来实现。但是这些控制方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了设计难度。采用EDA技术。应用VerilogHDL硬件电路描述语言实现交通灯系统控制器的设计,利用QuartusII集成开发环境进行综合、仿真,并下载到FPGA可编程逻辑器件中,完成系统的控制作用。
1.2 设计基本要求
1.2.1实验要求
交通灯系统如图1.1,路口0和1均需要红、黄、绿三盏灯(用RYG分别表示),并且每个路口都需要一个倒数的计时器,绿灯每次维持的时间是20s,黄灯为5s,黄灯亮时应以一定的频率闪动。
图1.1 交通灯布局示意图
交通灯系统大多是自动控制来指挥交通的,但有时需要由交警手动控制红绿灯,所以要求设计的该交通信号系统需要具有该功能。
1.2.2实验提示
先分析交通灯控制系统应包含的电路子模块,如分频器、倒数计数器、红绿灯信号控制电路,再对该交通灯控制系统中出现的状态以及状态转换的条件进行分析,利用FSM来进行设计,该实验中状态转换的过程为R0G1——> R0Y1——> R1G0——> R1Y0——> R0G1
1.3设计方案
十字路口的两组交通灯分别控制东西(A)和南北(B)两组通道的车流和人流。一般的交通灯系统包含有红黄绿三种颜色的灯。红灯表示禁行,绿灯表示通行,黄灯是绿灯向红灯的过渡。传统交通灯右拐不做控制,任何时刻都通行,但是,这往往与行人过马路冲突,酿造交通事故。本设计中,增加右拐控制,改进了传统交通灯的不足。同时,考虑到FPGA实验系统的硬件资源,本设计与实际的交通灯比较做出了某些调整,每一通道设置一组灯,分别为直行绿灯(GD)、直行红灯(RD)、左拐绿灯(GL)、右拐绿灯(GR)。
图1.2 交通灯设计布局示意图
具体工作情况如下:
直行绿灯(GD)亮:人车直行;
直行绿灯(GD)闪烁:绿灯向红灯过渡(黄灯功能);
直行红灯(RD)亮:人车直行禁止;
左拐绿灯(GL)亮:车辆左拐通行;
左拐绿灯(GL)闪烁:左拐绿灯由亮向灭过渡;
左拐绿灯(GL)灭:车辆左拐禁行;
右拐绿灯(GR)亮:车辆右拐通行;
右拐绿灯(GR)闪烁:右拐绿灯由亮向灭过渡;
右拐绿灯(GR)灭:车辆右拐禁行;
系统的状态转换流程如表1.1:
其中,1表示相应的灯亮,0表示相应的灯灭,X表示相应的相应的灯闪烁。系统复位后,在这8个状态中不断的循环
表1.1 交通灯控制系统状态转换表
| 状态编号 | 指挥功能 | 通道A | 通道B | 时间 (s) | ||||||
| GDA | RDA | GLA | GRA | GDB | RDB | GLB | GRB | |||
| 1 | A通道人车直行 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 20 |
| 2 | 状态1向状态3过渡 | X | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 5 |
| 3 | A左拐、AB通道右拐 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 10 |
| 4 | 状态3向状态5过渡 | 0 | 1 | X | X | 0 | 1 | 0 | X | 5 |
| 5 | B通道人车直行 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 20 |
| 6 | 状态5向状态7过渡 | 0 | 1 | 0 | 0 | X | 0 | 0 | 0 | 5 |
| 7 | B左拐、AB通道右拐 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 10 |
| 8 | 状态7向状态8过渡 | 0 | 1 | 0 | X | 0 | 1 | X | X | 5 |
【急车强通功能】
十字路口往往会出现急救车、消防车和警车等一些执行特殊任务,需要优先通过十字路口的车辆。本设计采用一个按钮实现此功能,当按钮按下时,所有通道禁行,倒计时显示全部为0。特殊车辆可以优先通过。按钮恢复后,系统马上复位,重新开始状态转换。
【单一通道优先通行】
十字路口往往会出现某一方向通道车流人流量较多,另一方向相对较小的不平衡状况。所以交警需要有计划的干预交通灯控制系统,优先某一通道通行。本设计此功能采用两个按钮实现。按钮按下时,相应通道车人直行,而另一通道禁行,倒计时全部显示为0。按钮恢复后,系统马上复位,重新开始状态转换。
1.4 Verilog HDL程序设计
1.4.1程序结构
本设计采用两个摩尔状态机,分别控制A通道和B通道的状态转换。状态机采用三段式,具有以下优点:
三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。三段式描述方法虽然代码结构复杂了一些,但是换来的优势是使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。
第一段实现复位和当前状态的转换;第二段实现下一状态的定义;第三段实现输出的控制。为了程序代码书写方便,其中第一段和第三段,两个状态机共用一个always;第二段两个状态机各用一个always。
1.4.2程序模块实现
【系统顶层电路】
图1.4 交通灯控制电路顶层结构
其中,CLK为时钟输入端,接收外部1Hz频率的时钟信号,直接供系统时钟树运用;RESET为系统复位初始化端口,结合FPGA实验板的硬件资源考虑,本设计采用高电平复位;UN为急车强通控制端口;wayA为A通道优先通行控制端口;wayB为B通道优先通行控制端口。LAMPA输出信号,控制A通道的红绿灯;LAMPB输出信号,控制B通道的红绿灯;ACOUNT输出A通道倒计时信号;BCOUNT输出B通道倒计时信号。
【系统初始化和当前状态切换】
parameter A1=1,A2=2,A3=3,A4=4,A5=5,A6=6,A7=7; //A通道的7个状态值
parameter B1=1,B2=2,B3=3,B4=4,B5=5,B6=6,B7=7; //B通道的7个状态值
reg[7:0] TA1,TA2,TA3,TA4,TA5,TA6,TA7; //A通道7个状态的计数初值存储。
reg[7:0] TB1,TB2,TB3,TB4,TB5,TB6,TB7; //B通道7个状态的计数初值存储。
本设计中,A、B通道状态机各可以划分为的7个状态。程序首先定义7个状态值及其相应的倒计时计数初值。
if(RESET | UN | wayA | wayB)//高电平初始化,异步复位
begin
//各状态计数初值赋值
TA1<=8'b01010000;TA2<=8'b00010000;TA3<=8'b00110000;TA4<=8'b00010000;
TA5<=8'b01100000;TA6<=8'b00110000;TA7<=8'b00010000;
TB1<=8'b01100000;TB2<=8'b00110000;TB3<=8'b00010000;TB4<=8'b01010000;
TB5<=8'b00010000;TB6<=8'b00110000;TB7<=8'b00010000;
//当前状态和当前倒计时赋值
current_TA<=TA1;
current_TB<=TB1;
current_stateA<=A1;
current_stateB<=B1;
end
系统的初始化采用异步复位,可以由复位端口RESET触发,也可以由一些功能控制按键触发,如UN、wayA、和wayB。A、B通道的状态机分别初始化到A1和B1,并对各个状态倒计时计数初值赋值。
current_stateA<=next_stateA; //当前状态切换
current_stateB<=next_stateB;
current_TA<=next_TA; //倒计时变化
current_TB<=next_TB;
当复位信号无效时,状态机的当前状态和倒计时随着CLK时钟上升沿跳变切换。
【倒计时实现】
if(current_TA[3:0]==0) //A通道倒计时
begin //个位为零向十位借位
next_TA[3:0]=4'b1001; //个位值为9
next_TA[7:4]=current_TA[7:4]-1; //十位值减1
end
else
next_TA=current_TA-1; //个位不为零,正常减1
由于FPGA试验板自带译码电路,控制电路的倒计时采用BCD码输出格式。BCD码减法运算需要处理好的是借位调整。
【NEXT状态切换】
case(current_stateA) //case查表语句,current_stateA作敏感信号
A1: begin
next_TA=TA2; next_stateA=A2;
end
A2: begin
next_TA=TA3; next_stateA=A3;
end
A3: begin
next_TA=TA4; next_stateA=A4;
end
A4: begin
next_TA=TA5; next_stateA=A5;
end
A5: begin
next_TA=TA6; next_stateA=A6;
end
A6: begin
next_TA=TA7; next_stateA=A7;
end
A7: begin
next_TA=TA1; next_stateA=A1;
end
default: next_stateA=A1;
endcase
NEXT状态切换发生在倒计时到零的时刻。通过case查表语句,根据当前状态决定NEXT状态以及新的计数初值。
【控制信号输出】
ACOUNT=current_TA; //给A通道倒计时输出寄存器赋值
case(current_stateA) //查表根据当前状态决定红绿灯的亮灭
A1:LAMPA=4'b1000;
A2:LAMPA[3]=~LAMPA[3];
A3:LAMPA=4'b0111;
A4:begin
LAMPA[1]<=~LAMPA[1]; LAMPA[0]<=~LAMPA[0];
end
A5:LAMPA=4'b0100;
A6:LAMPA=4'b0101;
A7:LAMPA[0]=~LAMPA[0];
default:LAMPA=4'b1000;
endcase
控制信号输出由状态机的第三段实现。倒计时以BCD码格式输出。红绿灯亮灭输出根据当前状态决定,每一状态对应相应的亮灭情况。程序中通过一个case语句查表实现,current_stateA作为敏感信号。
【人工控制功能】
if(UN)
begin
ACOUNT=8'b00000000; BCOUNT=8'b00000000;
LAMPA=4'b0100; LAMPB=4'b0100;
end
else if(wayA)
begin
ACOUNT=8'b00000000; BCOUNT=8'b00000000;
LAMPA=4'b1000; LAMPB=4'b0100;
end
else if(wayB)
begin
ACOUNT=8'b00000000; BCOUNT=8'b00000000;
LAMPA=4'b0100; LAMPB=4'b1000;
end
急车强通、单一通道优先通行功能的实现只需要在状态机的第三段,优先于正常的输出,添加额外的输出控制。控制完成后,系统复位到初始值。
1.5系统仿真与验证
1.5.1系统时序仿真
【状态流程仿真】
本设计采用QuartusII软件进行编译并进行时序仿真。其中,时钟周期此用1us。整个工作流程仿真结果如下:
图1.5 交通灯控制系统时序仿真图
【急车强通功能仿真】
当十字路口出现急救车,消防车以及警车等需要优先通行时,功能按钮UN按下输入高电平。所有通道禁行,倒计时数码管显示全零。
图1.6 急车强通时序仿真图
【单一通道优先通行功能仿真】
当某一通道车人流量相对较大,需要优先考虑放行时,功能按钮wayA,或wayB按下,输入高电平。相应通道通行,另一通道禁行,直至按钮恢复。
图1.7 单一通道优先通行时序仿真图
【综合出来的RTL电路】
图1.8 综合出来的RTL电路
【综合出来的状态转换图】
图1.9 状态机A状态转换图
图1.10 状态机B状态转换图
1.5.2 FPGA实验系统验证
程序通过时序仿真后,下载到康芯FPGA实验系统。Device选择ACEX1k family中的EP1k30TC144-3。直接采用实验系统上的1Hz频率时钟。电路连接结构选择模式7,具体电路如下:
图1.11 电路连接结构图
管脚分配图如图1.12
图1.12 器件管脚分配
实际仿真照片如图1.13,下载本文