⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pelian_contrller.txt

📁 红绿灯的控制
💻 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 + -