EDA报告交通灯控制器.docx
- 文档编号:6992840
- 上传时间:2023-01-15
- 格式:DOCX
- 页数:20
- 大小:290.96KB
EDA报告交通灯控制器.docx
《EDA报告交通灯控制器.docx》由会员分享,可在线阅读,更多相关《EDA报告交通灯控制器.docx(20页珍藏版)》请在冰豆网上搜索。
EDA报告交通灯控制器
天津工业大学
EDA课程设计报告
题目:
交通灯控制器
班级:
电子1301
学号:
姓名:
一、设计目的
1.了解交通灯的变化规律;
2.掌握VHDL编程语言,了解实际设计中的优化方案。
二、开发软件
QuartusII
三、设计任务及分析
1.设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。
2.红、绿、黄发光二极管作信号灯。
3.主干道处于常允许通行的状态,支干道有车来时才允许通行。
主干道亮绿灯时,支干道亮红灯;支干道亮绿灯时,主干道亮红灯。
4.主、支干道均有车时,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,设立45秒、25秒计时、显示电路。
5.在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡,使行驶中的车辆有时间停到禁行线外,设立5秒计时、显示电路。
题目分析:
根据题目要求可以知道,系统需要在几种不同的状态之间进行切换,为了设计的方便,并且实现高效率和高可靠的逻辑控制,这里我们采用状态机的方法进行设计。
四、设计方案
主控电路是一个单进程Moore型有限状态机,通过接收计数器发送的“时间到”(进位)信号以及根据s(用来指示支干道是否有车来,‘1’表示支干道没有车来,‘0’支干道有车来)的值进行状态的切换,实现对十字路口主干道、支干道两个方向的红、黄、绿灯状态的控制。
系统框图如图一所示。
图一系统整体框图
具体控制过程为:
当s=‘1’时,支干道没有车来,主干道处于常允许通行的状态,此时主干道亮绿灯,支干道亮红灯;当s=‘0’时,支干道有车来,即主、支干道均有车,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,且在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡。
变化规律为:
主干道绿灯亮,支干道红灯亮→主干道黄灯亮,支干道红灯亮→主干道红灯亮,支干道绿灯亮→主干道红灯亮,支干道黄灯亮→主干道绿灯亮,支干道红灯亮…,这样依次循环。
由于主、支干道有45秒和25秒的放行时间,以及每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡,所以设计45秒、25秒和5秒计时电路,均采用倒计时。
关于显示的问题,译码电路是把对应的二进制码直接转换成数码管显示时的码字,并且由于实验箱上采用的是8位数码管,所以必须采用数码管的动态扫描。
五、各模块功能介绍
1.顶层原理图及基本原理
如图1-1所示,系统时钟(48M)经过分频得到1HZ方波,为状态机和计数器提供时钟,lsdsn[5..0]六位总线分别表示主干道和支干道的绿灯、黄灯、红灯。
ledsn[5]:
主干道绿灯,ledsn[4]:
主干道黄灯,ledsn[3]:
主干道红灯,ledsn[2]:
支干道绿灯,ledsn[1]:
支干道黄灯,ledsn[0]:
支干道红灯。
当系统复位后,如果s输入一个低电平(主、支干道均有车时,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒)状态机进入s0,主控电路c45输出一个高电平使能45s倒计时计数器(此时主干道绿灯亮,支干道红灯亮);当计数结束后,45s倒计时计数器的cout输出一个进位信号,使状态机进入下一个状态s1,此时主控电路(状态机)c545输出一个高电平使能主干道5s倒计时计数器(此时主干道黄灯亮,支干道红灯亮);当计数结束后,5s倒计时计数器的cout输出一个进位信号,使状态机进入下一个状态s2,此时主控电路c25输出一个高电平使能25s倒计时计数器(此时主干道红灯亮,支干道绿灯亮);当计数结束后,25s倒计时计数器的cout输出一个进位信号,使状态机进入下一个状态s3,此时主控电路c525输出一个高电平使能支干道5s倒计时计数器(干道红灯亮,支干道黄灯亮);当计数结束后,5s倒计时计数器的cout输出一个进位信号,使状态机重新进入下一个状态s0,依次循环.....
当系统复位后,如果s输入一个高电平(主干道处于常允许通行的状态),此时状态机一直保持在s0状态。
图1-1顶层原理图
图1-2s=0时原理图仿真结果
当s=0时,表示主、支干道均有车时,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,从仿真波形图上可以看到,ledsn[5..0]分别表示主干道绿、黄、红灯,支干道绿、黄、红灯,当复位后,主干道绿灯(ledsn[5]=1),支干道红灯(ledsn[0]=1);计满45秒后进入下个状态,主干道黄灯(ledsn[4]=1),支干道红灯(ledsn[0]=1);计满5秒后进入下个状态,主干道红灯(ledsn[3]=1),支干道绿灯(ledsn[2]=1);计满25秒后进入下个状态,主干道红灯(ledsn[3]=1),支干道黄灯(ledsn[1]=1);计满5秒后进入下个状态,主干道绿灯(ledsn[5]=1),支干道红灯(ledsn[0]=1),依次循环.....(sg和bt为译码电路的仿真结果,在此可以忽略)
图1-3s=1时原理图仿真结果
当s=1时,表示主干道处于常允许通行的状态,此时从仿真图上可以看到
状态一直保持在主干道绿灯(ledsn[5]=1),支干道红灯(ledsn[0]=1)。
2.分频器
如图2-1所示,这次交通灯的设计用到了两个分频器,一个是将系统时钟进行48M分频得到1HZ的时钟提供给状态机和计数器;另一个分频器是将系统时钟进行48K分频得到1KHZ的时钟,给数码管动态显示模块作为扫频时钟用。
这里采用的是事先写好的通用程序,分频系数可以根据具体需要进行修改,在此只给出原理图及VHDL源代码。
图2-1分频器原理图
其VHDL代码如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.NUMERIC_BIT.ALL;--包含移位函数等.
ENTITYint_div2IS
GENERIC
(
F_DIV:
Integer:
=48000;--分频系数
F_DIV_WIDTH:
Integer:
=32--分频计数器宽度
);
PORT(
clock:
INSTD_LOGIC;
clock_out:
OUTSTD_LOGIC
);
END;
ARCHITECTUREoneOFint_div2IS
SIGNALclk_p_r:
STD_LOGIC;--上升沿输出时钟
SIGNALclk_n_r:
STD_LOGIC;--下降沿输出时钟
SIGNALcount_p:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);--上升沿脉冲计数器
SIGNALcount_n:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);--下降沿脉冲计数器
--SIGNALf_div_width_r:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);
SIGNALclock_out_r:
STD_LOGIC;
SIGNALfull_div_p:
STD_LOGIC;--上升沿计数满标志
SIGNALhalf_div_p:
STD_LOGIC;--上升沿计数半满标志
SIGNALfull_div_n:
STD_LOGIC;--下降沿计数满标志
SIGNALhalf_div_n:
STD_LOGIC;--下降沿计数半满标志
BEGIN
clock_out<=clock_out_r;
--clock_out<=clockWHEN(F_DIV=1)ELSE((clk_p_r='1'ANDclk_n_r='1')WHEN(F_DIV(0)='1')clk_p_r);
-------------------------<<判断计数标志位置位与否.
full_div_p<='1'WHEN(count_p half_div_p<='1'WHEN(count_p<(F_DIV/2)-1)ELSE'0'; full_div_n<='1'WHEN(count_n half_div_n<='1'WHEN(count_n<(F_DIV/2)-1)ELSE'0'; PROCESS(clock)--上升沿脉冲计数 --VARIABLEi: IntegerRANGE0TO31; BEGIN IFRISING_EDGE(clock)THEN IFfull_div_p='1'THEN count_p<=count_p+1; IF(half_div_p='1')THEN clk_p_r<='0'; ELSE clk_p_r<='1'; ENDIF; ELSE count_p<=(OTHERS=>'0'); clk_p_r<='0'; ENDIF; ENDIF; ENDPROCESS; PROCESS(clock)--下降沿脉冲计数 BEGIN IFFALLING_EDGE(clock)THEN IFfull_div_n='1'THEN count_n<=count_n+1; IFhalf_div_n='1'THEN clk_n_r<='0'; ELSE clk_n_r<='1'; ENDIF; ELSE count_n<=(OTHERS=>'0'); clk_n_r<='0'; ENDIF; ENDIF; ENDPROCESS; PROCESS(clock) BEGIN IFRISING_EDGE(clock)THEN IFF_DIV=1THEN clock_out_r<=clock; ELSE IF(F_DIVREM2)=1THEN clock_out_r<=clk_p_rANDclk_n_r; ELSE clock_out_r<=clk_p_r; ENDIF; ENDIF; ENDIF; ENDPROCESS; END; 3.主控电路(状态机) 主控电路是一个单进程的Moore型有限状态机,状态转换图如图3-1所示。 图3-1状态转换图 每种状态说明如下: 原状态 目的状态 转换条件 状态输出 s0 s1 s=’1’且s45=’1’ ledsn<="100001";c45<='1';c25<='0';c545<='0';c525<='0'; s1 s2 s545=’1’ ledsn<="010001";c45<='0';c25<='0';c545<='1';c525<='0'; s2 s3 s25=’1’ ledsn<="001100";c45<='0';c25<='1';c545<='0';c525<='0'; s3 s0 s525=’1’ ledsn<="001010";c45<='0';c25<='0';c545<='0';c525<='1'; 状态机原理图如图3-2所示。 图3-2状态机原理图 状态机仿真结果如图3-3所示。 图3-3状态机仿真结果 从仿真结果可以看到,满足状态转换条件后,状态机就会从现在的状态转移到下一个状态,具体的转换结果与上表相同。 其VHDL代码如下: libraryieee; useieee.std_logic_1164.all; entitytrafficis port(CLK,RST,s,s45,s25,s545,s525: instd_logic; c45,c25,c545,c525: outstd_logic; ledsn: outstd_logic_vector(5downto0)); endtraffic; architectureoneoftrafficis typesxis(s0,s1,s2,s3); signalcurrent_state: sx; begin process(RST,CLK) begin ifRST='1'then current_state<=s0;ledsn<="100001";c45<='1';c25<='0';c545<='0';c525<='0'; elsifCLK'eventandCLK='1'then casecurrent_stateis whens0=>ifs='1'thencurrent_state<=s0; elsifs45='1'thencurrent_state<=s1; elsecurrent_state<=s0;endif; ledsn<="100001";c45<='1';c25<='0';c545<='0';c525<='0'; whens1=>ifs545='1'thencurrent_state<=s2; elsecurrent_state<=s1;endif; ledsn<="010001";c45<='0';c25<='0';c545<='1';c525<='0'; whens2=>ifs25='1'thencurrent_state<=s3; elsecurrent_state<=s2;endif; ledsn<="001100";c45<='0';c25<='1';c545<='0';c525<='0'; whens3=>ifs525='1'thencurrent_state<=s0; elsecurrent_state<=s3;endif; ledsn<="001010";c45<='0';c25<='0';c545<='0';c525<='1'; endcase; endif; endprocess; endone; 4.45秒倒计时电路 45秒倒计时电路是一个45秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。 其原理图如图4-1所示。 图4-145秒计数器原理图 45秒倒计时电路的仿真结果如图4-2所示。 图4-245秒计数器仿真结果 其VHDL代码如下: libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entitycnt45is port(CLK,RST,EN: instd_logic; CQ: outstd_logic_vector(5downto0); cout: outstd_logic); end; architecturebehavofcnt45is begin process(CLK,RST,EN) variableCQI: std_logic_vector(5downto0); begin ifCLK'eventandCLK='1'then ifRST='1'thenCQI: ="101100"; elsifEN='1'then ifCQI>0thenCQI: =CQI-1;cout<='0'; elseCQI: ="101100";cout<='1'; endif; endif; endif; CQ<=CQI; endprocess; endbehav; 5.25秒倒计时电路 25秒倒计时电路是一个25秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。 其原理图如图5-1所示。 图5-125秒计数器原理图 25秒倒计时电路的仿真结果如图5-2所示。 图5-225秒计数器仿真结果 其VHDL代码如下: libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entitycnt25is port(CLK,RST,EN: instd_logic; CQ: outstd_logic_vector(4downto0); cout: outstd_logic); end; architecturebehavofcnt25is begin process(CLK,RST,EN) variableCQI: std_logic_vector(4downto0); begin ifCLK'eventandCLK='1'then ifRST='1'thenCQI: ="11000"; elsifEN='1'then ifCQI>0thenCQI: =CQI-1;cout<='0'; elseCQI: ="11000";cout<='1'; endif; endif; endif; CQ<=CQI; endprocess; endbehav; 6.5秒倒计时电路 5秒倒计时电路是一个5秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。 其原理图如图6-1所示。 图6-15秒计数器原理图 5秒倒计时电路的仿真结果如图6-2所示,由于交通灯没有对黄灯5秒的倒计时进行显示,所以没有添加计数输出的端口,只用到了进位端口,在仿真图中可以看到,每次5个计数脉冲之后计数器就会输出一个进位信号。 图6-25秒计数器仿真结果 其VHDL代码如下: libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entitycnt5is port(CLK,RST,EN: instd_logic; cout: outstd_logic); end; architecturebehavofcnt5is begin process(CLK,RST,EN) variableCQI: std_logic_vector(2downto0); begin ifCLK'eventandCLK='1'then ifRST='1'thenCQI: ="100"; elsifEN='1'then ifCQI>0thenCQI: =CQI-1;cout<='0'; elseCQI: ="100";cout<='1'; endif; endif; endif; endprocess; endbehav; 7.数码管动态扫描译码电路 数码管动态扫描译码电路如图7-1所示,此电路负责将主干道和支干道的45秒和25秒倒计时进行译码然后显示输出。 考虑到实验箱上的数码管位8位数码管,这里采用动态扫描的显示方式。 由于仿真结果并不能正确的看到数码管的输出结果,这里没有给出仿真图。 图7-1数码管动态扫描译码电路原理图 其VHDL代码如下: libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entitydecl7s4is port(clk: instd_logic; a45: instd_logic_vector(5downto0); a25: instd_logic_vector(4downto0); sg: outstd_logic_vector(6downto0); bt: outstd_logic_vector(3downto0)); end; architectureoneofdecl7s4is signalcnt4: std_logic_vector(2downto0); signala: std_logic_vector(5downto0); signala1: std_logic_vector(5downto0); signala2: std_logic_vector(5downto0); signala3: std_logic_vector(5downto0); signala4: std_logic_vector(5downto0); begin p0: process(a45) begin casea45is when"000000"=>a2<="000000";a1<="000000";---0 when"000001"=>a2<="000000";a1<="000001";---1 when"000010"=>a2<="000000";a1<="000010";---2 when"000011"=>a2<="000000";a1<="000011";---3 when"000100"=>a2<="000000";a1<="000100";---4 when"000101"=>a2<="000000";a1<="000101";---5 when"000110"=>a2<="000000";a1<="000110";---6 when"000111"=>a2<="000000";a1<="000111";---7 when"001000"=>a2<="000000";a1<="001000";---8 when"001001"=>a2<="000000";a1<="001001";---9 when"001010"=>a2<="000001";a1<="000000";---10 when"001011"=>a2<="000001";a1<="000001";---11 when"001100"=>a2<="000001";a1<="000010";---12 when"001101"=>a2<="000001";a1<="000011";---13 when"001110"=>a2<="000001";a1<="000100";---14 when"001111"=>a2<="000001";a1<="000101";---15 when"010000"=>a2<="000001";a1<="000110";---16 when
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 报告 交通灯 控制器