📄 pelian_contrller.txt
字号:
-- Pelican Crossing Controller
-- dowload from: www.fpga.com.cn & www.pld.com.cn
library ieee;
use ieee.std_logic_1164.all;
entity pelcross is
port(clock, reset, pedestrian : in std_logic;
red, amber, green : out std_logic); --traffic lights
end pelcross;
architecture v1 of pelcross is
signal en, st, mt, lt, fr : std_logic;
begin
--timer for light sequence
interval_timer : block
constant stime : natural := 50;
constant mtime : natural := 80;
constant ltime : natural := 200;
signal tcount : natural range 0 to ltime;
begin
process begin
wait until rising_edge(clock);
if (en = '0') or (tcount = ltime) then
tcount <= 0;
else
tcount <= tcount + 1;
end if;
end process;
st <= '1' when tcount = stime else '0';
mt <= '1' when tcount = mtime else '0';
lt <= '1' when tcount = ltime else '0';
end block;
--free running timer for amber flashing
free_run : block
constant frtime : natural := 5;
signal frcount : natural range 0 to frtime;
begin
process begin
wait until rising_edge(clock);
if frcount = frtime then
frcount <= 0;
else
frcount <= frcount + 1;
end if;
end process;
fr <= '1' when frcount = frtime else '0';
end block;
--moore state machine to control light sequence
controller : block
type peltype is (res, stop, amb, amb_on, amb_off, grn, ped);
signal pelstate : peltype;
begin
process(clock, reset)
begin
if reset = '1' then
pelstate <= res;
elsif rising_edge(clock) then
case pelstate is
when res => pelstate <= stop;
when stop => if lt = '1' then
pelstate <= amb;
else
pelstate <= stop;
end if;
when amb => pelstate <= amb_on;
when amb_on => if mt = '1' then
pelstate <= grn;
elsif fr = '1' then
pelstate <= amb_off;
else
pelstate <= amb_on;
end if;
when amb_off => if mt = '1' then
pelstate <= grn;
elsif fr = '1' then
pelstate <= amb_on;
else
pelstate <= amb_off;
end if;
when grn => if pedestrian = '1' then
pelstate <= ped;
else
pelstate <= grn;
end if;
when ped => if st = '1' then
pelstate <= res;
else
pelstate <= ped;
end if;
when others => pelstate <= res;
end case;
end if;
end process;
--moore outputs
with pelstate select
en <= '1' when stop|amb_on|amb_off|ped,
'0' when others;
with pelstate select
red <= '1' when res|stop,
'0' when others;
with pelstate select
amber <= '1' when amb|amb_on|ped,
'0' when others;
with pelstate select
green <= '1' when grn,
'0' when others;
end block;
end v1;
--Pelican Crossing Controller test bench
library ieee;
use ieee.std_logic_1164.all;
entity peltest is
end peltest;
architecture v1 of peltest is
signal clock, reset, pedestrian, red, amber, green : std_logic;
component pelcross is
port(clock, reset, pedestrian : in std_logic;
red, amber, green : out std_logic); --traffic lights
end component;
begin
--10 Hz clock generator
process begin
clock <= '0', '1' after 50 ms;
wait for 100 ms;
end process;
--test inputs
process begin
pedestrian <= '0';
reset <= '1';
wait for 300 ms;
reset <= '0';
wait for 40000 ms;
pedestrian <= '1';
wait for 200 ms;
pedestrian <= '0';
wait;
end process;
pelican : pelcross port map (clock, reset, pedestrian,
red, amber, green);
end v1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -