交通信号灯的设计档.docx
《交通信号灯的设计档.docx》由会员分享,可在线阅读,更多相关《交通信号灯的设计档.docx(18页珍藏版)》请在冰豆网上搜索。
![交通信号灯的设计档.docx](https://file1.bdocx.com/fileroot1/2023-4/16/0dd52d26-2083-476e-8424-7b10cb06f773/0dd52d26-2083-476e-8424-7b10cb06f7731.gif)
交通信号灯的设计档
交通灯信号控制器设计报告
【题目】
交通信号灯的控制器
【设计任务与要求】
(1)设计任务
设计一个主干道与支干道十字路口的交通管理系统,并用VHDL进行描述。该交通管理的技术要求为:
如果只有一个方向有车时,则保持该方向畅通;当两个方向都有车时,主干道与支干道交替通行,但是主干道通行的是将要比支干道通行的时间要长一些。
(2)设计要求
1、当处于“主干道绿灯,支道红灯”状态:
a、主干道要车要求通行,支道也有车要求通行时,若主干道通行时间大于30秒则切换到“主黄,主红”,4秒后自动切换到“主红,支绿”;
b、主干道无车要求通行,支道有车要求通行时,立即切换到“主红,支绿”;
c、其他情况保持“主绿,支红”状态。
2、当处于“主干道红灯,支干道绿灯”状态:
a、支道有车要求通行时,保持“主红,支绿”状态,但最多保持30秒然后主动切换到“主红,支黄”状态,4秒后自动切换到“主绿,支红”状态;
b、支道无车要求通行时,立即切换到“主红,支黄”状态,4秒后自动切换到“主绿,支红”状态。
3、利用八位七段管码显示模块其中的2位实现时间显示。
4、扩展要求:
要求设计(改变时间显示方式,丰富控制逻辑等)
【设计原理及方案】
利用状态机按照设定的条件实现“主绿,支红”、“主黄,支红”、“主红,支绿”、“主红,支黄”四种状态之间的转换。
十字路口的示意图如右图所示。在主干道和支干道两个方向上都安装红、黄、绿三色信
号灯;Ca和Cb分别是安装在主干道和支干
道上的传感器,用于检测是否有车辆需要通
过路口。在只有主干道有车时,主干道亮绿
灯,支干道亮红灯;当只有支干道有车时,
主干道亮红灯,支干道亮绿灯;当了两个方
向都有车时,两个方向轮流亮绿灯和红灯。
交通管理系统的结构图如下所示:
设计系统主要由控制器和
受控器的定时器组成。定时器
用来确定主干道、支干道的通
行时间以及公共停车时间;
CNT是定时的值;LD是定时
值的同步预置信号,高电平有
效;ST是这个定时器的状态信
号,当定时结束后,ST输出为
1;Ca和Cb分别为主干道和支
干道的传感器输出信号,高电
平表示有车需要通过;clk是
期为秒的时钟信号;reset是异交通管理系统结构图
步复位信号,低电平有效,复位
后的初始状态为主干道畅通;Ra、
Ya、Ga和Rb、Yb、Gb分别为主
道和支干道的红、黄、绿灯的控制
信号,高电平有效。
如下图所示,该图很清楚的表明了该交通状态间的转换关系。
状态转换图
【电路设计与实现】
设计电路由分频器、计数器、控制器、输出系统等组成。
(1)、分频器电路的频率本为50MHz,但是电路中我设计需要2000Hz和1Hz的信号。由1HZ分频器输出的信号,输入到控制器当中,分析路灯的情况。由2000Hz输出分频器输出地信号,输入到输出端,分析其输出的情况。其程序如下所示:
1Hz的分频器程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpinis
port(clk:
instd_logic;
finout:
outstd_logic);
endfenpin;
architecturebhvoffenpinis
signaltmp:
INTEGERRANGE0TO49999999;---1HZ的分频
begin
process(clk)
begin
ifclk'eventandclk='1'then
iftmp=49999999thentmp<=00000000;
elsetmp<=tmp+1;
endif;
iftmp<25000000thenfinout<='0';
elsefinout<='1';
endif;
endif;
endprocess;
endbhv;
对上述程序进行完编译仿真后,得到其源元件,如上图所示
512Hz的分频器源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpin123is
port(clk:
instd_logic;
clkfen:
outstd_logic);
endfenpin123;
architecturefenpinoffenpin123is
signalclk_mid:
std_logic;
begin
process(clk)
variabledata:
integerrange0to48828;---将基准信号分频到512Hz
begin
ifclk'eventandclk='1'then
ifdata=48828then
data:
=0;
clk_mid<=notclk_mid;
else
data:
=data+1;
endif;
endif;
clkfen<=clk_mid;
endprocess;
endfenpin;
对上述程序进行完编译仿真后,得到其源元件,如上图所示
(2)、计数器
实验过程中,计数器用来计时,主干道或支干道亮绿灯时,计数30S,过度切换带计数4S。
计数器程序如下所示:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;--打开IEEE库包
ENTITYcounterIS--定义实体
PORT(clk:
INSTD_LOGIC;
reset:
instd_logic;
countNum:
BuFFeRINTEGERRANGE0TO64);
END;--实体结束语句
ARCHITECTUREbehaviorOFcounterIS--定义结构体
BEGIN
process(reset,Clk)
BEGIN
IFReset='1'THEN
countNum<=0;
ELSIFrising_edge(Clk)THEN
IFcountNum=64THEN
countNum<=0;
ELSE
countNum<=countNum+1;
ENDIF;
ENDIF;
ENDPROCESS;--结束进程语句
END;--结构体结束
对上述程序进行完编译仿真后,得到其源元件,如上图所示
(3)控制器
控制器内部分析信号,然后控制输出地灯管的颜色。这是整个实验中的主要功能元件,它是实现交通灯转换的必要条件。
控制器的源程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH;--打开数据库里的包集
ENTITYtrafficIS--定义实体
PORT(
CLK,SM,SB:
INBIT;
MR,MY,MG,BR,BY,BG:
OUTBIT;
reset:
OUTstd_logic;
CountNum:
inINTEGERRANGE0TO64;--计数器输入的信号
Num:
outINTEGERRANGE0TO31--控制器输出的信号
);
ENDtraffic;--实体结束语句
ARCHITECTUREBEHAVOFtrafficIS--定义结构体
TYPESTATE_TYPEIS(A,B,C,D);--对四种状态的定义
SIGNALSTATE:
STATE_TYPE;--定义结构体内的信号
BEGIN
CNT:
PROCESS(CLK,SM,SB,CountNum)--进程语句,定义敏感信号
BEGIN
IFCLK'EVENTANDCLK='1'THEN
CASESTATEIS
WHENA=>MR<='0';MY<='0';MG<='1';--主绿支红(无车请求通过)(在主绿支红状态下-->)
BR<='1';BY<='0';BG<='0';
RESET<='0';
IF(SBANDSM)='1'THEN---主干支干都有车请求
IFCountNum<=29THEN--30秒内主道通
Num<=30-CountNum;
ELSE
STATE<=B;RESET<='1';--30秒后主黄支红
ENDIF;
ENDIF;
IF(SBAND(NOTSM))='1'THEN--只有支道有车请求
STATE<=B;RESET<='1';--立即变主黄支红
ENDIF;
WHENB=>MR<='0';MY<='1';MG<='0';--定义主黄支红(在主黄支
红状态下-->)
BR<='1';BY<='0';BG<='0';
RESET<='0';
IFCountNum<=3THEN
Num<=4-CountNum;
ELSE
STATE<=C;RESET<='1';--4秒后变主红支绿
ENDIF;
WHENC=>MR<='1';MY<='0';MG<='0';--定义主红支绿(在主红支绿状态下-->)
BR<='0';BY<='0';BG<='1';
RESET<='0';
IFSB='1'THEN--主红支绿状态下支道有车请求
IFCountNum<=29THEN--30秒内支道通
Num<=30-CountNum;
ELSE
STATE<=D;RESET<='1';--30秒后主红支黄
ENDIF;
ENDIF;
IFSB='0'THEN--或是支道没车请求时,立即切换到主红支黄
STATE<=D;RESET<='1';
ENDIF;
WHEND=>MR<='1';MY<='0';MG<='0';--主红支黄(在主红支黄状态下-->)
BR<='0';BY<='1';BG<='0';
RESET<='0';
IFCountNum<=3THEN
Num<=4-CountNum;
ELSE
STATE<=A;RESET<='1';---4秒后自动切换到主绿支红
ENDIF;
WHENOTHERS=>STATE<=A;
ENDCASE;
ENDIF;
ENDPROCESSCNT;--结束进程语句
ENDBEHAV;--结构体结束
对上述程序进行完编译仿真后,得到其源元件,如上图所示
(4)分配器
分配器用来控制和调整信号的输出。
分配器的源程序如下所示:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH;--打开IEEE库包
ENTITYFENWEIIS--定义实体
PORT
(Numin:
INintegerRANGE0TO31;
NumA,NumB:
OUTIntegerRANGE0to9
);
END;
ARCHITECTUREbehaviorOFFENWEIIS--定义结构体
BEGIN
process(Numin)--进程语句,定义敏感信号
BEGIN--进程语句描述开始
IFNumin>=30THEN
NumA<=3;
NumB<=Numin-30;
ELSIFNumin>=20THEN
NumA<=2;
NumB<=Numin-20;
ELSIFNumin>=10THEN
NumA<=1;
NumB<=Numin-10;
ELSE
NumA<=0;
NumB<=Numin;--将交通灯显示时间用两位数分别显示
ENDIF;--结束循环
ENDPROCESS;--结束进程
END;--结构体结束语句
对上述程序进行完编译仿真后,得到其源元件,如上图所示
(5)、输出系统
输出系统用来控制输出信号。包括数字的输出和模拟交通灯的颜色变化。
输出器的源程序如下所示:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;--打开IEEE库包
ENTITYbcd_dataIS--定义实体
PORT
(bcd_data:
inSTD_LOGIC_VECTOR(3downto0);
segout:
outSTD_LOGIC_VECTOR(6downto0));
END;
ARCHITECTUREbehaviorOFbcd_dataIS--定义结构体
BEGIN
process(bcd_data)--进程语句,定义敏感信号
BEGIN
casebcd_datais--七段译码管的实现
when"0000"=>segout<="1111110";
when"0001"=>segout<="0110000";
when"0010"=>segout<="1101101";
when"0011"=>segout<="1111001";
when"0100"=>segout<="0110011";
when"0101"=>segout<="1011011";
when"0110"=>segout<="1011111";
when"0111"=>segout<="1110000";
when"1000"=>segout<="1111111";
when"1001"=>segout<="1111011";
whenothers=>null;
ENDCASE;--结束循环
ENDPROCESS;--结束进程
END;--结构体结束语句
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_unsigned.ALL;--打开IEEE库包
ENTITYdtsmIS--定义实体
PORT(clk:
inSTD_LOGIC;
NumA,NumB:
inSTD_LOGIC_VECTOR(3downto0);
segout1:
outSTD_LOGIC_VECTOR(6downto0);
led_sel:
outSTD_LOGIC_VECTOR(2downto0));--选择控制端的定义--七段码管扫描驱动
ENDdtsm;--实体结束语句
architecturebhvofdtsmis--定义结构体
componentbcd_datais--为bcd_data定义端口
port(bcd_data:
inSTD_LOGIC_VECTOR(3downto0);
segout:
outSTD_LOGIC_VECTOR(6downto0));
endcomponent;
signalx:
STD_LOGIC_VECTOR(3downto0);--定义信号
signalQ:
STD_LOGIC;
begin
p1:
process(clk)--p1进程语句描述开始
begin
ifclk'eventandclk='1'then--上升沿来临时:
ifQ='1'THENQ<='0';
ELSEQ<='1';
ENDIF;
endif;
endprocess;--p1进程结束
p2:
process(Q)--p2进程语句描述开始
begin
caseQis
when'0'=>led_sel<="010";x<=NumB;
when'1'=>led_sel<="001";x<=NumA;
whenothers=>null;
endcase;
endprocess;--p1进程结束
u1:
bcd_dataPORTmap(bcd_data=>x,segout=>segout1);
end;--p1进程结束
对上述程序进行完编译仿真后,得到其源元件,如上图所示
将上述各个源文件写完后,各自生成元件,在电路模拟区内连接电路。附上输出端和输入端后,其电路如下图所示:
其中电路仿真过程中,管脚对应表如下所示:
信号名称
对应FPGA管脚名
说明
50MHz
L1
基准时钟
A
G6
七段数码管a
B
G7
七段数码管b
C
H3
七段数码管c
D
H4
七段数码管d
E
H5
七段数码管e
F
H6
七段数码管f
G
J4
七段数码管g
SEL0
G5
数码管选择控制端0
SEL1
G3
数码管选择控制端1
SEL2
F4
数码管选择控制端2
R1
D3
主干道红灯
Y1
D4
主干道黄灯
G1
D5
主干道绿灯
R2
E3
支道红灯
Y2
E4
支道黄灯
G2
F3
支道绿灯
K1
E15
主干道通车请求开关
K2
B14
支道通车请求开关
【分析与讨论】
本次实验所用的编译环境是由Altera公司推出的新一代可编译逻辑器件开发系统Quartus
。初次使用这种软件,对这种编译环境很是陌生,不过通过慢慢练习,我学会了使用这个软件并能初步掌握了VHDL语言。
交通信号灯的设计这个实验原理看似很简单,但是实现过程却很复杂。首先,要我实验过程分成几个模块来分步实现,其中分频器的选择非常重要,不止需要选1Hz的分频器,还需要高于512Hz的分频器,因为输出系统的信号频率至少得高于512Hz,这样信号双端输出,这样就可以比较正确的得到交替变换的模拟交通灯信号与计时信号。
本次试验也有很多需要注意的问题。首先是程序问题,不管是写程序还是对程序的仿真,对于我这个以前从来没有接触过VHDL语言的人来说都很困难,程序是严谨的,不容许一点点的差错,不过熟练之后就好多了。VHDL程序都有其一定的板块和结构,只要按照这个板块走,就可以正确的写出程序。再就是Quartus
的使用问题,Quartus
使用起来比较繁琐,步骤很多,一不小心掉下一步就会出问题,需要对以严谨的态度。
【实习心得】
本次实习对我来说是大学中实习中具挑战性较有趣的一次实习。程序的不熟悉是整个过程的难点,然而掌握了理论知识并不代表实验操作的成功,在设计过程中仍会遇到很多困难,比如Quartus
软件的熟练使用等。在设计中我充分体会到了理论知识与实践相结合的难处,同时也激发了我挑战的兴趣。通过本次实习加强了我们自己动手思考解决问题的能力。
【参考文献】
(1)、邓元庆、贾鹏数字电路与系统设计2008西安电子科技大学出版社;
(2)、李哲英、骆丽数字集成电路设计2007机械工业出版社;
(3)、刘润华、任旭虎电子技术实验与课程设计2005石油大学出版社;
(4)、于云华、刘润华数字电子技术基础2008中国石油大学出版社;
(5)、沈明山EDA技术及可编程器件应用实训2004科学出版社;