西电通院VHDL交通灯大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西电通院VHDL大作业
交通灯控制器
一、设计要求
设计一个十字路口交通控制系统,要求如下:
(1)东西(用A表示),南北(用B表示)方向均有绿灯、黄灯、红灯指示,其持续时间分别是60秒,5秒,65秒。
(2)系统设有时钟,以倒计时方式显示每一路允许同行的时间。
(3)当东西或南北两路中任一路出现特殊情况,系统可由交警手动控制立即进入特殊状态,即红灯全亮,时钟停止计时,当特殊行状态结束,系统恢复工作,继续照常运行。
二、确定状态数
S0:A方向绿灯亮,B方向红灯亮,此状态持续60s;
S1:A方向黄灯亮,B方向红灯亮,此状态持续5s;
S2:A方向红灯亮,B方向绿灯亮,此状态持续60s;
S3:A方向绿灯亮,B方向黄灯亮,此状态持续5s;
S4:紧急制动状态,A方向红灯亮,B方向红灯亮,当紧急制动信号有效时(hold=’0’)进入这种状态。
当紧急制动信号无效时(hold=’0’),状态机按照s0—s1—s2—s3—s0循环;当紧急制动有效时(hold=’0’),状态机立即进入s4,俩个方向红灯全亮,计数器停止计数。
三、编写源代码,编译等
第一进程:复位,检测时钟上升沿,完成状态切换current_state<=nest_state
第二进程:检测控制器当前输入和状态变化,用case语句决定控制器的状态和当前输出。源代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity control is
port(
clk,hold:in std_logic;
ared,agreen,ayellow,bred,bgreen,byellow:out std_logic
);
end control;
architecture behave of control is
type state_type is(s0,s1,s2,s3,s4);
signal current_state,next_state:state_type;
signal counter:std_logic_vector(6 downto 0);
begin
synch:process
begin
wait until clk'event and clk='1';
if hold='0' then
counter<=counter;
else
if counter<129 then
counter<=counter+1;
else
counter<=(others=>'0');
end if;
end if;
end process;
process
begin
wait until clk'event and clk='1';
current_state<=next_state; end process;
state_trans:process(current_state) begin
case current_state is
when s0=>
if hold='0'then
next_state<=s4;
else
if counter<59 then
next_state<=s0;
else
next_state<=s1;
end if;
end if;
when s1=>
if hold='0'then
next_state<=s4;
else
if counter<64 then
next_state<=s1;
else
next_state<=s2;
end if;
end if;
when s2=>
if hold='0'then
next_state<=s4;
else
if counter<124 then
next_state<=s2;
else
next_state<=s3;
end if;
end if;
when s3=>
if hold='0'then
next_state<=s4;
else
if counter<129 then
next_state<=s3;
else
next_state<=s0;
end if;
end if;
when s4=>
if hold='0'then
next_state<=s4;
else
if counter<59 then
next_state<=s0;
elsif counter<64 then
next_state<=s1;
elsif counter<124then
next_state<=s2;
elsif counter<129 then
next_state<=s3;
end if;
end if;
end case;
end process;
output:process(current_state) begin
case current_state is
when s0=>
ared<='0';
agreen<='1';
ayellow<='0';
bred<='1';
bgreen<='0';
byellow<='0';
when s1=>
ared<='0';
agreen<='0';
ayellow<='1';
bred<='1';
bgreen<='0';