北邮数字电路实验报告交通灯控制器VHDL最全的.docx
《北邮数字电路实验报告交通灯控制器VHDL最全的.docx》由会员分享,可在线阅读,更多相关《北邮数字电路实验报告交通灯控制器VHDL最全的.docx(35页珍藏版)》请在冰点文库上搜索。
北邮数字电路实验报告交通灯控制器VHDL最全的
课题三:
交通灯控制器
学院:
信息与通信工程学院
专业:
通信工程
*******
学号:
********
课题三:
交通灯控制器
一.设计课题的任务要求
(一)、实验目的
1.熟练掌握VHDL语言和QuartusII软件的使用;
2.理解状态机的工作原理和设计方法;
3.掌握利用EDA工具进行自顶向下的电子系统设计方法;
(二)、相关知识
本实验要利用CPLD设计实现一个十字路口的交通灯控制系统,与其他控制系统一样,本系统划分为控制器和受控电路两部分。
控制器使整个系统按设定的工作方式交替指挥车辆及行人的通行,并接收受控部分的反馈信号,决定其状态转换方向及输出信号,控制整个系统的工作过程。
路口交通灯控制系统的有东西路和南北路交通灯R(红)、Y(黄)、G(绿)三色,所有灯均为高电平点亮。
设置20s的通行时间和5s转换时间的变模定时电路,用数码管显示剩余时间。
提供系统正常工作/复位和紧急情况两种工作模式。
(三)、实验任务
1.基本任务:
设计制作一个用于十字路口的交通灯控制器。
1).南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20秒、5秒和25秒;
2).当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行;
3).用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间;
2.提高要求:
1).增加左、右转弯显示控制功能;
2).紧急状况时增加声光警告功能;
3).自拟其它功能。
二.系统设计(包括设计思路、总体框图、分块设计)
(一)设计思路
利用有限状态机描绘出交通灯的状态转移图,并设置记录东西和南北路口可通行时间的全局变量count,共设置四个正常状态,状态间的转移以count的值作为判断条件。
对于两种特殊情况:
当复位信号reset为高电平时,则回到最初状态;当紧急输入信号emergency为高电平时,则转移到一特殊状态。
(二)总体框图
1.系统结构框图
2.模块划分方框图
3.控制模块流程图
4.状态转移图
(三)分块设计-------在VHDL设计中,采用自顶向下的设计思路。
1.顶层模块中,根据硬件设计,设置如下端口:
◆外部时钟信号:
CLK
◆紧急状态按键:
EMERGENCY
◆南北方向状态灯:
LIGHT1
◆东西方向状态灯:
LIGHT2
◆蜂鸣器控制:
BELL
◆数码管显示信号:
NUM
◆数码管共阴极控制:
CAT_TEMP
2.在底层中,把不同功能分模块设计。
◆主分频模块:
由于外部时钟信号CLK的频率为50MHz,而实际需要的内部计时时钟频率为1Hz,需要一个分频电路。
输入端口:
CLK外部时钟信号
输出端口:
CLK_OUT分频后信号
◆次分频模块:
由于主频对于数码管扫描来说频率过高,因而再进行一次分频
输入端口:
CLK外部时钟信号
输出端口:
CLK_OUT1分频后信号
◆计数器模块:
由于整个过程的显示周期为50秒,即50个状态,所以该模块为计数器模块,计数周期为50,输入为1Hz的外部时钟,并加入紧急信号和复位信号,当输入紧急信号,计数停止,当输入复位信号,计数置1.通过该计数器的计数输出信号来控制LIGHT模块和COUNTDOWN模块的状态。
输入端口:
CLK时钟信号,EMERGENCY紧急信号,RESET复位信号
输出端口:
COUNTER计数状态信号,BELL报警信号
◆数码管计数模块:
倒计时显示模块,通过输入的COUNTER和CLK来控制数码管共阴极和7段数码管数字显示控制。
输入接口:
CLK时钟信号,COUNT计数器信号
输出接口:
CAT_TEMP共阴极控制,NUMIN数字输出
◆显示模块:
接收数字信号,进行7位数码管显示译码输出。
输入接口:
NUMIN输入信号
输出接口:
NUM译码输出
◆信号灯控制模块:
使用状态机控制5个状态
输入接口:
COUNT计数器信号,EMERGENCY紧急状态控制,RESET复位信号
输出接口:
LIGHT1,LIGHT2信号灯输出
三.仿真波形及波形分析
仿真波形-------由于时钟为50MHz,故在仿真时为了波形图更易读,将分频器设为20分频
1.状态周期为1~50,在每个状态内,数码管共阴极进行扫描,且扫描同时数码管显示进行循环变化
2.周期状态,在1~20,21~25,26~45,46~50进行红绿灯显示变化
3.一整个周期状态1~50,在1~20,21~25,26~45,46~50进行红绿灯显示变化
4.多个周期循环
5.紧急状态和复位状态
四.源程序(注释)
●TRAFFICILGHT.vhd----主程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYTRAFFICLIGHTIS
PORT(
CLK,RESET,EMERGENCY:
INSTD_LOGIC;----输入时钟信号,复位信号,紧急信号
LIGHT1,LIGHT2:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);----输出东西南北向两个红信号
NUM:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);----输出7端数码管选通信号
CAT_TEMP:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);----输出7端数码管共阴极信号
BELL:
OUTSTD_LOGIC----输出警铃信号
);
ENDTRAFFICLIGHT;
ARCHITECTUREMAINOFTRAFFICLIGHTIS
SIGNALTEMPCLK:
STD_LOGIC;
SIGNALTEMPCLK2:
STD_LOGIC;
SIGNALTEMPCOUNT:
STD_LOGIC_VECTOR(5DOWNTO0);
SIGNALTEMPNUM:
STD_LOGIC_VECTOR(3DOWNTO0);
COMPONENTDIVIS----组合FREQUENCY模块,以下同
PORT(
CLK:
INSTD_LOGIC;
CLK_OUT:
OUTSTD_LOGIC
);
ENDCOMPONENT;
COMPONENTDIV2IS
PORT(
CLK:
INSTD_LOGIC;
CLK_OUT:
OUTSTD_LOGIC
);
ENDCOMPONENT;
COMPONENTCOUNTIS
PORT(
CLK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
EMERGENCY:
INSTD_LOGIC;
COUNTER:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
BELL:
OUTSTD_LOGIC
);
ENDCOMPONENT;
COMPONENTLIGHTIS
PORT(
EMERGENCY:
INSTD_LOGIC;
COUNT:
INSTD_LOGIC_VECTOR(5DOWNTO0);
LIGHT1,LIGHT2:
OUTSTD_LOGIC_VECTOR(2DOWNTO0)
);
ENDCOMPONENT;
COMPONENTSHUMAGUANIS
PORT(
COUNT:
INSTD_LOGIC_VECTOR(5DOWNTO0);
CLK:
INSTD_LOGIC;
NUMIN:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CAT_TEMP:
OUTSTD_LOGIC_VECTOR(5DOWNTO0)
);
ENDCOMPONENT;
COMPONENTSHOWIS
PORT(
NUM_IN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
NUM:
OUTSTD_LOGIC_VECTOR(6DOWNTO0)
);
ENDCOMPONENT;
BEGIN----将各个模块接口连接起来
U1:
DIVPORTMAP(CLK=>CLK,CLK_OUT=>TEMPCLK);
U2:
COUNTPORTMAP
(BELL=>BELL,CLK=>TEMPCLK,RESET=>RESET,EMERGENCY=>EMERGENCY,COUNTER=>TEMPCOUNT);
U3:
LIGHTPORTMAP
(EMERGENCY=>EMERGENCY,COUNT=>TEMPCOUNT,LIGHT1=>LIGHT1,LIGHT2=>LIGHT2);
U4:
SHUMAGUANPORTMAP
(CAT_TEMP=>CAT_TEMP,COUNT=>TEMPCOUNT,CLK=>CLK,NUMIN=>TEMPNUM);
U5:
SHOWPORTMAP(NUM_IN=>TEMPNUM,NUM=>NUM);
U6:
DIV2PORTMAP(CLK=>CLK,CLK_OUT=>TEMPCLK2);
ENDMAIN;
●DIV.vhd----分频器模块,1Hz
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDIVIS
PORT(
CLK:
INSTD_LOGIC;
CLK_OUT:
OUTSTD_LOGIC
);
ENDDIV;
ARCHITECTUREFREQOFDIVIS
SIGNALTEMP:
INTEGERRANGE0TO49999999;----设置分频49999999,则为1Hz
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IF(TEMP=4999999)THEN
TEMP<=0;
ELSE
TEMP<=TEMP+1;
ENDIF;
IFTEMP=49999999THEN
CLK_OUT<='1';
ELSECLK_OUT<='0';
ENDIF;
ENDIF;
ENDPROCESS;
END;
●DIV2.vhd----次分频器模块,50KHz
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDIV2IS
PORT(
CLK:
INSTD_LOGIC;
CLK_OUT:
OUTSTD_LOGIC
);
ENDDIV2;
ARCHITECTUREFREQOFDIV2IS
SIGNALTEMP:
INTEGERRANGE0TO4999;
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IF(TEMP=4999)THEN
TEMP<=0;
ELSE
TEMP<=TEMP+1;
ENDIF;
IFTEMP=4999THEN
CLK_OUT<='1';
ELSECLK_OUT<='0';
ENDIF;
ENDIF;
ENDPROCESS;
END;
●COUNT.vhd----计数器模块(主要控制模块),用外部时钟设置了50个状态的一个周期1~50
----由于该交通灯的状态为50种,数码管有50种显示状态
----完全通过控制计数器的停止和复位来控制闪灯和数码管
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYCOUNTIS
PORT(
CLK:
INSTD_LOGIC;----外部时钟输入
RESET:
INSTD_LOGIC;----复位信号输入
EMERGENCY:
INSTD_LOGIC;----紧急信号输入
COUNTER:
OUTSTD_LOGIC_VECTOR(5DOWNTO0):
="000001";----计数信号输出
BELL:
OUTSTD_LOGIC----警铃信号输出
);
ENDCOUNT;
ARCHITECTURECONOFCOUNTIS
SIGNALTEMPCOUNT:
INTEGERRANGE1TO50:
=1;----定义信号计数,初始状态为1
BEGIN
PROCESS(CLK,RESET,EMERGENCY)
BEGIN
IFCLK'EVENTANDCLK='1'THEN----外部时钟,1Hz
IFEMERGENCY='0'THEN----当不是紧急状态
BELL<='0';
IFRESET='1'THEN----复位状态
TEMPCOUNT<=1;----计数器回到初始状态1
ELSIFTEMPCOUNT=50THEN
TEMPCOUNT<=1;----计数器计数状态,加1
ELSETEMPCOUNT<=TEMPCOUNT+1;
ENDIF;
ELSIFEMERGENCY='1'THEN----当紧急信号为高电平,进入紧急状态
TEMPCOUNT<=TEMPCOUNT;----计数器停止计数
BELL<='1';----警铃为高电平
ENDIF;
ENDIF;
ENDPROCESS;
COUNTER<=CONV_STD_LOGIC_VECTOR(TEMPCOUNT,6);----内部信号转化为输出
ENDCON;
●LIGHT.vhd----交通灯显示信号
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYLIGHTIS
PORT(
EMERGENCY:
INSTD_LOGIC;----紧急信号输入,控制紧急状态
COUNT:
INSTD_LOGIC_VECTOR(5DOWNTO0);----计数器输入,控制其它正常状态
LIGHT1,LIGHT2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)----交通灯信号输出
);
ENDLIGHT;
ARCHITECTURELIGHTSHOWOFLIGHTIS
TYPESTATESIS----设置状态机,控制状态
(S0,S1,S2,S3,S4);
SIGNALSTATE:
STATES;
SIGNALTEMPCOUNT:
INTEGERRANGE1TO50;
BEGIN
P1:
PROCESS(COUNT,EMERGENCY)
BEGIN
TEMPCOUNT<=CONV_INTEGER(COUNT);----将二进制输入转化为十进制计数信号
IFEMERGENCY='1'THEN----EMERGENCY为高电平时为紧急状态
STATE<=S4;
ELSE
CASETEMPCOUNTIS----由计数器控制状态持续时间
WHEN1TO20=>STATE<=S0;----1秒到20秒
WHEN21TO25=>STATE<=S1;----21秒到25秒
WHEN26TO45=>STATE<=S2;----26秒到45秒
WHEN46TO50=>STATE<=S3;----46秒到50秒
ENDCASE;
ENDIF;
ENDPROCESSP1;
P2:
PROCESS(STATE)----状态机
BEGIN
CASESTATEIS
WHENS0=>LIGHT1<="0010";----南北绿灯
LIGHT2<="1001";----东西红灯,且禁止左转
WHENS1=>LIGHT1<="0100";----南北黄灯
LIGHT2<="1001";----东西红灯,且禁止左转
WHENS2=>LIGHT1<="1001";----南北红灯,且禁止左转
LIGHT2<="0010";----东西绿灯
WHENS3=>LIGHT1<="1001";----南北红灯,且禁止左转
LIGHT2<="0100";----东西黄灯
WHENS4=>LIGHT1<="1001";----南北红灯,且禁止左转
LIGHT2<="1001";----东西红灯,且禁止左转
ENDCASE;
ENDPROCESS;
ENDLIGHTSHOW;
●SHUMAGUAN.vhd----7段数码管倒计时控制模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYSHUMAGUANIS
PORT(
COUNT:
INSTD_LOGIC_VECTOR(5DOWNTO0);----计数器输入信号
CLK:
INSTD_LOGIC;----时钟信号
NUMIN:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);----输出7段数码管显示数字信号,输出到译码模块
CAT_TEMP:
OUTSTD_LOGIC_VECTOR(5DOWNTO0)----7端数码管共阴极输出控制信号
);
ENDSHUMAGUAN;
ARCHITECTURECOUNTEROFSHUMAGUANIS
SIGNALTEMP:
INTEGERRANGE0TO3;
SIGNALCOUNTER:
INTEGERRANGE1TO50;
SIGNALCAT:
STD_LOGIC_VECTOR(5DOWNTO0):
="011111";
SIGNALNUM_IN:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
P1:
PROCESS(CLK)----内部时钟,控制7段数码管显示扫描内容
BEGIN
COUNTER<=CONV_INTEGER(COUNT);
IF(CLK'EVENTANDCLK='1')THEN
IF(TEMP=3)THEN
TEMP<=0;
ELSE
TEMP<=TEMP+1;
ENDIF;
ENDIF;
ENDPROCESSP1;
P2:
PROCESS(COUNTER,TEMP)
BEGIN
COUNTER<=CONV_INTEGER(COUNT);
CASECOUNTERIS----通过计数器输入信号控制状态
WHEN1=>CASETEMPIS----在每个状态内部设置数码管扫描过程,由于COUNTER和----扫描时钟不同
----则可在数码管上同时显示4个数字,以状态1
----(COUNTER=1)为例
----显示“1924”,并在共阴极上扫描,以下同
----共标记50种状态
WHEN0=>NUM_IN<="0001";CAT<="011111";
WHEN1=>NUM_IN<="1001";CAT<="101111";
WHEN2=>NUM_IN<="0010";CAT<="111101";
WHEN3=>NUM_IN<="0100";CAT<="111110";
ENDCASE;
WHEN2=>CASETEMPIS
WHEN0=>NUM_IN<="0001";CAT<="011111";
WHEN1=>NUM_IN<="1000";CAT<="101111";
WHEN2=>NUM_IN<="0010";CAT<="111101";
WHEN3=>NUM_IN<="0011";CAT<="111110";
ENDCASE;
WHEN3=>CASETEMPIS
WHEN0=>NUM_IN<="0001";CAT<="011111";
WHEN1=>NUM_IN<="0111";CAT<="101111";
WHEN2=>NUM_IN<="0010";CAT<="111101";
WHEN3=>NUM_IN<="0010";CAT<="111110";
ENDCASE;
WHEN4=>CASETEMPIS
WHEN0=>NUM_IN<="0001";CAT<="011111";
WHEN1=>NUM_IN<="0110";CAT<="101111";
WHEN2=>NUM_IN<="0010";CAT<="111101";
WHEN3=>NUM_IN<="0001";CAT<="111110";
ENDCASE;
WHEN5=>CASETEMPIS
WHEN0=>NUM_IN<="0001";CAT<="011111";
WHEN1=>NUM_IN<="0101";CAT<="101111";
WHEN2=>NUM_IN<="0010";CAT<="111101";
WHEN3=>NUM_IN<="0000";CAT<="111110";
ENDCASE;
WHEN6=>CASETEMPIS
WHEN0=>NUM_IN<="0001";CAT<="011111";
WHEN1=>NUM_IN<="0100";CAT<="101111";
WHEN2=>NUM_IN<="0001";CAT<="111101";
WHEN3=>NUM_IN<="1001";CAT<="111110";
ENDCASE;
WHEN7=>CASETEMPIS
WHEN0=>NUM_IN<="0001";CAT<="011111";
WHEN1=>NUM_IN<="0011";CAT<="101111";
WHEN2=>NUM_IN<="0001";CAT<="111101";
WHEN3=>NUM_IN<="1000";CAT<="111110";
ENDCASE;
WHEN8=>CASETEMPIS
WHEN0=>NUM_IN<="0001";CAT<="011111";
WHEN1=>NUM_IN<="0010";CAT<="101111";
WHEN