eda课程设计交通灯控制器的设计优秀文档.docx
- 文档编号:12244978
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:48
- 大小:492.53KB
eda课程设计交通灯控制器的设计优秀文档.docx
《eda课程设计交通灯控制器的设计优秀文档.docx》由会员分享,可在线阅读,更多相关《eda课程设计交通灯控制器的设计优秀文档.docx(48页珍藏版)》请在冰豆网上搜索。
eda课程设计交通灯控制器的设计优秀文档
eda课程设计交通灯控制器的设计优秀文档
(可以直接使用,可编辑优秀文档,欢迎下载)
EDA课程设计报告
题目交通灯控制器的设计
摘要
交通灯信号控制器通常要实现自动控制和手动控制其红绿灯的变化,基于FPGA设计的交通灯信号控制器电路简单、可靠性好。
本设计可控制2个路口的红、黄、绿三盏灯.让其按特定的规律进行变化。
利用QuartusⅡ对设计结果进行仿真,发现系统工作性能良好。
据此设计而成的硬件电路,也实现了控制要求。
关键词:
交通灯自动控制手动控制
1.概述
1.1课程设计目的
此次课程设计是根据《VHDL程序设计》这门课程开设的综合设计课程,要求学生利用VHDL编程语言,基于EDA开发平台Quartus
设计相应的数字系统,通过对系统进行编程、仿真、调试与实现,体验设计的全过程,进一步加深对所学基础知识的理解,培养学生将理论知识应用于实践的能力、学生自学与创新能力和分析解决实际问题的能力。
培养学生设计、绘图、计算机应用、文献查阅、实验研究、报告撰写等基本技能;提高学生独立分析和解决工程实际问题的能力;增强学生的团队协作精神、创新意识、严肃认真的治学态度和严谨求实的工作作风。
1.2课程设计题目及要求
交通灯控制器的设计:
随着各种交通工具的发展和交通指挥的需要,交通灯的诞生大大改善了城市交通状况。
要求设计一个交通灯控制器,假设某个交通十字路口是由一条主干道和一条次干道汇合而成,在每个方向设置红绿黄灯3种信号灯,红灯亮禁止通行,绿灯亮允许通行。
黄灯亮允许车辆有时间停靠到禁止线以外。
在自动控制模式时,主干道(东西)每次放行时间为30s,次干道(南北)每次放行时间为20s,主干道红灯、次干道黄灯、主干道黄灯、次干道红灯持续时间为5s。
绿灯转为红灯时,要求黄灯先亮5s,才能变换运行车道。
要求交通灯控制器有复位功能,并要求所有交通灯的状态变化在时钟脉冲上升沿处。
1.3实验环境
软件仿真采用QuartusII6.0;
硬件仿真采用KFH-1型CPLD/FPGA实验开发系统;
2.系统总体设计
根据设计要求和系统所具有的功能,并参考相关的文献资料,经行方案设计,可以画出如下述所示的交通信号灯控制器的系统流程图与系统框图。
我们选择按照自顶向下的层次化设计方法,整个系统可分为4个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。
2.2系统组成
其中系统时序发生电路最主要的功能就是产生一些额外的输出信号,它们是为红绿灯信号译码电路提供的频率39kHz的扫描信号,为定时控制电路提供的使能(enable)控制信号,为红绿灯信号译码电路提供的占空比为50%的秒闪烁信号;红绿灯计数时间选择模块是负责输出显示器需要的值(即倒数的秒数值),作为定时控制电路的倒计时秒数,在该模块中可设置东西路口河南北路口的信号灯维持秒数;定时控制电路功能就是负责接收红绿灯计数时间选择模块输出的值(即倒数的秒数值),然后将其转换成BCD码,利用七段显示器显示出来,让新人能清楚的知道再过多久就会变成红灯;红绿灯信号译码电路除了负责控制路口红绿灯的显示外,最主要的功能就是能够利用开关来切换手动与自动的模式,让交警能够通过外部输入的方式指挥交通的,但为了配合高峰时段,防止交通拥挤,有时还必须使用手动红字,即让交警执行指挥交通。
为了系统正常运作,整个控制器采用同步工作方式,由外接信号发生器(该电路的设计可参见本章)提供1Hz的时钟信号CLK。
3.系统层次化设计与软件仿真
EDA技术的基本设计方法有电路设计方法和系统设计方法。
电路级设计方法已经不能适应新的形势,本系统采用的是系统级层次设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片FPGA芯片实现,首先用VHDL语言编写各个功能模块程序,最后通过综合器和适配器生成最终的目标器件,然后用顶层原理图将各功能模块连接起来。
下面给出各模块的VHDL设计过程和仿真结果。
3.1系统时序发生电路
在红绿灯交通信号控制系统中,大多数的情况是通过自动控制的方式指挥交通的。
因此,为了避免意外事件的发生,电路必须有一个稳定的时钟(clock)才能让系统正常工作。
但为了配合高峰时段,防止交通拥挤,有时也必须使用手动可能工资,即让交警能够顺利的指挥交通。
CLK_gen电路最主要的功能就是产生一些额外的输出信号,并将其用作后续几个电路的使用(enable)控制与同步信号处理。
该电路的核心部分就是分频电路,通过对外接信号发生器提供1Hz的时钟信号进行1000分频,得到一个周期1s的输出使能信号ena_1Hz(占空比1:
1000)和flash_Hz(占空比1:
1);1024分频后得到红绿灯信号译码电路所需要的频率为39kHz的显示使能信号ena_scan。
VHDL源代码:
LIBRARYIEEE;
ENTITYclk_genIS
Port(reset:
instd_logic;
clk:
instd_logic;
ena_scan:
outstd_logic;
ena_1Hz:
outstd_logic;
flash_1Hz:
outstd_logic);
end;
ARCHITECTUREBEHAVIORofclk_genIS
CONSTANTscan_bit:
positive:
=10;
CONSTANTscan_val:
positive:
=1024;
CONSTANTtwo_Hz_bit:
positive:
=15;
CONSTANTtwo_Hz_val:
positive:
=19532;
signalclk_scan_ff:
std_logic_vector(scan_bit-1downto0);
signalclk_2Hz_ff:
std_logic_vector(two_Hz_bit-1downto0);
signalena_s,ena_one,ena_two:
std_logic;
begin
scan:
process(clk,reset)
begin
ifreset='1'then
clk_scan_ff<="000000000";
ena_s<='0';
elsif(clk'eventandclk='1')then
ifclk_scan_ff>=scan_val-1then
clk_scan_ff<="000000000";
ena_s<='1';
else
clk_scan_ff<=clk_scan_ff+1;
ena_s<='0';
endif;
endif;
endprocess;
ena_scan<=ena_s;
two_Hz:
process(reset,clk,ena_s)
begin
ifreset='1'then
ena_one<='0';
ena_two<='0';
clk_2Hz_ff<="0000000000000";
elsif(clk'eventandclk='1')then
ifena_s='1'then
ifclk_2Hz_ff>=two_Hz_val-1then
clk_2Hz_ff<="0000000000000";
ena_two<='1';
ena_one<=notena_one;
else
clk_2Hz_ff<=clk_2Hz_ff+1;
ena_two<='0';
endif;
endif;
endif;
endprocess;
ena_1Hz<=ena_oneandena_twoandena_s;
flash_1Hz<=ena_one;
endBEHAVIOR;
系统时序发生电路clk_gen的仿真输出波形和元件符号
系统时序发生电路clk_gen的仿真输出波形
图3-1系统时序发生电路CLK_GEN
3.2红绿灯计数时间选择模块
当过马路的时候,绿灯的一方又是会附加一个显示器告诉行人,目前还剩下几秒信号灯将变成红灯。
因此,traffic_mux电路最主要的功能就是负责输出显示器需要的值(即倒数的秒值数),作为定时控制电路的技术秒数。
该电路的核心部分就是数据选择电路,利用选择语句case_when(单输入,多输出)实现4选1,其选择输入信号sign_state是红绿灯信号译码电路产生的4种状态信号,状态转换输出表如表3-2所示。
状态sign_state
东西路口
南北路口
时间(s)
00(状态0)
东西路口为通行状态,此时东西路口绿灯亮
南北路口红灯亮
30
01(状态1)
东西路口为过渡状态,此时东西路口黄灯亮
南北路口红灯亮
5
10(状态2)
东西路口红灯亮
南北路口为通行状态,此时南北路口绿灯亮
20
11(状态3)
东西路口红灯亮
南北路口为过渡状态,此时南北路口黄灯亮
5
表3-2红绿灯计数时间状态转换表
VHDL源代码:
LIBRARYIEEE;
ENTITYtraffic_muxIS
PORT(reset,clk,ena_scan,recount:
instd_logic;
sign_state:
instd_logic_vector(1downto0);
load:
outstd_logic_vector(7downto0));
end;
ARCHITECTUREBEHAVIORoftraffic_muxIS
CONSTANTyellow0_time:
integer:
=5;
CONSTANTgreen0_time:
integer:
=30;
CONSTANTyellow1_time:
integer:
=5;
CONSTANTgreen1_time:
integer:
=20;
begin
load_time:
process(reset,clk)
begin
ifreset='1'then
load<="00000000";
elsif(clk'eventandclk='1')then
if(ena_scan='1'andrecount='1')then
CASEsign_stateIS
WHEN"00"=>load<=CONV_STD_LOGIC_VECTOR(green0_time,8);
WHEN"01"=>load<=CONV_STD_LOGIC_VECTOR(yellow0_time,8);
WHEN"10"=>load<=CONV_STD_LOGIC_VECTOR(green1_time,8);
WHENOTHERS=>load<=CONV_STD_LOGIC_VECTOR(yellow1_time,8);
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
ENDBEHAVIOR;
3.2.2计数时间选择模块traffic_mux的仿真输出波形和元件符号
计数时间选择模块traffic_mux的仿真输出波形
3.3定时控制电路
该电路的核心部分是可置数的减法计数器电路和七段译码输出显示电路。
可置数的减法计数器电路是利用if_then_else语句完成,两位七段译码输出显示电路则利用case_when语句通过查表的方式构成。
VHDL源代码:
LIBRARYIEEE;
USEIEEE.std_logic_1164.all;
ENTITYcount_downIS
Port(reset,clk,ena_1Hz,recount:
instd_logic;
load:
instd_logic_vector(7downto0);
seg7:
outstd_logic_vector(15downto0);
next_state:
outstd_logic);
end;
ARCHITECTUREBEHAVIORofcount_downIS
signalcnt_ff:
std_logic_vector(7downto0);
begin
count:
process(clk,reset)
begin
if(reset='1')then
cnt_ff<="00000000";seg7<="0000000000000000";
elsif(clk'eventandclk='1')then
ifena_1Hz='1'then
if(recount='1')then
cnt_ff<=load-1;
else
cnt_ff<=cnt_ff-1;
endif;
endif;
caseconv_integer(cnt_ff)is
when38=
endcase;
endif;
endprocess;
next_state<='1'whencnt_ff=1else'0';
endBEHAVIOR;
定时控制电路count_down的仿真输出波形和元件符号
定时控制电路count_down的仿真输出波形
3.4红绿灯信号译码电路
在红绿灯交通灯信号系统中,大多数的情况是通过自动控制的方式指挥交通的。
但为了配合高峰时段,防止交通拥挤,有时还必须使用手动控制,即让交警自行指挥交通。
因此,traffic_fsm电路除了负责监控路口红绿灯之外,最主要的功能就是能够利用开关来切手动与自动的模式,让交警能够通过外部输入的方式来控制红绿灯信号系统的运作。
输出信号:
recount(产生重新计数的输出使能控制信号)、sign_state(产生的输出状态信号共2位,4种状态)、red(负责红灯的显示,共2位,4种状态)、green(负责绿灯的显示,共2位,4种状态)、yelllow(负责黄灯的显示,共2位,4种状态)。
设南北路口红黄绿3色灯为r0、y0、g0,东西路口的红黄绿3色灯为r1、y1、g1,自动操作模式和手动操作模式信号灯显示的真值表如表3-2、表3-3所示。
信号灯显示的真值表
CLK
reset
ena_1hz
next_stage
state状态
sign_stage
recount
light
state1
1
X
X
r0g1
00
1
010010
state2
0
1
1
r0g1->roy1
01
1
011000
0
1
0
r0g1
00
0
010010
state3
0
1
1
r0y1->g0r1
10
1
100001
0
1
0
r0y1
01
0
011000
state4
0
1
1
g0r1->y0r1
11
1
100100
0
1
0
g0r1
10
0
100001
state5
0
1
1
y0r1->r0g1
00
1
010010
0
1
0
y0r1
11
0
100100
state6
0
1
1
others
00
0
110000
表中定义了一些进程(process)间整体共享的电路内部传递信号,以整合所有功能,它们是:
state信号(设定红绿灯电路的状态,在该程序里定义8种状态)、st_transfer(在手动模式下判断是否转态的控制信号)、light[5:
0](在自动模式下该信号为是否转态的控制信号,其位数从高到低分别表示red1、red0、yellow1、yellow0、green1、green0)。
VHDL源代码:
LIBRARYIEEE;
USEIE
ENTITYtraffic_CONIS
Port(reset,clk,ena_scan,ena_1Hz,flash_1Hz,a_m,st_butt,next_state:
instd_logic;
recount:
outstd_logic;
sign_state:
outstd_logic_vector(1downto0);
red:
outstd_logic_vector(1downto0);
green:
outstd_logic_vector(1downto0);
yellow:
outstd_logic_vector(1downto0));
end;
ARCHITECTUREBEHAVIORoftraffic_CONIS
typeSreg0_typeis(r0g1,r0y1,g0r1,y0r1,y0y1,y0g1,g0y1,r0r1);
signalstate:
Sreg0_type;
signalst_transfer:
std_logic;
signallight:
std_logic_vector(5downto0);
begin
rebounce:
process(reset,clk,ena_scan,st_butt)
variablerebn_ff:
std_logic_vector(5downto0);
begin
if(st_butt='1'orreset='1')then
rebn_ff:
="111111";st_transfer<='0';
elsif(clk'eventandclk='1')then
if(ena_scan='1')then
if(rebn_ff>=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';
endif;
endif;
endif;
endprocess;
CON:
process(clk,ena_1Hz,reset)
begin
If(reset='1')then
state<=r0g1;sign_state<="00";recount<='1';
else
if(clk'eventandclk='1')then
caseSTATEis
whenr0g1=>
if(a_m='1'andena_1Hz='1')then
if(next_state='1')then
recount<='1';state<=r0y1;sign_state<="01";
else
recount<='0';state<=r0g1;
endif;
elsif(a_m='0'andena_scan='1')then
if(st_transfer='0')then
recount<='1';state<=r0g1;
else
recount<='1';state<=r0y1;sign_state<="01";
endif;
endif;
whenr0y1=>
if(a_m='1'andena_1Hz='1')then
if(next_state='1')then
recount<='1';state<=g0r1;sign_state<="10";
else
recount<='0';state<=r0y1;
endif;
elsif(a_m='0'andena_scan='1')then
if(st_transfer='0')then
recount<='1';state<=r0y1;
else
recount<='1';state<=g0r1;sign_state<="10";
endif;
endif;
wheng0r1=>
if(a_m='1'andena_1Hz='1')then
if(next_state='1')then
recount<='1';state<=y0r1;sign_state<="11";
else
recount<='0';state<=g0r1;
endif;
elsif(a_m='0'andena_scan='1')then
if(st_transfer='0')then
recount<='1';state<=g0r1;
else
recount<='1';state<=y0r1;sign_state<="11";
endif;
endif;
wheny0r1=>
if(a_m='1'andena_1Hz='1')then
if(next_state='1')then
recount<='1';state<=r0g1;sign_state<="00";
else
recount<='0';state<=y0r1;
endif;
elsif(a_m='0'andena_scan='1')then
if(st_transfer='0')then
recount<='1';state<=y0r1;
else
recount<='1';state<=r0g1;sign_state<="00";
endif;
endif;
whenothers=>
state<=r0g1;recount<='0';sign_state<="00";
endcase;
endif;
endif;
endprocess;
light<="010010"when(state=r0g1)else
"011000"when(state=r0y1)else
"100001"when(state=g0r1)else
"100100"when(state=y0r1)else
"010010"when(state=r0g1)else
"110000";
red<=light(5downto4);
yellow<=light(3downto2);
green<=light(1downto0);
endBEHAVIOR;
信号译码电路
信号译码电路traffic_CON的仿真输出波形
在源程序中,利用类别的定义格式Typetype_nameistype_mark,将所有红绿灯交通信号系统发生的状况利用类别(type)的定义格式一一列举出来(程序中共定义了8种情况),信号线state的设置的目的是将sreg0_type定义的8种状况转换成位的方式表示。
程序包含两个进程debounce、con。
进程debounce是抖动清除电路,其重点在于st_transfer何时为1.当外部按下st_butt键时(即st_buff=0),内部的计数器rebn_ff开始计数(3f-02),在rebn_ff尚未数到02秒时,st_butt键被松开,那么状态将不会改变。
假如是由于电路效应引起开关误动作,开关抖动的速度是非常快的(约小于1ms),故电路不会有误动作的产生,也就达到了这个抖动消除的目的。
进程con是红绿灯状态控制器和红绿灯闪烁控制器。
3.5红绿灯交通控制器顶层电
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- eda 课程设计 交通灯 控制器 设计 优秀 文档