《数字电路-交通灯控制器-实验报告(共17页).doc》由会员分享,可在线阅读,更多相关《数字电路-交通灯控制器-实验报告(共17页).doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上课题1.4.2:交通灯控制器一设计课题的任务要求:(一)、实验目的1. 熟练掌握 VHDL 语言和QuartusII 软件的使用;2. 理解状态机的工作原理和设计方法;(二)、相关知识本实验要利用 CPLD 设计实现一个十字路口的交通灯控制系统,与其他控制系统一样,本系统划分为控制器和受控电路两部分。控制器使整个系统按设定的工作方式交替指挥车辆及行人的通行,并接收受控部分的反馈信号,决定其状态转换方向及输出信号,控制整个系统的工作过程。路口交通灯控制系统的有东西路和南北路交通灯 R(红)、Y(黄)、G(绿)三色,所有灯均为高电平点亮。设置20s 的通行时间和5s 转换
2、时间的变模定时电路,用数码管显示剩余时间。提供系统正常工作/复位和紧急情况两种工作模式。(三)、实验任务1.基本任务:设计制作一个用于十字路口的交通灯控制器。1). 南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20 秒、5 秒和25 秒;2). 当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行;3). 用数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间;二系统设计(包括设计思路、总体框图、分块设计)(一)设计思路1.总体设计-输入部分:1) CLK时钟频率输入,可由实验板上直接提供
3、,为准确确定时间长度,选择1024Hz信号。2) 紧急状态按键拨码开关EMERGENCY,当将其置为高电平,表示紧急情况发生,两个方向均为红灯亮,计时停止;当置其为低电平,信号灯和计时器恢复原来状态,正常工作。3) 复位拨码开关RESET,当将其置为高电平,表示复位,工作停止,全部回到初始状态;当置其为低电平,重新开始工作。2.总体设计-输出部分:1) 东西方向和南北方向各使用3个LED显示,LIGHT1,LIGHT2,红黄绿各代表红黄绿灯。2) 东西方向和南北方向计时均为2位数,共需要4个LED七段数码管显示。(二)总体框图1.输入输出示意图 Light1Clk Light2Emergenc
4、y NumReset B_out东西向交通灯南北向交通灯数码管显示输出控制数码管显示时钟(1024hz)开关1开关22.模块示意图译码器时钟时间计数器东西灯南北灯控制器分频器复位倒计时显示紧急请求3.流程图Yes南北绿,东西红是否绿灯时间到20s?对黄灯开始计时南北黄,东西红是否黄灯时间到5s?对绿灯开始计时南北红,东西绿是否绿灯时间到20s?对黄灯开始计时南北红,东西黄是否黄灯时间到5s?对绿灯开始计时YesyesyesNOnoNOno启动/复位4.RTL图5.状态显示红绿灯显示状态状态S0南北绿灯亮,东西红灯亮S1南北黄灯亮,东西红灯亮S2南北红灯亮,东西绿灯亮S3南北红灯亮,东西黄灯亮S
5、4南北东西红灯都亮(三)分块设计 -在VHDL设计中,采用自顶向下的设计思路。1.顶层模块中,根据硬件设计,设置如下端口:u 外部时钟信号:CLKu 紧急状态按键:EMERGENCYu 南北方向状态灯:LIGHT1u 东西方向状态灯:LIGHT2u 数码管显示信号:NUMu 控制数码管:B_OUT2.在底层中,把不同功能分模块设计。u FREQUENCY模块,由于外部时钟信号CLK的频率为1024Hz,而实际需要的内部计时时钟频率为1Hz,需要一个分频电路。输入端口:CLK外部时钟信号输出端口:CLK_OUT分频后信号u COUNTER模块,由于整个过程的显示周期为50秒,即50个状态,所以该
6、模块为计数器模块,计数周期为50,输入为1Hz的外部时钟,并加入紧急信号和复位信号,当输入紧急信号,计数停止,当输入复位信号,计数置1.通过该计数器的计数输出信号来控制LIGHT模块和COUNTDOWN模块的状态。输入端口:CLK时钟信号,EMERGENCY紧急信号,RESET复位信号输出端口:COUNTER计数状态信号u COUNTDOWN模块,倒计时显示模块,通过输入的COUNTER和CLK来控制数码管共阴极和7段数码管数字显示控制。输入接口:CLK时钟信号,COUNT计数器信号输出接口:CAT_TEMP共阴极控制,NUMIN数字输出u bian_ma_6模块:将输入接口的CAT_TEMP
7、共阴极控制转换为三八 译码器的输入端。输入端口:CAT_TEMP共阴极控制输出端口:b_out;u SHOW模块,接收数字信号,进行7位数码管显示译码输出。输入接口:NUMIN输入信号输出接口:NUM译码输出u LIGHT信号灯控制模块,使用状态机,双进程控制5个状态输入接口:COUNT计数器信号,EMERGENCY紧急状态控制输出接口:LIGHT1,LIGHT2信号灯输出三仿真波形及波形分析仿真波形1状态周期为150,在每个状态内,数码管共阴极进行扫描,且扫描同时数码管显示进行循环变化2周期状态,在120,2125,2645,4650进行红绿灯显示变化3.一整个周期状态150,在120,21
8、25,2645,4650进行红绿灯显示变化4.多个周期循环5.紧急状态和复位状态四源程序(注释)l FREQUENCY-分频模块:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY FREQUENCY ISPORT(CLK:IN STD_LOGIC;CLK_OUT:OUT STD_LOGIC);END FREQUENCY;ARCHITECTURE FREQ OF FREQUENCY ISSIGNAL TEMP:INTEGER RANGE 0 TO 1023;-设置分频1023,则为1Hz
9、BEGINPROCESS(CLK)BEGINIF(CLKEVENT AND CLK=1)THENIF(TEMP=1023)THENTEMP=0;ELSETEMP=TEMP+1;END IF;IF TEMP1023 THEN CLK_OUT=0; ELSE CLK_OUT=1; END IF; END IF;END PROCESS;END;l COUNTER.vhd-计数器模块(主要控制模块),用外部时钟设置了50个状态的一个周期150 -由于该交通灯的状态为50种,数码管有50种显示状态 -完全通过控制计数器的停止和复位来控制闪灯和数码管LIBRARY IEEE;USE IEEE.STD_LO
10、GIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY COUNTER ISPORT(CLK:IN STD_LOGIC;-外部时钟输入RESET:IN STD_LOGIC;-复位信号输入EMERGENCY:IN STD_LOGIC;-紧急信号输入COUNTER:OUT STD_LOGIC_VECTOR (5 DOWNTO 0):=-计数信号输出);END COUNTER;ARCHITECTURE CON OF COUNTER ISSIGNAL TEMPCOUNT:INTEGER RANGE
11、 1 TO 50:=1;-定义信号计数,初始状态为1BEGINPROCESS(CLK,RESET,EMERGENCY)BEGIN IF CLKEVENT AND CLK=1 THEN-外部时钟,1Hz IF RESET=1 THEN-复位状态 TEMPCOUNT=1;-计数器回到初始状态1 ELSIF TEMPCOUNT=50 THEN TEMPCOUNT=1;-计数器计数状态,加1 ELSE TEMPCOUNT=TEMPCOUNT+1; END IF; ELSIF EMERGENCY=1 THEN-当紧急信号为高电平,进入紧急状态 TEMPCOUNT=TEMPCOUNT;-计数器停止计数 E
12、ND IF; END PROCESS;COUNTER=CONV_STD_LOGIC_VECTOR(TEMPCOUNT,6);-内部信号转化为输出END CON;l LIGHT.vhd-交通灯显示信号LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY LIGHT IS PORT( EMERGENCY:IN STD_LOGIC;-紧急信号输入,控制紧急状态 COUNT:IN STD_LOGIC_VECTOR(5 DOWNTO 0);-
13、计数器输入,控制其它正常状态 LIGHT1,LIGHT2:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)-交通灯信号输出 );END LIGHT;ARCHITECTURE LIGHTSHOW OF LIGHT ISTYPE STATES IS-设置状态机,控制状态(S0,S1,S2,S3,S4);SIGNAL STATE:STATES;SIGNAL TEMPCOUNT:INTEGER RANGE 1 TO 50;BEGINP1:PROCESS(COUNT,EMERGENCY)BEGINTEMPCOUNT=CONV_INTEGER(COUNT);-将二进制输入转化为十进制计数信
14、号 IF EMERGENCY=1 THEN-EMERGENCY为高电平时为紧急状态 STATE STATE STATE STATE STATELIGHT1=001;-南北绿灯 LIGHT2LIGHT1=010;-南北黄灯 LIGHT2LIGHT1=100;-南北红灯 LIGHT2LIGHT1=100;-南北红灯 LIGHT2LIGHT1=100;-南北红灯 LIGHT2=100;-东西红灯 END CASE;END PROCESS;END LIGHTSHOW;l COUNTDOWN.vhd-7段数码管倒计时控制模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL
15、;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY COUNTDOWN IS PORT( COUNT:IN STD_LOGIC_VECTOR(5 DOWNTO 0);-计数器输入信号 CLK:IN STD_LOGIC;-时钟信号 NUMIN:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);-输出7段数码管显示数字信号,输出到译码模块 CAT_TEMP:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);-7端数码管共阴极输出控制信号END COUNTDOWN;ARCHITECT
16、URE COUNTSHOW OF COUNTDOWN ISSIGNAL TEMP:INTEGER RANGE 0 TO 3;SIGNAL COUNTER:INTEGER RANGE 1 TO 50;SIGNAL CAT:STD_LOGIC_VECTOR(5 DOWNTO 0):=;SIGNAL NUM_IN:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINP1:PROCESS(CLK)-内部时钟,控制7段数码管显示扫描内容BEGIN COUNTER=CONV_INTEGER(COUNT);IF(CLKEVENT AND CLK=1)THENIF(TEMP=3)THENTEM
17、P=0;ELSETEMP=TEMP+1;END IF;END IF;END PROCESS P1;P2:PROCESS(COUNTER,TEMP) BEGIN COUNTERCASE TEMP IS-在每个状态内部设置数码管扫描过程,由于COUNTER和-扫描时钟不同 -则可在数码管上同时显示4个数字,以状态1-(COUNTER=1)为例 -显示“1924”,并在共阴极上扫描,以下同 -共标记50种状态 WHEN 0=NUM_IN=0001;CATNUM_IN=1001;CATNUM_IN=0010;CATNUM_IN=0100;CATCASE TEMP IS WHEN 0=NUM_IN=00
18、01;CATNUM_IN=1000;CATNUM_IN=0010;CATNUM_IN=0011;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0111;CATNUM_IN=0010;CATNUM_IN=0010;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0110;CATNUM_IN=0010;CATNUM_IN=0001;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0101;CATNUM_IN=0010;CATNUM_IN=0000;CATCASE TEMP
19、 IS WHEN 0=NUM_IN=0001;CATNUM_IN=0100;CATNUM_IN=0001;CATNUM_IN=1001;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0011;CATNUM_IN=0001;CATNUM_IN=1000;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0010;CATNUM_IN=0001;CATNUM_IN=0111;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0001;CATNUM_IN=0001;CATNUM_
20、IN=0110;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0000;CATNUM_IN=0001;CATNUM_IN=0101;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=1001;CATNUM_IN=0001;CATNUM_IN=0100;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=1000;CATNUM_IN=0001;CATNUM_IN=0011;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0111;CA
21、TNUM_IN=0001;CATNUM_IN=0010;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0110;CATNUM_IN=0001;CATNUM_IN=0001;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0101;CATNUM_IN=0001;CATNUM_IN=0000;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0100;CATNUM_IN=0000;CATNUM_IN=1001;CATCASE TEMP IS WHEN 0=NUM_IN=00
22、00;CATNUM_IN=0011;CATNUM_IN=0000;CATNUM_IN=1000;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0010;CATNUM_IN=0000;CATNUM_IN=0111;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0001;CATNUM_IN=0000;CATNUM_IN=0110;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0000;CATNUM_IN=0000;CATNUM_IN=0101;CATCASE TEMP
23、 IS WHEN 0=NUM_IN=0000;CATNUM_IN=0100;CATNUM_IN=0000;CATNUM_IN=0100;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0011;CATNUM_IN=0000;CATNUM_IN=0011;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0010;CATNUM_IN=0000;CATNUM_IN=0010;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0001;CATNUM_IN=0000;CATNUM_
24、IN=0001;CATCASE TEMP IS WHEN 0=NUM_IN=0000;CATNUM_IN=0000;CATNUM_IN=0000;CATNUM_IN=0000;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=1001;CATNUM_IN=0010;CATNUM_IN=0100;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=1000;CATNUM_IN=0010;CATNUM_IN=0011;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0111;CA
25、TNUM_IN=0010;CATNUM_IN=0010;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0110;CATNUM_IN=0010;CATNUM_IN=0001;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0101;CATNUM_IN=0010;CATNUM_IN=0000;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0100;CATNUM_IN=0001;CATNUM_IN=1001;CATCASE TEMP IS WHEN 0=NUM_IN=0001;CATNUM_IN=0011;C