EDA课设交通灯 报告终结版 2.docx
《EDA课设交通灯 报告终结版 2.docx》由会员分享,可在线阅读,更多相关《EDA课设交通灯 报告终结版 2.docx(21页珍藏版)》请在冰豆网上搜索。

EDA课设交通灯报告终结版2
设计题目:
交通灯
姓名:
学号:
专业:
班级:
同组:
指导教师:
日期:
2013-01-10
摘要
本课程设计侧重于逻辑电路设计同时采用VHDL硬件描述语言辅助完成对十字路口交通灯电路的功能仿真。
在设计过程中,重点探讨了交通灯控制系统的设计思路和功能模块的划分,对设计过程中出现的问题详细进行。
系统主要由四个模块组成:
时钟分频模块、交通灯控制及计时模块、扫描显示译码模块。
关键词:
交通灯功能模块VHDL语言
Abstract
thecourseisdesignedtofocusonthelogiccircuitdesignatthesametimeusingVHDLhardwaredescriptionlanguageauxiliarycompletetheintersectiontrafficlightcircuitsimulationfunction.Inthedesignprocess,andprobesintothetrafficlightcontrolsystemdesignandfunctionmodule,thedesignprocessfortheproblemsindetailed.Thesystemmainlyconsistsoffourmodules:
clockfrequencydivisionmodule,thetrafficlightcontrolandtimingmodule,scanningdisplaydecodingmodule.
Keywords:
trafficlightfunctionmoduleVHDLlanguage
1.方案分析与对比
§1.1方案分析
通过分析可以知道,所要设计的交通信号灯控制电路要能够适用于由一条主干道和一条支干道的汇合点形成的十字交叉路口。
能够做到主、支干道的红绿灯闪亮的时间不完全相同,在绿灯跳变红灯的过程中能够用黄灯进行过渡,使得行驶过程中的车辆有足够的时间停下来。
还要求在主、支干道各设立一组计时显示器,能够显示相应的红、黄、绿倒计时。
可以利用VHDL语言合理设计系统功能,使红黄绿灯的转换有一个准确的时间间隔和转换顺序。
§1.2方案对比
实现路口交通灯系统的控制方法很多,可以用标准逻辑器件、可编程序控制器和单片机等方案来实现。
若用单片机方案来实现的话,模型可以由电源电路、单片机主控电路、无线收发控制电路和显示电路四部分组成。
在电源电路中,需要用到+5V的直流稳压电源,无线收发控制电路和显示电路应由编码芯片和数据发射模块两部分组成,主控电路的主要元件为AT89C51。
硬件设计完成后还要利用计算机软件经行软件部分的设计才能够实现相应的功能。
虽然利用单片机系统设计的交通灯控制器相对来说较稳定,能够完成较多功能的实现,但这些控制方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了功能修改及系统设计与调试的困难。
相反,使用基于FPGA的设计方法具有周期短,设计灵活,易于修改等明显的的优点。
而且,随着FPGA器件、设计语言和电子设计自动化工具的发展和改进,越来越多的电子系统采用FPGA来设计。
未来,使用FPGA器件设计的产品将出现在各个领域里。
因此,此次的交通信号灯控制器的设计将采用基于FPGA的设计方案来实现所要求的功能。
2.整体设计论述
根据设计要求和系统所具有的功能,并参考相关的文献资料,经行方案设计,可以画出如下图所示的交通信号灯控制器的系统框图。
50MHz
50MHz1HZ
支干道车辆检测
50MHz数码管及LED信号
系统的状态图如下所示
根据以上设计思路,可以得到如下的顶层文件原理图
顶层文件的实体图:
3.单元模块设计与仿真
§3.1时钟分频模块
系统的动态扫描需要50MHz的脉冲,而系统时钟计时模块需要1HZ的脉冲。
分频模块主要为系统提供所需的时钟计时脉冲。
该模块将50MHz的脉冲信号进行分频,产生1S的方波,作为系统时钟计时信号。
其实体模块如下:
仿真波形如下:
可以看到能够得到1s的时钟脉冲
§3.2交通灯控制及计时模块
控制模块根据外部输入信号和计时模块产生的输出信号,产生系统的状态机,控制其他部分协调工作。
计时模块用来设定主干道和支干道计时器的初值,并为扫描显示译码模块提供倒计时时间。
控制及计时模块采用状态机进行设计,可以定义出8种状态,分别为S1:
主干道红灯,支干道绿灯;S2:
主干道红灯,支干道黄灯;S3:
主干道红灯,支干道左转;S4:
主干道红灯,支干道黄灯;S5:
主干道绿灯,支干道红灯;S6:
主干道黄灯,支干道红灯;S7:
主干道左转,支干道红灯;S8:
主干道黄灯,支干道红灯。
利用CASE语句定义状态的转换方式及时间的变换方式,达到主干道绿灯亮60秒,支干道绿灯亮50秒,黄灯亮5秒的设计要求。
其实体模块如下:
CAR为支干道车辆检测开关
在支干道有车的情况下,模块可以进行减计时
CLK1S为1S的时钟脉冲
TIME1H、TIME1L、TIME2H、TIME2L分别为主干道时钟高位、主干道时钟低位、支干道时钟高位、支干道时钟低位
LED为LED灯发光情况,分别为主干道绿灯、主干道黄灯、主干道红灯、支干道绿灯、主干道黄灯、主干道红灯
Count的总的系统时间,用来改变系统的状态
仿真波形如下:
通过仿真可以看到:
1)当主干道红灯,支干道绿灯时,主干道倒计时高位置数0110,低位置数0000;支干道绿灯倒计时高位置数0100,低位置数0000;
2)当主干道红灯,支干道黄灯时,主干道继续刚才的减计数,支干道黄灯倒计时高位置数0000,低位置数0101;
3)当主干道红灯,支干道左转时,主干道继续刚才的减计数,支干道左转倒计时高位置数0001,低位置数0000;
4)当主干道红灯,支干道黄灯时,主干道继续刚才的减计数,支干道黄灯倒计时高位置数0000,低位置数0101;
5)当主干道绿灯,支干道红灯时,支干道继续刚才的减计数,主干道绿灯倒计时高位置数0100,低位置数0101;
6)当主干道黄灯,支干道红灯时,支干道继续刚才的减计数,主干道黄灯倒计时高位置数0000,低位置数0101;
7)当主干道左转,支干道红灯时,支干道继续刚才的减计数;主干道左转倒计时高位置数0001,低位置数0101;
8)当主干道黄灯,支干道红灯时,支干道继续刚才的减计数;主干道黄灯倒计时高位置数0000,低位置数0101;
在S8状态结束后,自动跳回到S1状态,继续判断支干道是否有车行驶,若有车行驶,则跳转到S2状态,给高、低位置数,继续进行减计时。
系统根据COUNT的变化自动在各状态下跳变,当count为40时,跳变到S2状态;当count为45时,跳变到S3状态;当count为55时,跳变到S4状态;;当count为55时,跳变到S4状态;当count为55时,跳变到S4状态;当count为60时,跳变到S5状态;当count为105时,跳变到S6状态;当count为110时,跳变到S7状态;当count为125时,跳变到S8状态;当count为130时,若支干道没有车跳变到S1状态,有车则跳变到S2状态。
§3.3扫描显示译码模块
扫描显示译码模块可以根据控制信号,驱动交通信号灯以及倒计时数码管的显示,其中数码管的显示采用动态扫描显示。
其实体模块如下:
CLK为1KHZ的系统时钟脉冲
CLK1S为1S时钟脉冲
CAR为支干道车辆检测开关
SEL为数码管位码扫描
SEG为数码管段码
TIME1H、TIME1L、TIME2H、TIME2L为数码管计时的时间,由控制及计时模块为其赋值
仿真波形如下:
通过仿真可以看到:
给CLK一个时钟脉冲,数码管的位码随CLK时钟的变化而进行扫描,由于CLK的频率较高,人的眼睛会有短暂的视觉停留,所以会看到4个数码管都在显示时间。
§3.4顶层文件的编写
将以上各个单元模块仿真成功后,再进行顶层文件的编写。
将各个单元模块的变量赋值给顶层文件,从而将各个单元模块连接起来,统一调配。
得到顶层文件的实体模块:
CLK为1KHZ系统时钟脉冲
CAR为支干道车辆行驶情况,高电平为有车行驶,低电平为无车行驶
LED为交通灯发光情况
SEL为数码管位码扫描
SEG为数码管段码
仿真波形如下:
仿真后可以得到最终的结果:
开始时,支干道没有车辆行驶。
主干道处于常通行状态,支干道处于禁止状态;当支干道有车来时,主干道亮红灯,经行60秒倒计时,支干道先亮绿灯,经行40秒倒计时,接着分别亮黄灯5秒倒计时、左转灯10秒倒计时、黄灯5秒倒计时,
主干道60秒倒计时结束后跳变到绿灯,进行45秒倒计时,支干道亮红灯,进行70秒倒计时;
主干道45秒倒计时结束后跳变到黄灯,经行5秒倒计时,支干道继续亮红灯;
主干道5秒倒计时结束后跳变到左转灯,进行15秒倒计时,支干道继续亮红灯;进行倒计时;
主干道5秒倒计时结束后跳变到黄灯,进行5秒倒计时,支干道继续亮红灯;进行倒计时;
主干道5秒倒计时结束后,判断支干道是否有车,若有车跳变到S2状态,没有车跳变到S1状态
4.收获和体会
5.参考文献
【1】EDA技术与VHDL及应用大学华中科技出版社杨志方王广君
【2】EDA技术与VHDL清华大学出版社潘松黄继业
【3】数字电路EDA入门---VHDL程序实例集北京邮电大学出版社张亦华
【4】VHDL应用与开发实践科学出版社甘历
六.程序代码
(1)时钟分频模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfpIS
PORT(clk:
INSTD_LOGIC;
CLK1S:
OUTSTD_LOGIC);
ENDENTITYfp;
ARCHITECTUREoneOFfpIS
SIGNALN:
STD_LOGIC_VECTOR(24DOWNTO0);--50MHz分频成1Hz,计数常数为25000000
SIGNALCLK_M:
STD_LOGIC:
='0';
BEGIN
PROCESS(clk)--占空比为50%
BEGIN
IF(clk'EVENTANDclk='1')THEN
IFN="1011111010111100000111111"THEN
N<=(OTHERS=>'0');
CLK_M<=NOTCLK_M;
ELSE
N<=N+1;
ENDIF;
ENDIF;
ENDPROCESS;
CLK1S<=CLK_M;
ENDone;
(2)交通灯控制及计时模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYkzIS
PORT(CLK1S,car:
INSTD_LOGIC;--1S脉冲,支干道车辆检测
TIME1H,TIME1L:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--主干道计时
TIME2H,TIME2L:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--支干道计时
count:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--系统总计时
LED:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));--交通灯显示
ENDkz;
ARCHITECTUREoneOFkzIS
TYPEstatesIS(S1,S2,S3,S4,S5,S6,S7,S8);--状态初始化
SIGNALcurrent_state,next_state:
states;
SIGNALc:
STD_LOGIC_VECTOR(6DOWNTO0);
BEGIN
REG:
PROCESS(CLK1S,car,current_state,c)
BEGIN
IFCLK1S'EVENTANDCLK1S='1'THEN--支干道有车开始计数
c<=c+1;
current_state<=next_state;
ENDIF;
CASEcurrent_stateIS--状态转换
WHENS1=>LED<="10000100";--主干道红灯,支干道绿灯
IFc="00101000"THENnext_state<=S2;
ELSEnext_state<=S1;
ENDIF;
WHENS2=>LED<="10000010";--主干道红灯,支干道黄灯
IFc="00101101"THENnext_state<=S3;
ELSEnext_state<=S2;
ENDIF;
WHENS3=>LED<="10000001";--主干道红灯,支干道左转
IFc="00110111"THENnext_state<=S4;
ELSEnext_state<=S3;
ENDIF;
WHENS4=>LED<="10000010";--主干道红灯,支干道黄灯
IFc="00111100"THENnext_state<=S5;
ELSEnext_state<=S4;
ENDIF;
WHENS5=>LED<="01001000";--主干道绿灯,支干道红灯
IFc="01101001"THENnext_state<=S6;
ELSEnext_state<=S5;
ENDIF;
WHENS6=>LED<="00101000";--主干道黄灯,支干道红灯
IFc="01101110"THENnext_state<=S7;
ELSEnext_state<=S6;
ENDIF;
WHENS7=>LED<="00011000";--主干道左转,支干道红灯
IFc="01111101"THENnext_state<=S8;
ELSEnext_state<=S7;
ENDIF;
WHENS8=>LED<="00101000";--主干道黄灯,支干道红灯
IFc="10000010"THENnext_state<=S1;
ELSEnext_state<=S8;
ENDIF;
WHENOTHERS=>LED<="10000100";next_state<=S1;
ENDCASE;
IFc="00101000"THENTIME2H<="0000";TIME2L<="0101";--系统时间为40秒,支干道黄灯计时5秒
ENDIF;
IFc="00101101"THENTIME2H<="0001";TIME2L<="0000";--系统时间为45秒,支干道左转计时10秒
ENDIF;
IFc="00110111"THENTIME2H<="0000";TIME2L<="0101";--系统时间为55秒,支干道黄灯计时5秒
ENDIF;
IFc="00111100"THENTIME1H<="0100";TIME1L<="0101";TIME2H<="0111";TIME2L<="0000";--系统时间为60秒
ENDIF;
IFc="01101001"THENTIME1H<="0100";TIME1L<="0101";--系统时间为105秒,主干道黄灯计时5秒
ENDIF;
IFc="01101110"THENTIME1H<="0001";TIME1L<="0101";--系统时间为110秒,主干道左转计时15秒
ENDIF;
IFc="01111101"THENTIME1H<="0000";TIME1L<="0101";--系统时间为125秒,主干道黄灯计时5秒
ENDIF;
IFc="10000010"THENTIME1H<="0110";TIME1L<="0000";TIME2H<="0101";TIME2L<="0000";--系统时间为130秒,支干道计时50秒
ENDIF;
IFc="10000010"THENc<="00000000";--系统时间清零
ENDIF;
ENDPROCESSREG;
count<=c;
ENDone;
(3)扫描显示译码模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYxsIS
PORT(clk,CLK1S,car:
INSTD_LOGIC;
TIME1H,TIME1L:
INSTD_LOGIC_VECTOR(3DOWNTO0);--主干道置数
TIME2H,TIME2L:
INSTD_LOGIC_VECTOR(3DOWNTO0);--支干道置数
count:
INSTD_LOGIC_VECTOR(6DOWNTO0);--计数信号
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);--数码管位码
seg:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));--数码管段码
ENDENTITYxs;
ARCHITECTUREoneOFxsIS
SIGNALnum:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALnumsel:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALnumseg:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALQ1,Q2,Q3,Q4:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
SM:
PROCESS(clk,num,numsel)--扫描
BEGIN
IFclk'EVENTANDclk='1'THENnumsel<=numsel+1;
IFnumsel="011"THENnumsel<="000";
ENDIF;
ENDIF;
ENDPROCESSSM;
WX:
PROCESS(numsel,Q1,Q2,Q3,Q4)--位选
BEGIN
CASEnumselIS
WHEN"000"=>num<=Q4;
WHEN"001"=>num<=Q3;
WHEN"010"=>num<=Q2;
WHEN"011"=>num<=Q1;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSWX;
ZS:
PROCESS(CLK1S,car,Q1,Q2,Q3,Q4,num,TIME1H,TIME1L,TIME2H,TIME2L)--数码管置数
BEGIN
IFcar='1'THEN
IFCLK1S'EVENTANDCLK1S='1'THEN
IFQ2>"0000"THENQ2<=Q2-1;
ELSE
IFQ1>"0000"THENQ1<=Q1-1;Q2<="1001";--减计时
ENDIF;
ENDIF;
IFQ4>"0000"THENQ4<=Q4-1;
ELSE
IFQ3>"0000"THENQ3<=Q3-1;Q4<="1001";
ENDIF;
ENDIF;
ENDIF;
IFQ1="0000"ANDQ2="0000"THEN
Q1<=TIME1H;Q2<=TIME1L;
ENDIF;
IFQ3="0000"ANDQ4="0000"THEN
Q3<=TIME2H;Q4<=TIME2L;
ENDIF;
ELSEQ1<=TIME1H;Q2<=TIME1L;--支路无车辆不减计时
Q3<=TIME2H;Q4<=TIME2L;
ENDIF;
ENDPROCESSZS;
YM:
PROCESS(num,numseg)--译码
BEGIN
CASEnumIS
WHEN"0000"=>numseg<="1111110";
WHEN"0001"=>numseg<="0110000";
WHEN"0010"=>numseg<="1101101";
WHEN"0011"=>numseg<="1111001";
WHEN"0100"=>numseg<="0110011";
WHEN"0101"=>numseg<="1011011";
WHEN"0110"=>numseg<="1011111";
WHEN"0111"=>numseg<="1110000";
WHEN"1000"=>numseg<="1111111";
WHEN"1001"=>numseg<="1111011";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSYM;
sel<=numsel;
seg<=numseg;
ENDARCHITECTUREone;
(4)顶层文件:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYdcIS
PORT(clk:
INSTD_LOGIC;--动态扫描时钟
car:
INSTD_LOGIC;--支路车辆传感信号
LED:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--交通灯信号
sel:
OUTSTD_LOGIC_VECTOR(2downto0);--数码管位码
seg:
OUTSTD_LOGIC_VECTOR(6downto0));--数码管段码
ENDENTITYdc;
ARCHITECTUREoneOFdcIS
COMPONENTfp--分频
PORT(clk:
INSTD_LOGIC;
CLK1S:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTkz
PORT(