交通信号灯控制器目录第一章系统设计1.1设计要求 (3)1.2 方案比较 (3)1.3方案论证 (3)1.3.1总体思路 (4)1.3.2设计方案 (5)第二章单元电路设计2.1 4位二进制计数器 (6)2.2 两位二进制计数器 (6)2.3定时时间到检测电路 (6)2.4红黄绿灯输出控制电路 (6)2.5计时器 (6)第三章软件设计3.1用VHDL编写程序 (6)3.2 程序流程 (7)3.3程序清单及仿真 (7)第四章系统测试 (7)第五章结论 (8)参考文献 (9)附录 (10)0 引言随着经济的飞速发展,现代化交通管理成了当今的热点问题。
一个完善的交通控制功能,可使混乱的交通变得井然有序,从而保障了人们的正常外出。
本系统通过设计一交通信号灯控制器,达到交通控制的目的。
除实现交通灯基本的控制功能外,系统还可显示该灯本次距灯灭所剩的时间,具有更完善的控制功能,使行人提前做好起、停准备,具有更强的实用性。
第1章 系统设计1.1设计要求(1) 交通灯从绿变红时,有4秒黄灯亮的间隔时间。
(2) 交通灯红变绿是直接进行的,没有间隔时间。
(3) 主干道上的绿灯时间为20秒,支干道的绿灯时间为10秒。
(4) 在任意时间,显示每个状态到该状态结束所需要的时间。
1.2方案比较要实现对交通灯的控制,有很多的方案可供选择。
方案一:由两块CMOS 集成电路完成定时和序列控制功能,三只双向晶体管完成实际的电源切换功能。
电路中采用10V 负电源(可由市电电压经降压、整流、滤波、稳压而得)、CD4049集成电路、计数器CD4017等器件。
其中双向晶闸管选用400V 、4A 的,二极管选用BY127型和1N4148型,稳压管选用10V 、1W 的。
因直接使用市电工作,故在安装和使用时安全系数较低,且硬件电路复杂,所用器件多。
方案二:运用VHDL 语言分别控制分频和状态机两个模块, 即信号源经分频器分频后得到1Hz 脉冲,输出脉冲控制状态机中预置四个状态的循环,从而达到交通控制作用.该方案电路结构简单,使用器件少,易于安装和使用.但不宜于电路扩展,适用围小,应用不广泛.方案三:采用VHDL 语言输入的方式实现交通信号灯控制器,并灵活运用了通用元件CBU14和CBU12作为4位二进制计数器和两位二进制计数器,简化了硬件电路,同时也给调试、维护和功能的扩展、性能的提高带来了极大的方便。
分析以上三种方案的优缺点,显然第三种方案具有更大的优越性、灵活性,所以采用第三种方案进行设计。
1.3 方案论证1.3.1 总体思路 系统交通管理示意图如图1.3.1.主干道支干道图1.3.1 路口交通管理示意图由此可得出交通信号灯A 、B 、C 、D 的4种状态:根据设计要求,系统状态转换图如图1.2.2示。
图1.2.2状态转换图1.3.2设计方案图1.2.1交通信号灯控制器的原理框图状态发生器是一个两位二进制计数器,产生交通信号灯的4种状态。
状态发生器的输出通过预置数产生电路,输出每一种状态所需要的时间.预置数产生电路是一组四选一的多路转换器,多路转换器的输出信号作为可预置数十进制减法计数器的预置数输入信号,状态发生器的输出也决定了红黄绿灯信号的输出通断状态。
可预置数十进制减法计数器作为每一种状态的计时器,其输出信号既是时间显示的输出信号,也是定时时间到检测电路的输入信号。
定时时间到检测电路检测到电路到每一种状态的时间显示数据输出等于0时,发出信号通知状态发生器,完成状态转换。
第2章单元电路设计该电路由4位二进制计数器、两位二进制计数器、可预置十进制减法计数器、红黄绿灯信号输出控制电路(RYG)、四选一的多路转换器和一些门电路组成.2.1 4位二进制计数器CBU14将输入的信号分频后,产生1秒时钟信号。
2.2 两位二进制计数器CBU12提供当前的状态决定了红黄绿信号灯的通断状态,还控制多路转化开关,决定每一个状态的定时预置数。
(1)A状态时,CBU12的输出为00;(2)B状态时,CBU12的输出为01;(3)C状态时,CBU12的输出为10;(4)D状态时,CBU12的输出为11。
如:在A状态时,预置数为20秒,多路转换器的输出作为可预置数十进制减法计数器的预置数输入信号决定了每一种状态的预置时间的大小。
2.3定时时间到检测电路两个或非门和一个与非门组成定时时间到检测电路.每当计时器为0时,输出高电平,通知状态发生器转化到下一个状态。
2.4红黄绿灯输出控制电路(RYG)根据交通信号灯的ABCD4种状态,设计一个红黄绿灯输出控制电路模块(RYG)。
RYG由两个输入信号A和B(对应4种状态)和6个输出信号(对应两组红黄绿灯,FR1、FY1和FG1主干道红黄绿灯信号,FR2、FY2和FG2为支干道红黄绿灯信号),其真值表如下:红黄绿信号灯输出控制电路RYG的输出,控制两组红黄绿信号灯产生相应的变化。
2.5计时器计时器由两个具有预置数功能的十进制减1计数器CDD14和一个4输入或非门(产生借位)组成,计时器的输出控制数码管显示相应的时间。
第3章软件设计图3.1.1交通信号灯控制器程序原理框图程序中的时钟信号clk为石英晶体(327868HZ)分频后的8Hz标准信号作为产生1秒信号的输入信号,为LED数码管驱动电路(MC4511)提供输入信号,用于县市交通灯所处的状态的时间。
6个输出信号(对应两组红黄绿灯,FR1、FY1和FG1为主干道红黄绿灯信号, FR2、FY2和FG2为支干道红黄绿灯信号)。
该程序由7个进程组成,进程P1和P2将8Hz标准信号分频后产生1秒信号(carry),进程P3、P4和P5构成两个带有预置数功能的十进制计数器,其中P4产生允许十位计数器计数的控制信号(en)。
进程P6实现状态转换和产生状态转换的控制信号(load),进程P7产生次态信号(next_state)和信号灯输出信号(FR1、FY1、FG1、FR2、FY2和FG2),以及每一个状态的时间值(即计数器的预置数)和下一个状态。
3.2 程序流程图3.2.1程序流程图3.3程序清单及仿真.(见附录)第4章系统测试4.1测试仪器采用清华同方股份教学仪器设备公司生产的TPG_FPGA教学系统。
4.2测试方法采用xilinx公司生产的ISE仿真软件,仿真波形符合要求,将程序下载到芯片中,烧制成功,系统能正常工作。
4.3测试结果系统符合设计要求,并能正常工作。
第5章结论整个设计本着简单可靠、选用低价格、通用元件的原则,成功地完成了设计任务。
提高了系统的性价比,增强了实用性。
该设计还可作进一步改进,如:可设置从22:00到次日早上7:00时间让黄灯闪亮方便车辆缓行;还可以考虑采用全自动监控系统设计,对交通状况适时处理,实现交通管理的智能化。
参考文献:1.王金明、吉斌. [数字系统设计与Verilog HDL].:电子工业,2002年第1版.210页.2.友汉、建永.[电子线路设计应用手册].:科学技术,2000年第1版.142页.3.自美.[电子线路设计•••••实验•测试].:华中理工大学,2000年第2版.233页.4.辉.[ISP系统设计技术入门与应用].:电子工业,2002年第1版.184页.附录:1.程序清单:Library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; entity traffic1 isport(clk,st: in std_logic;q0,q1:out std_logic_vector(6 downto 0);R1,Y1,G1,R2,Y2,G2: out std_logic);end traffic1;architecture arch of traffic1 istype states is(s0,s1,s2,s3);signal state,next_state: states; signal count0: std_logic_vector(3 downto 0);signal count1: std_logic_vector(3 downto 0);signal data0: std_logic_vector(3 downto 0);signal data1: std_logic_vector(3 downto 0);signal light: std_logic_vector(5 downto 0);signal load, carry: std_logic;signal en: std_logic;beginp1:process(clk,st)variable count: integer range 4 downto 0;beginif st='0' then count:=0;elsif rising_edge(clk) then if count>=4 thencount:=0;carry<='0';elsecount:=count+1;if count<2 thencarry<='0';else carry<='1';end if;end if;end if;end process p1;p2:process(carry,load,st) beginif st='0' then count0<="0000"; elsif rising_edge(carry) then if load='1' thencount0<=data0;elsif count0="0000" thencount0<="1001";elsecount0<=count0-'1';end if;end if;end process p2;p3:process(carry,st)beginif st='1' thenif falling_edge(carry) thenif count0="0000" thenen<='1';elseen<='0';end if;end if;else en<='Z';end if;end process p3;p4:process(carry,load,en,st)beginif st='0' then count1<="0000";elsif(rising_edge(carry) and en='1') thenif load='1' thencount1<=data1;elsif count1="0000" thencount1<="1001";elsecount1<=count1-'1';end if;end if;end process p4;p5: process(carry)beginif(falling_edge(carry)) thenif(count0="0000" and count1="0000") thenload<='1';state<=next_state;elseload<='0';end if;end if;end process p5;p6:process(state)begincase state iswhen s0 =>light <="001100";next_state<=s1;data0<="0000";data1<="0010";when s1 =>light <="010100";next_state<=s2;data0<="0100";data1<="0000";when s2 =>light <="100001";next_state<=s3; data0<="0000";data1<="0001";when s3 =>light <="100010";next_state<=s0;data0<="0000";data1<="0010";end case;end process p6;p7: process(count0)begincase count0 iswhen "0000" =>q0<="0000001"; --0when "0001" =>q0<="1001111"; --1when "0010" =>q0<="0010010"; --2when "0011" =>q0<="0000110"; --3when "0100" =>q0<="1001100"; --4when "0101" =>q0<="0100100"; --5when "0110" =>q0<="0100000"; --6when "0111" =>q0<="0001111"; when "1000" =>q0<="0000000"; --8when "1001" =>q0<="0000100"; --9when others =>q0<="1111111";end case;end process p7;p8: process(count1)begincase count1 iswhen "0000" =>q1<="0000001";--0when "0001" =>q1<="1001111";--1when "0010" =>q1<="0010010";--2when "0011" =>q1<="0000110";--3when "0100" =>q1<="1001100";--4when "0101" =>q1<="0100100";--5when "0110" =>q1<="0100000";--6when "0111" =>q1<="0001111";when "1000" =>q1<="0000000";--8when "1001" =>q1<="0000100";--9when others =>q1<="1111111";end case;end process p8;R1<=light(5); Y1<=light(4);G1<=light(3);R2<=light(2); Y2<=light(1);G2<=light(0);end arch;2.仿真波形:。