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

📄 交通灯.txt

📁 推荐题目要求:1.主、支路无车时主干路“绿”;    2.若主、支路均有车时
💻 TXT
字号:
自己用VHDL语言写的交通灯控制器,在实验板上能运行,可以应付老师的检查了2006-10-16 19:55:00
1
推荐题目要求:1.主、支路无车时主干路“绿”;

   2.若主、支路均有车时,主干路绿45S,支路绿25S,绿灯结束时黄灯亮5S;

   3.主、支路传感器信号用按键传递,高电平表示有车。

设计程序清单如下:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY jtd IS
 PORT (clk,msensor,ssensor : IN STD_LOGIC;
   mr,mg,sr,sg : OUT STD_LOGIC ; --,showbt
   showbt : OUT STD_LOGIC_VECTOR (1 DOWNTO 0); --显示位控制
   mmy,ssy : BUFFER STD_LOGIC;
   show : OUT STD_LOGIC_VECTOR (6 DOWNTO 0)
   ); --show : OUT STD_LOGIC_VECTOR (6 DOWNTO 0) 
END jtd ;
ARCHITECTURE one OF jtd IS
 TYPE state_type IS (A,B,C,D);
 SIGNAL state : state_type;
 SIGNAL secclk,yellowsec,my,sy : STD_LOGIC;
 SIGNAL showclk : STD_LOGIC_VECTOR (1 DOWNTO 0); --后加,LED显示时钟
 SIGNAL showdata1,showdata0 : INTEGER RANGE 0 TO 45;
 SIGNAL datasignal : INTEGER RANGE 0 TO 9;
 BEGIN
getclk: PROCESS ( clk )
  VARIABLE clkcount : INTEGER RANGE 0 TO 2; --LED位扫描信号
  VARIABLE sclk : INTEGER RANGE 0 TO 600; --秒信号
  VARIABLE yellowcou : INTEGER RANGE 0 TO 200; --黄灯闪烁信号
  BEGIN
  IF clk'EVENT AND clk = '1' THEN
   clkcount := clkcount + 1;
   sclk := sclk + 1;
   yellowcou := yellowcou + 1;
   IF clkcount = 2 THEN
    showclk <= showclk + '1';
   END IF;
   IF sclk = 600 THEN
    secclk <= '1';
   ELSE secclk <= '0';
   END IF;
   IF yellowcou = 200 THEN
    yellowsec <= '1';
   ELSE yellowsec <= '0';
   END IF;
  END IF;
  END PROCESS getclk;
jtdp: PROCESS (secclk) 
  VARIABLE cnt : INTEGER RANGE 0 TO 45;
   VARIABLE nclr : BIT; --nclr低电平计数器清零
  BEGIN
   IF ( secclk'EVENT AND secclk = '1' ) THEN
    IF nclr = '0' THEN cnt := 0; --同步清零
    ELSE cnt := cnt + 1; --如果nclr不等于零,则计数
    END IF;
 --END IF;记住
    CASE state IS
     WHEN A => mr <= '0'; my <= '0'; mg <= '1'; --A状态,主干道绿灯mg亮
       sr <= '1'; sy <= '0'; sg <= '0'; showdata1 <= 45 - cnt; showdata0 <= 50 -cnt;
       IF ( msensor AND ssensor ) = '1' THEN
        IF cnt = 45 THEN
         state <= B; nclr := '0';
        ELSE state <= A; nclr := '1'; --继续状态A
        END IF;
       ELSIF (ssensor AND (NOT msensor)) = '1' THEN --若只有之路有车
        state <= B; nclr := '0';
       ELSE state <= A; nclr := '1'; --继续A状态
        IF cnt = 45 THEN cnt := 0; nclr := '0'; --防止计数超过45
        END IF;
       END IF;
     WHEN B =>  mr <= '0'; my <= '1'; mg <= '0'; --B状态,主干道黄灯my亮
       sr <= '1'; sy <= '0'; sg <= '0'; showdata1 <= 5 - cnt; showdata0 <=5 - cnt;
       IF cnt = 5 THEN
        state <= C; nclr := '0';
       ELSE state <= B; nclr := '1';
       END IF;
     WHEN C => mr <= '1'; my <= '0'; mg <= '0'; --C状态,之路绿灯sg亮
       sr <= '0'; sy <= '0'; sg <= '1'; showdata1 <= 30 - cnt; showdata0 <= 25 - cnt;
       IF ( msensor AND ssensor ) = '1' THEN
        IF cnt = 25 THEN
         state <= D; nclr := '0';
        ELSE state <= C; nclr := '1';
        END IF;
       ELSIF ssensor = '0' THEN --若之路无车
        state <= D; nclr := '0'; --则为D状态
       ELSE
        state <= C; nclr := '1';
        IF cnt = 25 THEN
         cnt := 0; nclr := '0';
        END IF;
       END IF;
     WHEN D => mr <= '1'; my <= '0'; mg <= '0'; --D状态,之路黄灯sy亮
       sr <= '0'; sy <= '1'; sg <= '0'; showdata1 <= 5 - cnt; showdata0 <= 5 - cnt;
       IF cnt = 5 THEN
        state <= A; nclr := '0';
       ELSE
        state <= D; nclr := '1';
       END IF;
    END CASE;
   END IF;
   END PROCESS jtdp;
  showp1: PROCESS ( showclk )
   VARIABLE data1,data0,data2,data3 : INTEGER RANGE 0 TO 9;
   BEGIN
    IF showdata1 >= 50 THEN --主路计数显示
     data1 := 5; data0 := showdata1 - 50;
    ELSIF showdata1 >= 40 THEN
     data1 := 4; data0 := showdata1 - 40;
    ELSIF showdata1 >= 30 THEN
     data1 := 3; data0 := showdata1 - 30;
    ELSIF showdata1 >= 20 THEN
     data1 := 2; data0 := showdata1 - 20;
    ELSIF showdata1 >= 10 THEN
     data1 := 1; data0 := showdata1 - 10;
    ELSE data1 := 0; data0 := showdata1;
    END IF;
    IF showdata0 >= 50 THEN
     data3 := 5; data2 := showdata0 - 50;
    ELSIF showdata0 >= 40 THEN
     data3 := 4; data2 := showdata0 - 40;
    ELSIF showdata0 >= 30 THEN
     data3 := 3; data2 := showdata0 - 30;
    ELSIF showdata0 >= 20 THEN
     data3 := 2; data2 := showdata0 - 20;
    ELSIF showdata0 >= 10 THEN
     data3 := 1; data2 := showdata0 - 10;
    ELSE data3 := 0; data2 := showdata0;
    END IF;
    


   CASE showclk IS
    WHEN "00" => showbt <= "00"; datasignal <= data2;
    WHEN "01" => showbt <= "01"; datasignal <= data3;
    WHEN "10" => showbt <= "10"; datasignal <= data0;
    WHEN "11" => showbt <= "11"; datasignal <= data1;
    WHEN OTHERS => NULL;
   END CASE;
  END PROCESS;
showp2: PROCESS ( datasignal )
  BEGIN
   CASE datasignal IS
    WHEN 0 => show <= "0111111";
    WHEN 1 => show <= "0000110";
    WHEN 2 => show <= "1011011";
    WHEN 3 => show <= "1001111";
    WHEN 4 => show <= "1100110";
    WHEN 5 => show <= "1101101";
    WHEN 6 => show <= "1111101";
    WHEN 7 => show <= "0000111";
    WHEN 8 => show <= "1111111";
    WHEN 9 => show <= "1101111";
    WHEN OTHERS => NULL;
   END CASE;
  END PROCESS showp2;
yellow: PROCESS (yellowsec)
  BEGIN
   IF yellowsec'EVENT AND yellowsec ='1' THEN
    IF my = '1' THEN
     mmy <= not mmy;
    END IF;
    IF sy = '1' THEN
     ssy <= not ssy;
    END IF;
   END IF;
  END PROCESS;
END one;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -