📄 vhdl_2.txt
字号:
交通灯控制
技术指标
(1)车辆直行时不允许车辆左拐行驶,但右拐可以同时进行,必须设有专门的左拐时间。
(2)车辆直行以及车辆左拐交替通行,直行时间绿灯每次放行60秒,车辆左拐每次放行30秒。
(3)绿灯亮表示可通行.红灯亮表示禁止通行。
(4)直行车辆每次绿灯变红灯时.黄灯先亮5秒。
(5)十字路口要有数字显示,作为等候时间提示。要求各通道的通行时间及黄灯亮的时间均以秒为单位作减计数。
(6)设置行人过马路的红绿灯。
(7)增加紧急情况处理,允许急救车优先通过要求,当有急救车通过时,路口信号灯全部变红,倒计时停止计数,以便让急救车通过。急救车通过后,交通灯恢复原先状态。
entity traffic_control is ------------------------------状态机
port(
clk: in std_logic;
-- reset: in std_logic;
NS_green,NS_red,NS_yellow :out std_logic;
NS_green_left,NS_red_left :out std_logic;
NS_people_green,NS_people_red:out std_logic;
WE_green,WE_red,WE_yellow :out std_logic;
WE_green_left,WE_red_left :out std_logic;
WE_people_green,WE_people_red:out std_logic;
data :out std_logic_vector(1 downto 0)
);
end traffic_control;
architecture behave of traffic_control is
type states is(S00,S01,S10,S11,S2,S3);
signal state :states;
begin
process(clk)
variable counter :integer range 0 to 59;
variable cr,cnt :std_logic;
begin
-- if reset='1' then
-- state<=S00;
if (clk'event and clk='1') then
if cr='0' then
counter:=0;
elsif cnt='0' then
counter:=counter;
else
counter:=counter+1;
end if;
case state is
when S00=>
data<="00";
NS_green<='1';
NS_red<='0';
NS_yellow<='0';
NS_green_left<='0';
NS_red_left<='1';
NS_people_green<='1';
NS_people_red<='0';
WE_green<='0';
WE_red<='1';
WE_yellow <='0';
WE_green_left<='0';
WE_red_left <='1';
WE_people_green<='0';
WE_people_red<='1';
if counter=59 then
data<="01";
state<=S01;
cr:='0';
cnt:='0';
else
state<=S00;
cr:='1';
cnt:='1';
end if;
when S01=>
data<="01";
NS_green<='0';
NS_red<='0';
NS_yellow<='1';
NS_green_left<='0';
NS_red_left<='1';
NS_people_green<='1';
NS_people_red<='0';
WE_green<='0';
WE_red<='1';
WE_yellow <='0';
WE_green_left<='0';
WE_red_left <='1';
WE_people_green<='0';
WE_people_red<='1';
if counter=4 then
data<="00";
state<=S10;
cr:='0';
cnt:='0';
else
state<=S01;
cr:='1';
cnt:='1';
end if;
when S10=>
data<="00";
NS_green<='0';
NS_red<='1';
NS_yellow<='0';
NS_green_left<='0';
NS_red_left<='1';
NS_people_green<='0';
NS_people_red<='1';
WE_green<='1';
WE_red<='0';
WE_yellow <='0';
WE_green_left<='0';
WE_red_left <='1';
WE_people_green<='1';
WE_people_red<='0';
if counter=59 then
data<="01";
state<=S11;
cr:='0';
cnt:='0';
else
state<=S10;
cr:='1';
cnt:='1';
end if;
when S11=>
data<="01";
NS_green<='0';
NS_red<='1';
NS_yellow<='0';
NS_green_left<='0';
NS_red_left<='1';
NS_people_green<='0';
NS_people_red<='1';
WE_green<='0';
WE_red<='0';
WE_yellow <='1';
WE_green_left<='0';
WE_red_left <='1';
WE_people_green<='1';
WE_people_red<='0';
if counter=4 then
data<="10";
state<=S2;
cr:='0';
cnt:='0';
else
state<=S11;
cr:='1';
cnt:='1';
end if;
when S2=>
data<="10";
NS_green<='0';
NS_red<='1';
NS_yellow<='0';
NS_green_left<='0';
NS_red_left<='1';
NS_people_green<='0';
NS_people_red<='1';
WE_green<='0';
WE_red<='1';
WE_yellow <='0';
WE_green_left<='1';
WE_red_left <='0';
WE_people_green<='0';
WE_people_red<='1';
if counter=29 then
data<="11";
state<=S3;
cr:='0';
cnt:='0';
else
state<=S2;
cr:='1';
cnt:='1';
end if;
when S3=>
data<="11";
NS_green<='0';
NS_red<='1';
NS_yellow<='0';
NS_green_left<='1';
NS_red_left<='0';
NS_people_green<='0';
NS_people_red<='1';
WE_green<='0';
WE_red<='1';
WE_yellow <='0';
WE_green_left<='0';
WE_red_left <='1';
WE_people_green<='0';
WE_people_red<='1';
if counter=29 then
data<="00";
state<=S00;
cr:='0';
cnt:='0';
else
state<=S3;
cr:='1';
cnt:='1';
end if;
end case;
end if;
end process;
end behave;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -