红绿灯交通灯控制器EDA设计(DOC毕设论文).doc_第1页
红绿灯交通灯控制器EDA设计(DOC毕设论文).doc_第2页
红绿灯交通灯控制器EDA设计(DOC毕设论文).doc_第3页
红绿灯交通灯控制器EDA设计(DOC毕设论文).doc_第4页
红绿灯交通灯控制器EDA设计(DOC毕设论文).doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6.6 红绿灯交通灯控制器EDA设计6.6.1设计要求设计一个基于FPGA的红绿灯交通信号控制器。假设某个十字路口是由一条主干道和一条次干道汇合而成,在每个方向设置红绿黄三种信号灯,红灯亮禁止通行,绿灯亮允许通行。黄灯亮允许行驶中车辆有时间停靠到禁止线以外。在自动控制模式时,主干道每次放行时间为35秒,次干道每次放行时间为15秒,主干道红灯次干道黄灯,主干道黄灯,次干道红灯持续时间为5秒。其外部硬件电路方面包括:两组红绿灯(配合十字路口的双向指挥控制)、两级七段显示器(配合绿灯时倒计时显示)、一组手动与自动控制开关(针对交通警察指挥交通控制使用)。6.6.2系统组成城市道路交叉口是城市道路网络的基本节点,也是网络交通流的瓶颈。目前,大部分无控制交叉口都存在高峰小时车流混乱、车速缓慢、延误情况严重、事故多发、通行能力和服务水平低下等问题。特别是随着城市车流量的快速增长,城市无控制道路交叉口的交通压力越来越大。因此,做好基于EDA技术平台的交叉口信号控制设计是缓解交通阻塞、提高城市道路交叉口车辆通行效率的有效方法。交通信号控制的目的是为城市道路交叉口(或交通网络)提供安全可靠和有效的交通流,通常最为常用的原则是车辆在交叉口的通过量最大或车辆在交叉口的延误最小。按照“自顶向下”的层次化设计方法,整个系统可分为4个模块,系统时序发生电路,红绿灯计数时间选择模块,定时控制电路,红绿灯信号译码电路。其系统组成方框图如图6-51所示:图6-51交通灯控制器系统组成方框图图6-54中,系统时序发生电路最主要的功能就是产生一些额外的输出信号,它们是为红绿灯信号译码电路提供的频率为250Hz的扫描信号,为定时控制电路提供的使能(enable)控制信号,为红绿灯信号译码电路提供的占空比为50%的秒闪烁信号;红绿灯计数时间选择模块是负责输出显示器需要的值(即倒数的秒数值),作为定时控制电路(count_down circuit)的到计数秒数,在该模块中可设置东西路口和南北路口的信号灯维持秒数;定时控制电路功能就是负责接收红绿灯计数时间选择模块输出的值(即倒数的秒数值),然后将其转换成BCD码,利用七段显示器显示出来,让行人能清楚地的知道再过多久就会变成红灯;红绿灯信号译码电路除了负责控制路口红绿灯的显示外,最主要的功能就是能够利用开关来切换手动与自动的模式,让交警能够通过外部输入的方式来控制红绿灯信号系统的运作,在红绿灯交通信号系统中,大多数的情况是通过自动控制的方式指挥交通的,但为了配合高峰时段,防止交通拥挤,有时还必须使用手动控制,即让交警自行指挥交通。 为系统正常运作,整个控制器采用同步工作方式,由外接信号发生器(该电路的设计可参见本章6.2.3节)提供1kHz的时钟信号CLK。6.6.3 红绿灯交通灯控制器的层次化设计方案EDA技术的基本设计方法有电路级设计方法和系统级设计方法。电路级设计方法已经不能适应新的形势,本系统采用的是系统级层次设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片FPGA芯片实现,首先用VHDL语言编写各个功能模块程序,最后通过综合器和适配器生成最终的目标器件,然后用顶层原理图将各功能模块连接起来。下面给出各模块的VHDL设计过程和仿真结果。1系统时序发生电路clk_gen的VHDL设计在红绿灯交通信号控制系统中,大多数的情况是通过自动控制的方式指挥交通的。因此,为了避免意外事件的发生,电路必须给一个稳定的时钟(clock)才能让系统正常运作。但为了配合高峰时段,防止交通拥挤,有时也必须使用手动控制,即让交警能够顺利地指挥交通。Clk_gen电路最主要的功能就是产生一些额外的输出信号,并将其用做后续几个电路的使能(enable)控制与同步信号处理。 该电路的核心部分就是分频电路,通过对外接信号发生器提供1kHz的时钟信号进行1000分频,得到一个周期为1秒的输出使能信号ena_lhz(占空比1:1000)和flash_lhz(占空比1:1);4分频后得到红绿灯信号译码电路所需的频率为250Hz的显示使能信号ena_scan。其VHDL源程序如下:LIBRARY IEEE;USE IEEE.std_logic_1164.all;USE IEEE.std_logic_arith.all;USE IEEE.std_logic_unsigned.all;ENTITY clk_gen IS port(reset: in std_logic;- 系统复位信号 clk:in std_logic;- 由外接信号发生器提供1kHz的时钟信号 ena_scan:out std_logic; -250Hz信号 ena_1Hz:out std_logic; -每秒一个脉冲的信号 flash_1Hz: out std_logic);- 秒方波信号end; ARCHITECTURE BEHAVIOR of clk_gen IS CONSTANT scan_bit: positive := 2;CONSTANT scan_val: positive := 4;CONSTANT two_Hz_bit: positive := 7;CONSTANT two_Hz_val: positive := 125;signal clk_scan_ff:std_logic_vector(scan_bit-1 downto 0); signal clk_2Hz_ff:std_logic_vector(two_Hz_bit-1 downto 0); signal ena_s,ena_one,ena_two:std_logic;begin scan:process(reset,clk) -将外部的clk信号进行4分频处理的进程 begin if reset=1 then clk_scan_ff=00; ena_s=scan_val-1 then clk_scan_ff=00; ena_s = 1; else clk_scan_ff=clk_scan_ff+1; ena_s = 0; end if; end if; end process; ena_scan = ena_s; two_Hz:process(reset,clk,ena_s) -产生周期为1秒的脉冲信号ena_lhz和方波信号flash_1Hz的进程 begin if reset=1 then ena_one=0; ena_two=0; clk_2Hz_ff=two_Hz_val-1 then clk_2Hz_ff=0000000; ena_two = 1; ena_one = not ena_one; else clk_2Hz_ff=clk_2Hz_ff+1; ena_two = 0; ena_one = ena_one; end if; end if; end if; end process; ena_1Hz = ena_one and ena_two and ena_s;flash_1Hz = ena_one;end BEHAVIOR;该模块的VHDL程序设计中使用了参数化的概念,即引用了常数对象(constant)。借助使用常数,可以更改常数的值并且重新编译,而所有使用到该常数的地方都会随着更新而使用新的常数值。该模块的VHDL程序包含了两个进程。进程scan将外部的clk信号进行4分频处理产生250Hz方波信号ena_scan,进程two_hz将外部的clk信号进行1000分频处理产生周期为1秒的脉冲信号ena_lhz和方波信号flash_1Hz。Reset为系统复位信号,当reset=1时,则将输出都清零。当reset=0,系统正常运行,clk为上升沿触发。系统时序发生电路clk_gen的仿真输出波形和元件符号如图6-52所示。 (a) (b)图6-52系统时序发生电路clk_gen(a) 仿真输出波形;(b)元件符号图2 红绿灯计数时间选择模块traffic_mux的VHDL设计当过马路的时候,绿灯的一方有时会附加一个显示器告诉行人,目前还剩下几秒信号灯将变成红灯。因此,traffic_mux电路最主要的功能就是负责输出显示器需要的值(即倒数的秒数值),作为定时控制电路的计数秒数。该电路的核心部分就是数据选择电路,利用选择语句case_when(单输入,多输出)实现4选1,其选择输入信号sign_state是红绿灯信号译码电路产生的4种状态信号,状态转换输出表如表6-5所示。该模块的VHDL程序设计中仍然引用了常数对象(constant)来设置不同交通灯的维持时间,即:状态0:green0_time(东西路口的绿灯维持秒数)的数值赋给load,此时load=(23)16=(35)10;状态1:yellow0_time(东西路口的黄灯维持秒数)的数值赋给load,此时load=(05)16=(05)10;状态2:green1_time(南北路口的绿灯维持秒数)的数值赋给load,此时load=(0F)16=(15)10;状态3:yellow1_time(南北路口的黄灯维持秒数)的数值赋给load,此时load=(05)16=(5)10。表6-5红绿灯计数时间状态转换表状态sign_state东西路口南北路口时间(秒)00(状态0)东西路口为通行状态,此时东西路口绿灯亮, 南北路口红灯亮3501(状态1)东西路口为过渡状态,此时东西路口黄灯亮南北路口红灯亮510(状态2)东西路口红灯亮南北路口为通行状态,此时南北路口绿灯亮1511(状态3)东西路口红灯亮南北路口过渡状态,此时南北路口黄灯亮5在程序中还用到conv_std_logic_vector(value,n)语法,其用法就是将已经定义的数值(value)转换成n位(bit)的表示方法。例如: Load=conv_std_logic_vector(green1_time,8) (6-8)是将green1_time所定义的数值转换成8比特表示,即形成load=(00001111)2=(0F)16。其VHDL源程序如下:LIBRARY IEEE; USE IEEE.std_logic_1164.all;USE IEEE.std_logic_unsigned.all; USE IEEE.std_logic_arith.all;ENTITY traffic_mux IS port(reset, clk, ena_scan ,recount: in std_logic; sign_state: in std_logic_vector(1 downto 0); load: out std_logic_vector(7 downto 0);end; ARCHITECTURE BEHAVIOR of traffic_mux ISCONSTANT yellow0_time: integer := 5; -设置东西路口的黄灯维持秒数CONSTANT green0_time: integer := 35;- 设置东西路口的绿灯维持秒数CONSTANT yellow1_time: integer := 5;- 设置南北路口的黄灯维持秒数CONSTANT green1_time : integer := 15;- 设置南北路口的绿灯维持秒数begin load_time:process(reset,clk) begin if reset=1 then load load load load load = CONV_STD_LOGIC_VECTOR(yellow1_time,8); END CASE; end if; end if; end process;end BEHAVIOR ; 在源程序中Clk是由外接信号发生器提供1kHz的时钟脉冲信号;Reset是系统内部自复位信号;Ena_scan是clk_gen电路提供250Hz的时钟脉冲信号;Recount是红绿灯信号译码电路产生的重新计数的使能控制信号;Sign_state是由红绿灯信号译码电路产生的状态信号;系统输出信号Load负责产生计数器所需的计数数值(数值范围0255)。红绿灯计数时间选择模块traffic_mux仿真输出波形和元件符号如图6-53所示。 (a) (b)图6-53红绿灯计数时间选择模块traffic_mux(a) 仿真输出波形;(b)元件符号图3定时控制电路count_down的VHDL程序设计当过马路的时候,绿灯的一方有时会附加一个显示器告诉行人。目前还剩下几秒钟信号会变成红灯。因此,count_down电路最主要的功能就是负责接收traffic_mux电路输出的值(即倒数的秒数值),然后将其转换成BCD码,利用七段显示器显示出来,让行人能清楚地的知道再过多久就会变成红灯。该电路的核心部分是可置数的减法计数器电路和七段译码输出显示电路。可置数的减法计数器电路是利用if_then_else语句完成,两位七段译码输出显示电路则利用case_when语句通过查表的方式构成,其VHDL源程序如下:LIBRAYR IEEE;USE IEEE.std_logic_1164.all;USE IEEE.std_logic_arith.all;USE IEEE.std_logic_unsigned.all;ENTITY count_down IS port(reset, clk, ena_1Hz, recount: in std_logic; load: in std_logic_vector(7 downto 0); seg7:out std_logic_vector(15 downto 0); next_state: out std_logic);end; ARCHITECTURE BEHAVIOR of count_down IS signal cnt_ff:std_logic_vector(7 downto 0); begin count:process(clk,reset) begin if (reset=1) then cnt_ff=00000000; seg7=0000000000000000; elsif (clkevent and clk=1) then if ena_1Hz=1 then if (recount=1) then cnt_ff=load-1; else cnt_ffseg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)seg7(15 downto 0)=0011111100111111; end case; end if; end process; next_state = 1 when cnt_ff=1 else 0; end BEHAVIOR;在源程序中Clk是由外接信号发生器提供1kHz的时钟脉冲信号;Reset是系统内部自复位信号;ena_1hz是clk_gen电路提供1Hz的时钟脉冲信号;recount是红绿灯信号译码电路产生的重新计数的使能控制信号;Load负责接收计数器所需的计数数值。系统输出信号Seg7负责将计数数值转换成BCD码,并利用直接驱动方式译码产生七段共阴极显示器所需的驱动信号,为seg7是16bit的输出信号,负责控制七段显示器的输出,故16bit需拆成2组8bit信号控制2组七段显示器,输出字型参见表6-2;Next_state作为转态触发信号,当计数器计时完毕时,负责产生一个脉冲信号, cnt_ff(十进制数)是一个8bit的内部信号,作为倒计时使用, 其仿真输出波形和元件符号如图6-54所示。 (a) (b)图6-54定时控制电路count_down(a) 仿真输出波形;(b)元件符号图当load=(23)16时,cnt_ff=34,并从该数开始到计数到0(总共35秒钟,为东西路口的绿灯维持秒数),两位数码管的译码输出为4F66(34)。4 红绿灯信号译码电路traffic_fsm的VHDL程序设计在红绿灯交通信号系统中,大多数的情况是通过自动控制的方式指挥交通的。但为了配合高峰时段,防止交通拥挤,有时还必须使用手动控制,即让交警自行指挥交通。因此,traffic_fsm电路除了负责监控路口红绿灯之外,最主要的功能就是能够利用开关来切换手动与自动的模式,让交警能够通过外部输入的方式来控制红绿灯信号系统的运作。 该电路的核心部分是在自动控制和手动控制下红绿灯信号的状态译码输出及红绿灯闪烁控制电路。该电路的输入信号有:clk(由clk_gen电路提供1kHz的时钟脉冲信号);reset是系统内部自复位信号;ena_scan(接收由clk_gen电路提供的250Hz时钟脉冲信号);ena_1hz(clk_gen电路提供1Hz的时钟脉冲信号);Flash_1hz(接收由clk_gen电路提供的1Hz方波信号);a_m 手动、自动切换钮输入(1:自动,0:手动);在手动模式下使用的Sr_butt 红绿灯状态切换钮(每按一次就切换一个状态);Next_state(在自动模式下接收由cont_down电路提供的状态触发信号)。输出信号有:recount (产生重新计数的输出使能控制信号);Sign_state(产生的输出状态信号共2bit,4种状态);Red(负责红灯的显示,共2bit,4种状态); Green (负责绿灯的显示共2bit,4种状态);Yellow 负责黄灯的显示共2bit,4种状态);设东西路口红黄绿三色灯为的r0、yO、g0,南北路口的红黄绿三色灯为的r1、y1、g1,自动操作模式和手动操作模式信号灯显示的真值表如表6-6、表6-7所示。表中定义了一些进程(process)间整体共享的电路内部传递信号,以整合所有功能,它们是:State信号(设定红绿灯电路的状态,在该程序里定义8种状态);St_tansfer(在手动模式下判断是否转态的控制信号);Light5.0 (在自动模式下该信号为是否转态的控制信号,其位数从高到低分别表示Red1、red0、yellow1、yellow0、green1、green0)。表6-6自动操作模式(a_m=1)信号灯显示的真值表CLKresetena_1hznext_stagestate状态sing_staterecountlightState11XXr0g1001010010State2011r0g1r0y1011011000010r0g1000010010State3011r0y1g0r1101100001010r0y1010011000State4011y0r1g0r1111100100010g0r1100100001State5011y0r1r0g1001010010010y0r1110100100State6011ohters000110000表6-7手动操作模式(a_m=0)信号灯显示的真值表CLKresetena_scnre_transferstate状态sing_staterecountlightState11XXr0g1001010010State2011r0g1r0y1011011000010r0g1001010010State3011r0y1g0r1101100001010r0y1011011000State4011g0r1 y0r1111100100010g0r1101100001State5011y0r1r0g1001010010010y0r1111100100State6011ohters000110000其VHDL源程序如下:LIBRARY IEEE; USE IEEE.std_logic_1164.all;USE IEEE.std_logic_arith.all;USE IEEE.std_logic_unsigned.all; ENTITY traffic_CON IS port(reset,clk,ena_scan,ena_1Hz,flash_1Hz,a_m,st_butt,next_state:in std_logic; recount: out std_logic; sign_state: out std_logic_vector(1 downto 0); red: out std_logic_vector(1 downto 0); green: out std_logic_vector(1 downto 0); yellow: out std_logic_vector(1 downto 0);end; ARCHITECTURE BEHAVIOR of traffic_CON IStype Sreg0_type is (r0g1, r0y1, g0r1, y0r1, y0y1, y0g1, g0y1, r0r1);signal state: Sreg0_type; signal st_transfer: std_logic;signal light: std_logic_vector(5 downto 0); - r(10)y(10)g(10)begin rebounce:process (reset,clk,ena_scan,st_butt) variable rebn_ff: std_logic_vector(5 downto 0); begin if (st_butt=1 or reset=1) then rebn_ff := 111111; st_transfer = 3) then rebn_ff := rebn_ff-1; st_transfer=0; elsif (rebn_ff=2) then rebn_ff := rebn_ff-1; st_transfer =1; else rebn_ff := rebn_ff; st_transfer =0; end if; end if; end if; end process; CON: process (clk,ena_1Hz,reset) begin if (reset=1) then state=r0g1; sign_state=01; recount -现态: red0 on green1 on if (a_m=1 and ena_1Hz=1) then if (next_state = 1) then recount=1; state=r0y1; sign_state = 01; else recount=0; state=r0g1; -red=2b01; green=2b10; yellow=2b00; end if; elsif (a_m=0 and ena_scan=1) then if (st_transfer=0) then - 0: ,保持1:传送 light state recount=1; state=r0g1; else recount=1; state=r0y1; sign_state -现态: red0 on yellow1 flash if (a_m=1 and ena_1Hz=1) then if (next_state = 1) then recount=1; state=g0r1; sign_state = 10; else recount=0; state=r0y1; - red=2b01; green=2b00; yellow=2b10; end if; elsif (a_m=0 and ena_scan=1) then if (st_transfer=0) then - 0: 保持,1: 传送light state recount=1; state=r0y1; else recount=1; state=g0r1; sign_state - 现态: green0 on red1 on if (a_m=1 and ena_1Hz=1) then if (next_state = 1) then recount=1; state=y0r1; sign_state = 11; else recount=0; state=g0r1; - red=2b10; green=2b01; yellow=2b00; end if; elsif (a_m=0 and ena_scan=1) then if (st_transfer=0) then - 0: 保持, 1: 传送 light state recount=1; state=g0r1; else recount=1; state=y0r1; sign_state - 现态: green0 on red1 on if (a_m=1 and ena_1Hz=1) then if (next_state = 1) then recount=1; state=r0g1; sign_state = 00; else recount=0; state=y0r1; - red=2b10; green=2b00; yellow=2b01; end if; elsif (a_m=0 and ena_scan=1) then if (st_transfer=0) then - 0: 保持,1: 传送light state recount=1; state=y0r1; else recount=1; state=r0g1; sign_state state=r0g1; recount=0; sign_state = 00; end case; end if; end if; end process; light = 010010 when (state=r0g1) else 011000 when (state=r0y1) else 100001 when (state=g0r1) else 100100 when (state=y0r1) else 110000; red = light(5 downto 4); yellow = light(3 downto 2) and (flash_1Hz & flash_1Hz); green = light(1 downto 0);end BEHAVIOR;在源程序中,利用类别的定义格式Type tpye_name is type_mark,将所有红绿灯交通信号系统发生的状况利用类别(type)的定义格式一一列举出来(程序中共定义了8种情况),信号线state的设置的目的是将sreg0_type定义的8种状况转换成位的方式表示。程序包含两个进程debounce、fsm。进程debounce是抖动消除电路,其重点在于st_transfer何时为1。当外部按下st_butt键时(即st_butt=0),内部的计数器rebn_ff开始计数(3f02),在rebn_ff尚未数到02时,st_butt键被松开,那么状态将不会改变。因此,st_butt键按下至少需要维持ena_scan(3f-02)16=4ms(61)=244ms,才能使st_transfer=1电路转态。假如是由于电路效应引起开关误动作,开关抖动的速度是非常快的(约小于1ms),故电路不会有误动作的产生,也就达到了这个抖动消除的目的。进程fsm是红绿灯状态控制器和红绿灯闪烁控制器。红绿灯信号译码电路traffic_fsm仿真输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论