交通灯.docx
《交通灯.docx》由会员分享,可在线阅读,更多相关《交通灯.docx(12页珍藏版)》请在冰豆网上搜索。
![交通灯.docx](https://file1.bdocx.com/fileroot1/2023-5/29/61b6cfe9-93a3-46b9-8436-7794c20b9d10/61b6cfe9-93a3-46b9-8436-7794c20b9d101.gif)
交通灯
大规模专用集成电路实验课程设计
序言
VHDL全名Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年,是一种用于电路设计的高级语言。
VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。
目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
交通信号灯是我们在日常交通中非常常见。
它和我们的生活息息相关,对维持交通的正常秩序,保持道路畅通起到了非常重要的作用。
如果没有交通灯,交通道路将会混乱无序。
仅靠交警的维持,非常的耗费人力。
这对于快节奏的现代化社会来说,是非常不方便的。
应用VHDL以及FPGA,可以设计实用的交通等系统。
来解决这个问题。
一方案简介
设计出一套实用的交通灯系统,能够在十字路口控制东西和南北方向的通断。
四个方向每个方向有一套红灯,黄灯和绿灯。
其中,东西方向,为一组,统一控制。
南北方向为一组,统一控制。
每个方向有一个倒计时显示,时间统一控制。
二VHDL程序设计
程序采用状态机的设计思想,将交通灯的信号变化情况设计为S0,S1,S2,S3,S4五个状态,其中S0,S1,S2,S3为有效状态,S4为异常状态。
状态列表
状态
东西方向
南北方向
红灯
黄灯
绿灯
红灯
黄灯
绿灯
S0
0
0
1
1
0
0
S1
0
1
0
1
0
0
S2
1
0
0
0
0
1
S3
1
0
0
0
1
0
S4
1
0
0
1
0
0
注:
其中“1”表示有效,“0”表示无效
程序流程如下:
初始状态设为:
S0状态,东西方向绿灯亮,南北方向红灯亮。
开始计时,直到计时结束。
状态跳转到S1状态,东西方向黄灯亮,南北方向红灯亮。
开始计时,直到计时结束。
状态跳转到S2状态,东西方向红灯亮,南北方向绿灯亮。
开始计时,直到计时结束。
状态跳转到S3状态,东西方向红灯亮,南北方向黄灯亮。
开始计时,直到计时结束。
状态跳转到S0状态,东西方向绿灯亮,南北方向红灯亮。
如此往复循环。
当出现异常情况时,状态跳转到S4状态,即东西和南北方向均为红灯亮。
此时,如果要使系统恢复正常,只需要使reset信号有效,这样,系统就恢复到初始状态S0。
在倒计时的时候,系统会同时输出显示倒计时。
系统的状态转换图如下:
1)端口和信号
entitylightis
generic(green_cnt:
integer:
=60;-----绿灯倒计时
yellow_cnt:
integer:
=5);-----黄灯倒计时
port(clk,reset:
instd_logic;-----时钟信号和复位信号
ew_green:
outstd_logic;-----东西方向绿灯
ew_yellow:
outstd_logic;-----东西方向黄灯
ew_red:
outstd_logic;-----东西方向红灯
sn_green:
outstd_logic;-----南北方向绿灯
sn_yellow:
outstd_logic;-----南北方向黄灯
sn_red:
outstd_logic);-----南北方向红灯
endlight;
2)信号定义
architectureexoflightis
typestatesis(s0,s1,s2,s3,s4);-----状态定义
signalstate:
states:
=s0;
signalcnt:
integerrange1togreen_cnt;-----定义计数信号
signalenable_cnt:
std_logic:
='0';-----定义计数使能
begin
3)计数模块
ifreset='1'then
state<=s0;
elsifclk'eventandclk='1'then
ifenable_cnt='1'then
cnt<=cnt+1;
endif;
当reset无效,enable有效时,开始计数,每一个时钟周期,计数值加1
4)状态转换
u1:
process(clk,reset)
begin
ifreset='1'then
state<=s0;-----初始状态设为S0
elsifclk'eventandclk='1'then
ifenable_cnt='1'then
cnt<=cnt+1;
endif;
casestateis
whens0=>------状态S0时,当计数结束,状态跳转为S1
if(cnt=green_cnt)then
cnt<=1;cnt_led<=yellow_cnt;state<=s1;
endif;
whens1=>------状态S1时,当计数结束,状态跳转为S2
if(cnt=yellow_cnt)then
cnt<=1;cnt_led<=green_cnt;state<=s2;
endif;
whens2=>------状态S2时,当计数结束,状态跳转为S3
if(cnt=green_cnt)then
cnt<=1;cnt_led<=yellow_cnt;state<=s3;
endif;
whens3=>------状态S3时,当计数结束,状态跳转为S0
if(cnt=yellow_cnt)then
cnt<=1;cnt_led<=green_cnt;state<=s0;
endif;
whenothers=>-----其他情况下,状态跳转为S4
cnt<=1;state<=s4;
endcase;
endif;
endprocessu1;
5)各状态下信号灯状态
u2:
process(state)
begin
casestateis
whens0=>-----S0状态时东西绿灯亮,南北红灯亮
ew_green<='1';ew_yellow<='0';ew_red<='0';
sn_green<='0';sn_yellow<='0';sn_red<='1';
enable_cnt<='1';
if(cnt=green_cnt)then
enable_cnt<='0';
endif;
whens1=>-----S1状态时东西黄灯亮,南北红灯亮
ew_green<='0';ew_yellow<='1';ew_red<='0';
sn_green<='0';sn_yellow<='0';sn_red<='1';
enable_cnt<='1';
if(cnt=yellow_cnt)then
enable_cnt<='0';
endif;
whens2=>-----S2状态时东西红灯亮,南北绿灯亮
ew_green<='0';ew_yellow<='0';ew_red<='1';
sn_green<='1';sn_yellow<='0';sn_red<='0';
enable_cnt<='1';
if(cnt=green_cnt)then
enable_cnt<='0';
endif;
whens3=>-----S3状态时东西红灯亮,南北黄灯亮
ew_green<='0';ew_yellow<='0';ew_red<='1';
sn_green<='0';sn_yellow<='1';sn_red<='0';
enable_cnt<='1';
if(cnt=yellow_cnt)then
enable_cnt<='0';
endif;
whens4=>-----S4状态时东西红灯亮,南北红灯亮
ew_green<='0';ew_yellow<='0';ew_red<='1';
sn_green<='0';sn_yellow<='0';sn_red<='1';
enable_cnt<='1';
endcase;
endprocessu2;
三时序仿真结果
图3.1
图3.2
图3.3
由上面三幅图的时序仿真结果可以看到程序实现了设计要求,信号状态由S0,S1,S2,S3,S4周期性的循环。
四硬件测试
硬件测试用到了北京锐视的redcycloneII红色飓风二代开发板。
开发板使用的是Altera的Cyclone系列EP1C6Q240C8N。
由于此开发板只有四个二极管,不够东西南北两组信号灯所需六个二极管。
因此,测试时,每组用两个二极管,每次测试两个二极管分别对应每组的不同信号灯。
结果显示程序实现了设计要求
.图4.1,4.2,4.3是测试时所拍摄图片。
由于光线原因。
效果不是很好。
开发板中的二极管位于两个按键开关旁边。
光线为红色。
图4.1
图4.2
图4.3