数字电路-交通灯控制器-实验报告.doc

上传人:wux****ua 文档编号:7958360 上传时间:2020-03-26 格式:DOC 页数:24 大小:2.11MB
返回 下载 相关 举报
数字电路-交通灯控制器-实验报告.doc_第1页
第1页 / 共24页
数字电路-交通灯控制器-实验报告.doc_第2页
第2页 / 共24页
数字电路-交通灯控制器-实验报告.doc_第3页
第3页 / 共24页
点击查看更多>>
资源描述
课题三:交通灯控制器课题三:交通灯控制器一设计课题的任务要求(一)、实验目的1. 熟练掌握 VHDL 语言和QuartusII 软件的使用;2. 理解状态机的工作原理和设计方法;3. 掌握利用 EDA 工具进行自顶向下的电子系统设计方法;(二)、相关知识本实验要利用 CPLD 设计实现一个十字路口的交通灯控制系统,与其他控制系统一样,本系统划分为控制器和受控电路两部分。控制器使整个系统按设定的工作方式交替指挥车辆及行人的通行,并接收受控部分的反馈信号,决定其状态转换方向及输出信号,控制整个系统的工作过程。路口交通灯控制系统的有东西路和南北路交通灯 R(红)、Y(黄)、G(绿)三色,所有灯均为高电平点亮。设置20s 的通行时间和5s 转换时间的变模定时电路,用数码管显示剩余时间。提供系统正常工作/复位和紧急情况两种工作模式。(三)、实验任务1.基本任务:设计制作一个用于十字路口的交通灯控制器。1). 南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20 秒、5 秒和25 秒;2). 当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行;3). 用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间;2.提高要求:1). 增加左、右转弯显示控制功能;2). 紧急状况时增加声光警告功能;3). 自拟其它功能。二系统设计(包括设计思路、总体框图、分块设计)(一)设计思路1.总体设计-输入部分:1) CLK时钟频率输入,可由实验板上直接提供,为准确确定时间长度,选择High挡的1MHz高频信号。2) 紧急状态按键拨码开关EMERGENCY,当将其置为高电平,表示紧急情况发生,两个方向均为红灯亮,计时停止,蜂鸣器蜂鸣;当置其为低电平,信号灯和计时器恢复原来状态,正常工作。3) 复位拨码开关RESET,当将其置为高电平,表示复位,工作停止,全部回到初始状态;当置其为低电平,重新开始工作。2.总体设计-输出部分:1) 东西方向和南北方向各使用4个LED显示,LIGHT1,LIGHT2,红黄绿各代表红黄绿灯,剩下两个红灯分别表示限制两个方向的禁止左转。2) 东西方向和南北方向计时均为2位数,共需要4个LED七段数码管显示。由于为共阴极控制,输出一个CAT_TEMP信号控制选择数码管显示,NUM信号输出显示的内容。3) 增加一个BELL输出,控制紧急状态下的蜂鸣器。(二)总体框图1.输入输出示意图CLK LIGHT1EMERGENCYLIGHT2RESETBELLNUMCATTEMPCLK开关1数码管显示输出数码管共阴极控制东西向交通灯南北向交通灯蜂鸣器开关22.模块示意图控制器紧急请求系统复位BELL控制器南北灯(包括禁止左转灯)东西灯(包括禁止左转灯)复位紧急请求分频器时钟时间计数器译码器时间倒计时显示警铃3.流程图YES南北绿,东西红东西禁止左转灯亮是否绿灯时间到20s?对黄灯开始计时南北黄,东西红东西禁止左转灯亮是否黄灯时间到5s?对绿灯开始计时南北红,东西绿南北禁止左转灯亮是否绿灯时间到20s?对黄灯开始计时南北红,东西黄南北禁止左转灯亮是否黄灯时间到5s?对绿灯开始计时YESYESYESNONONONO启动/复位任何/当前正常运行状态警报开关是否打开?全部亮红灯+警铃YESNO4.RTL图5.状态转移列表(状态机)红绿灯显示状态状态S0南北绿灯亮,东西红灯亮,东西禁止左转S1南北黄灯亮,东西红灯亮,东西禁止左转S2南北红灯亮,东西绿灯亮,南北禁止左转S3南北红灯亮,东西黄灯亮,南北禁止左转S4南北东西红灯都亮,南北东西都禁止左右转(三)分块设计 -在VHDL设计中,采用自顶向下的设计思路。1.顶层模块中,根据硬件设计,设置如下端口:u 外部时钟信号:CLKu 紧急状态按键:EMERGENCYu 南北方向状态灯:LIGHT1u 东西方向状态灯:LIGHT2u 蜂鸣器控制:BELLu 数码管显示信号:NUMu 数码管共阴极控制:CAT_TEMP2.在底层中,把不同功能分模块设计。u FREQUENCY模块,由于外部时钟信号CLK的频率为50MHz,而实际需要的内部计时时钟频率为1Hz,需要一个分频电路。输入端口:CLK外部时钟信号输出端口:CLK_OUT分频后信号u COUNTER模块,由于整个过程的显示周期为50秒,即50个状态,所以该模块为计数器模块,计数周期为50,输入为1Hz的外部时钟,并加入紧急信号和复位信号,当输入紧急信号,计数停止,当输入复位信号,计数置1.通过该计数器的计数输出信号来控制LIGHT模块和COUNTDOWN模块的状态。输入端口:CLK时钟信号,EMERGENCY紧急信号,RESET复位信号输出端口:COUNTER计数状态信号,BELL报警信号u COUNTDOWN模块,倒计时显示模块,通过输入的COUNTER和CLK来控制数码管共阴极和7段数码管数字显示控制。输入接口:CLK时钟信号,COUNT计数器信号输出接口:CAT_TEMP共阴极控制,NUMIN数字输出u SHOW模块,接收数字信号,进行7位数码管显示译码输出。输入接口:NUMIN输入信号输出接口:NUM译码输出u LIGHT信号灯控制模块,使用状态机,双进程控制5个状态输入接口:COUNT计数器信号,EMERGENCY紧急状态控制输出接口:LIGHT1,LIGHT2信号灯输出三仿真波形及波形分析仿真波形-由于时钟为50MHz,故在仿真时为了波形图更易读,将分频器设为20分频1状态周期为150,在每个状态内,数码管共阴极进行扫描,且扫描同时数码管显示进行循环变化2周期状态,在120,2125,2645,4650进行红绿灯显示变化3.一整个周期状态150,在120,2125,2645,4650进行红绿灯显示变化 4.多个周期循环5.紧急状态和复位状态四源程序(注释)l TRAFFIC.vhd-主程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY TRAFFIC IS PORT( CLK,RESET,EMERGENCY:IN STD_LOGIC;-输入时钟信号,复位信号,紧急信号 LIGHT1,LIGHT2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);-输出东西南北向两个红信号NUM:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);-输出7端数码管选通信号CAT_TEMP:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);-输出7端数码管共阴极信号BELL:OUT STD_LOGIC;-输出警铃信号NUMIN:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);-输出信号(用十进制在波形图显示数字)COUNTERS:OUT STD_LOGIC_VECTOR (5 DOWNTO 0)-输出信号(用十进制在波形图中显示周期状态) );END TRAFFIC;ARCHITECTURE TRAFFICSHOW OF TRAFFIC ISSIGNAL TEMPCLK:STD_LOGIC;SIGNAL TEMPCOUNT:STD_LOGIC_VECTOR(5 DOWNTO 0);SIGNAL TEMPNUM:STD_LOGIC_VECTOR(3 DOWNTO 0);COMPONENT FREQUENCY IS-组合FREQUENCY模块,以下同 PORT( CLK:IN STD_LOGIC; CLK_OUT:OUT STD_LOGIC );END COMPONENT;COMPONENT COUNTER ISPORT(CLK:IN STD_LOGIC;RESET:IN STD_LOGIC;EMERGENCY:IN STD_LOGIC;COUNTER:OUT STD_LOGIC_VECTOR (5 DOWNTO 0);BELL:OUT STD_LOGIC;COUNTERS:OUT STD_LOGIC_VECTOR (5 DOWNTO 0);END COMPONENT;COMPONENT LIGHT IS PORT( EMERGENCY:IN STD_LOGIC; COUNT:IN STD_LOGIC_VECTOR(5 DOWNTO 0); LIGHT1,LIGHT2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );END COMPONENT;COMPONENT COUNTDOWN IS PORT( COUNT:IN STD_LOGIC_VECTOR(5 DOWNTO 0); CLK:IN STD_LOGIC; NUMIN:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CAT_TEMP:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); NUMIN1:OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END COMPONENT;COMPONENT SHOW ISPORT(NUM_IN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);NUM:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END COMPONENT;BEGIN-将各个模块接口连接起来U1:FREQUENCY PORT MAP (CLK=CLK,CLK_OUT=TEMPCLK);U2:COUNTER PORT MAP (BELL=BELL,CLK=TEMPCLK,RESET=RESET,EMERGENCY=EMERGENCY,COUNTER=TEMPCOUNT,COUNTERS=COUNTERS);U3:LIGHT PORT MAP (EMERGENCY=EMERGENCY,COUNT=TEMPCOUNT,LIGHT1=LIGHT1,LIGHT2=LIGHT2);U4:COUNTDOWN PORT MAP (NUMIN1=TEMPNUM,CAT_TEMP=CAT_TEMP,COUNT=TEMPCOUNT,CLK=CLK,NUMIN=NUMIN);U5:SHOW PORT MAP (NUM_IN=TEMPNUM,NUM=NUM);END TRAFFICSHOW;l FREQUENCY.vhd-分频器模块,1HzLIBRARY 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 4999999;-设置分频999999,则为1HzBEGINPROCESS(CLK)BEGINIF(CLKEVENT AND CLK=1)THENIF(TEMP=4999999)THENTEMP=0;ELSETEMP=TEMP+1;END IF;IF TEMP4999999 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_LOGIC_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):=000001;-计数信号输出BELL:OUT STD_LOGIC;-警铃信号输出COUNTERS:OUT STD_LOGIC_VECTOR (5 DOWNTO 0)-计数信号输出(波形));END COUNTER;ARCHITECTURE CON OF COUNTER ISSIGNAL TEMPCOUNT:INTEGER RANGE 1 TO 50:=1;-定义信号计数,初始状态为1BEGINPROCESS(CLK,RESET,EMERGENCY)BEGIN IF CLKEVENT AND CLK=1 THEN-外部时钟,1Hz IF EMERGENCY=0 THEN-当不是紧急状态 BELL=0; 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;-计数器停止计数 BELL=1;-警铃为高电平 END IF; END IF; END PROCESS;COUNTER=CONV_STD_LOGIC_VECTOR(TEMPCOUNT,6);-内部信号转化为输出COUNTERS=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);-计数器输入,控制其它正常状态 LIGHT1,LIGHT2:OUT STD_LOGIC_VECTOR(3 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);-将二进制输入转化为十进制计数信号 IF EMERGENCY=1 THEN-EMERGENCY为高电平时为紧急状态 STATE STATE STATE STATE STATELIGHT1=0010;-南北绿灯 LIGHT2LIGHT1=0100;-南北黄灯 LIGHT2LIGHT1=1001;-南北红灯,且禁止左转 LIGHT2LIGHT1=1001;-南北红灯,且禁止左转 LIGHT2LIGHT1=1001;-南北红灯,且禁止左转 LIGHT2=1001;-东西红灯,且禁止左转 END CASE;END PROCESS;END LIGHTSHOW;l COUNTDOWN.vhd-7段数码管倒计时控制模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;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端数码管共阴极输出控制信号 NUMIN1:OUT STD_LOGIC_VECTOR (3 DOWNTO 0)-输出7段数码管显示数字信号(波形图观察) );END COUNTDOWN;ARCHITECTURE 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):=011111;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)THENTEMP=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=0001;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 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_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;CATNUM_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=0000;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 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_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;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 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_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;CAT=11
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!