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

📄 dianti.txt

📁 VHDL程序电梯控制器。可完成6层楼的电梯控制。
💻 TXT
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY DIANTI IS
    PORT(CLK,RST:IN STD_LOGIC;   
         INNER_F1,INNER_F2,INNER_F3,INNER_F4,INNER_F5,INNER_F6:IN STD_LOGIC;
         OUTER_U1,OUTER_U2,OUTER_U3,OUTER_U4,OUTER_U5:IN STD_LOGIC;
         OUTER_D2,OUTER_D3,OUTER_D4,OUTER_D5,OUTER_D6:IN STD_LOGIC;
         F1,F2,F3,F4,F5,F6:IN STD_LOGIC;
         UP_REQ:BUFFER STD_LOGIC_VECTOR(6 DOWNTO 1);
         DOWN_REQ:BUFFER STD_LOGIC_VECTOR(6 DOWNTO 1);
         DELAY:IN STD_LOGIC;
         CLOSE:IN STD_LOGIC;
         OVER:IN STD_LOGIC;
         DOOR:BUFFER STD_LOGIC_VECTOR(1 DOWNTO 0);
         ALUM:BUFFER STD_LOGIC;
         RUN:BUFFER STD_LOGIC);
END DIANTI;
ARCHITECTURE BEHAV OF DIANTI IS
SIGNAL STATE:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL FLOOR:STD_LOGIC_VECTOR(6 DOWNTO 1);
SIGNAL CURRENT_FLOOR:INTEGER RANGE 6 DOWNTO 0;
SIGNAL DOOR_TIME:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL INNER_REQ:STD_LOGIC_VECTOR(6 DOWNTO 1);
BEGIN
FLOOR<=F6&F5&F4&F3&F2&F1;
ALUM<=OVER;
PROCESS(RST,CLK)
  BEGIN 
IF(RST='1')THEN 
   UP_REQ<="000000";
   DOWN_REQ<="000000";
   INNER_REQ<="000000";
ELSIF(CLK'EVENT AND CLK='1')THEN
   IF(OUTER_U5='1')THEN
      UP_REQ(5)<='1';
   ELSIF(CURRENT_FLOOR=5 AND RUN='0')THEN UP_REQ(5)<='0';
   ELSIF(CURRENT_FLOOR=5 AND RUN='1' AND STATE(1 DOWNTO 0)="10" AND DOWN_REQ(4 DOWNTO 1)="0000")THEN UP_REQ(5)<='0';
   END IF;
   IF(OUTER_U4='1')THEN
      UP_REQ(4)<='1';
   ELSIF(CURRENT_FLOOR=4 AND RUN='0')THEN UP_REQ(4)<='0';
   ELSIF(CURRENT_FLOOR=4 AND RUN='1' AND STATE(1 DOWNTO 0)="10" AND DOWN_REQ(3 DOWNTO 1)="000")THEN UP_REQ(4)<='0';
   END IF;
   IF(OUTER_U3='1')THEN
      UP_REQ(3)<='1';
   ELSIF(CURRENT_FLOOR=3 AND RUN='0')THEN
      UP_REQ(3)<='0';
   ELSIF(CURRENT_FLOOR=3 AND RUN='1' AND STATE(1 DOWNTO 0)="10" AND DOWN_REQ(2 DOWNTO 1)="00")THEN UP_REQ(3)<='0';
   END IF;
   IF(OUTER_U2='1')THEN
      UP_REQ(2)<='1';
   ELSIF(CURRENT_FLOOR=2 AND RUN='0')THEN
      UP_REQ(2)<='0';
   ELSIF(CURRENT_FLOOR=2 AND RUN='1' AND STATE(1 DOWNTO 0)="10" AND DOWN_REQ(1)='0')THEN UP_REQ(2)<='0';
   END IF;
   IF(OUTER_U1='1')THEN
      UP_REQ(1)<='1';
   ELSIF(CURRENT_FLOOR=1 AND RUN='0')THEN
      UP_REQ(1)<='0';
   END IF;

   IF(OUTER_D6='1')THEN
      DOWN_REQ(6)<='1';
      ELSIF(CURRENT_FLOOR=6 AND RUN='0')THEN DOWN_REQ(6)<='0';
   END IF;
   IF(OUTER_D5='1')THEN
      DOWN_REQ(5)<='1';
      ELSIF(CURRENT_FLOOR=5 AND RUN='0')THEN DOWN_REQ(5)<='0';
      ELSIF(CURRENT_FLOOR=5 AND RUN='1' AND STATE(1 DOWNTO 0)="01" AND DOWN_REQ(6)='0')THEN DOWN_REQ(5)<='0';
   END IF;
   IF(OUTER_D4='1')THEN
      DOWN_REQ(4)<='1';
      ELSIF(CURRENT_FLOOR=4 AND RUN='0')THEN DOWN_REQ(4)<='0';
      ELSIF(CURRENT_FLOOR=4 AND RUN='1' AND STATE(1 DOWNTO 0)="01" AND DOWN_REQ(6 DOWNTO 5)="00")THEN DOWN_REQ(4)<='0';
   END IF;
   IF(OUTER_D3='1')THEN
      DOWN_REQ(3)<='1';
      ELSIF(CURRENT_FLOOR=3 AND RUN='0')THEN DOWN_REQ(3)<='0';
      ELSIF(CURRENT_FLOOR=3 AND RUN='1' AND STATE(1 DOWNTO 0)="01" AND DOWN_REQ(6 DOWNTO 4)="000")THEN DOWN_REQ(3)<='0';
   END IF;
   IF(OUTER_D2='1')THEN
      DOWN_REQ(2)<='1';
      ELSIF(CURRENT_FLOOR=2 AND RUN='0')THEN DOWN_REQ(2)<='0';
      ELSIF(CURRENT_FLOOR=2 AND RUN='1' AND STATE(1 DOWNTO 0)="01" AND DOWN_REQ(6 DOWNTO 3)="0000")THEN DOWN_REQ(2)<='0';
   END IF;

   IF(INNER_F1='1')THEN
      INNER_REQ(1)<='1';
      ELSIF(CURRENT_FLOOR=1 AND RUN='0')THEN INNER_REQ(1)<='0';
   END IF;
   IF(INNER_F2='1')THEN
      INNER_REQ(2)<='1';
      ELSIF(CURRENT_FLOOR=2 AND RUN='0')THEN INNER_REQ(2)<='0';
   END IF;
   IF(INNER_F3='1')THEN
      INNER_REQ(3)<='1';
      ELSIF(CURRENT_FLOOR=3 AND RUN='0')THEN INNER_REQ(3)<='0';
   END IF;
   IF(INNER_F4='1')THEN
      INNER_REQ(4)<='1';
      ELSIF(CURRENT_FLOOR=4 AND RUN='0')THEN INNER_REQ(4)<='0';
   END IF;
   IF(INNER_F5='1')THEN
      INNER_REQ(5)<='1';
      ELSIF(CURRENT_FLOOR=5 AND RUN='0')THEN INNER_REQ(5)<='0';
   END IF;
   IF(INNER_F6='1')THEN
      INNER_REQ(6)<='1';
      ELSIF(CURRENT_FLOOR=6 AND RUN='0')THEN INNER_REQ(6)<='0';
   END IF;
  END IF;
END PROCESS;

PROCESS(RST,CLK)
BEGIN
  IF(RST='1')THEN CURRENT_FLOOR<=1;
  ELSIF(CLK'EVENT AND CLK='1')THEN
    CASE FLOOR IS
     WHEN "000001"=>CURRENT_FLOOR<=1;
     WHEN "000010"=>CURRENT_FLOOR<=2;
     WHEN "000100"=>CURRENT_FLOOR<=3;
     WHEN "001000"=>CURRENT_FLOOR<=4;
     WHEN "010000"=>CURRENT_FLOOR<=5;
     WHEN "100000"=>CURRENT_FLOOR<=6;
     WHEN OTHERS=>CURRENT_FLOOR<=CURRENT_FLOOR;
    END CASE;
  END IF;
END PROCESS;
 
PROCESS(RST,CLK)
BEGIN
  IF(RST='1')THEN DOOR<="00";DOOR_TIME<="000";
  ELSIF(CLK'EVENT AND CLK='1')THEN
    IF(STATE(2)='0')THEN
       IF(OVER='0')THEN
          IF(DELAY='1')THEN
             DOOR_TIME<="011";
             ELSIF(CLOSE='1')THEN DOOR_TIME<="101";
          ELSE DOOR_TIME<=DOOR_TIME+1;
          END IF;
          CASE DOOR_TIME IS
            WHEN "001"=>DOOR<="11";
            WHEN "010"=>DOOR<="11";
            WHEN "101"=>DOOR<="10";
            WHEN "110"=>DOOR<="10";
            WHEN OTHERS=>DOOR<="00";
          END CASE;
       ELSE DOOR<="00";
       END IF;
    END IF;
  END IF;
END PROCESS;
  
PROCESS(RST,CLK,CURRENT_FLOOR)
BEGIN
  IF(RST='1')THEN 
      RUN<='0';
      STATE(2 DOWNTO 0)<="100";
  ELSIF(CLK'EVENT AND CLK='1')THEN
    CASE CURRENT_FLOOR IS
  WHEN 1=>IF(STATE(2)='0')THEN
             RUN<='0';
             IF(DOOR_TIME="111")THEN
                    STATE(2)<='1';
             END IF;
          ELSE
             IF(RUN='0')THEN
               IF(UP_REQ(1)='1')THEN STATE(2)<='0';
               ELSIF(INNER_REQ(6 DOWNTO 2)>"00000" OR UP_REQ(5 DOWNTO 2)>"0000")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="11";
               ELSIF(DOWN_REQ(6 DOWNTO 2)>"00000")THEN 
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="01";
               END IF;
             ELSE
               IF(STATE(0)='0' AND (INNER_REQ(1)='1' OR UP_REQ(1)='1'))THEN
                     RUN<='0';
                     STATE(2)<='0';
               END IF;
             END IF;
          END IF;
  WHEN 2=>IF(STATE(2)='0')THEN
             RUN<='0'; 
             IF(DOOR_TIME="111")THEN
                    STATE(2)<='1';
             END IF;
          ELSE
             IF(RUN='0')THEN
               IF(UP_REQ(2)='1')THEN STATE(2)<='0';
               ELSIF(INNER_REQ(6 DOWNTO 3)>"0000" OR UP_REQ(5 DOWNTO 3)>"000")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="11";
               ELSIF(UP_REQ(1)>'0')THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="10";
               ELSIF(DOWN_REQ(2)='1')THEN
                     STATE(2)<='0';
               ELSIF(INNER_REQ(1)>'0')THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="00";
               ELSIF(DOWN_REQ(6 DOWNTO 3)>"0000")THEN 
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="01";
               END IF;
             ELSE
               IF(STATE(0)='1' AND (INNER_REQ(2)='1' OR UP_REQ(2)='1'))THEN
                          RUN<='0';
                          STATE(2)<='0';
               ELSIF(STATE(1 DOWNTO 0)="01" AND (INNER_REQ(2)='1' OR DOWN_REQ(2)='1'))THEN
                   IF(DOWN_REQ(6 DOWNTO 3)="0000")THEN 
                          RUN<='0';
                          STATE(2)<='0';
                   END IF;
               ELSIF(STATE(0)='0' AND (INNER_REQ(2)='1' OR DOWN_REQ(2)='1'))THEN
                          RUN<='0';
                          STATE(2)<='0';
               ELSIF(STATE(1 DOWNTO 0)="10" AND (INNER_REQ(2)='1' OR UP_REQ(2)='1'))THEN
                   IF(UP_REQ(1)='0')THEN    
                          RUN<='0';
                          STATE(2)<='0';
                   END IF;
               END IF;
             END IF;
          END IF;
  WHEN 3=>IF(STATE(2)='0')THEN
             RUN<='0'; 
             IF(DOOR_TIME="111")THEN
               STATE(2)<='1';
             END IF;
          ELSE
             IF(RUN='0')THEN
               IF(UP_REQ(3)='1')THEN STATE(2)<='0';
               ELSIF(INNER_REQ(6 DOWNTO 4)>"000" OR UP_REQ(5 DOWNTO 4)>"00")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="11";
               ELSIF(UP_REQ(2 DOWNTO 1)>"00")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="10";
               ELSIF(DOWN_REQ(3)='1')THEN
                     STATE(2)<='0';
               ELSIF(INNER_REQ(2 DOWNTO 1)>"00" OR DOWN_REQ(2)>'0')THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="00";
               ELSIF(DOWN_REQ(6 DOWNTO 4)>"000")THEN 
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="01";
               END IF;
             ELSE
               IF(STATE(0)='1' AND (INNER_REQ(3)='1' OR UP_REQ(3)='1'))THEN
                          RUN<='0';
                          STATE(2)<='0';
               ELSIF(STATE(1 DOWNTO 0)="01" AND (INNER_REQ(3)='1' OR DOWN_REQ(3)='1'))THEN
                   IF(DOWN_REQ(6 DOWNTO 4)="000")THEN 
                          RUN<='0';
                          STATE(2)<='0';
                   END IF;
               ELSIF(STATE(0)='0' AND (INNER_REQ(3)='1' OR DOWN_REQ(3)='1'))THEN
                          RUN<='0';
                          STATE(2)<='0';
               ELSIF(STATE(1 DOWNTO 0)="10" AND (INNER_REQ(3)='1' OR UP_REQ(3)='1'))THEN
                   IF(UP_REQ(2 DOWNTO 1)="00")THEN    
                          RUN<='0';
                          STATE(2)<='0';
                   END IF;
               END IF;
             END IF;
          END IF;     
  WHEN 4=>IF(STATE(2)='0')THEN
             RUN<='0'; 
             IF(DOOR_TIME="111")THEN
               STATE(2)<='1';
             END IF;
          ELSE
             IF(RUN='0')THEN
               IF(UP_REQ(4)='1')THEN STATE(2)<='0';
               ELSIF(INNER_REQ(6 DOWNTO 5)>"00" OR UP_REQ(6 DOWNTO 5)>"00")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="11";
               ELSIF(UP_REQ(3 DOWNTO 1)>"000")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="10";
               ELSIF(DOWN_REQ(4)='1')THEN
                     STATE(2)<='0';
               ELSIF(INNER_REQ(3 DOWNTO 1)>"000" OR DOWN_REQ(3 DOWNTO 2)>"00")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="00";
               ELSIF(DOWN_REQ(6 DOWNTO 5)>"00")THEN 
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="01";
               END IF;
             ELSE
               IF(STATE(0)='1' AND (INNER_REQ(4)='1' OR UP_REQ(4)='1'))THEN
                          RUN<='0';
                          STATE(2)<='0';
               ELSIF(STATE(1 DOWNTO 0)="01" AND (INNER_REQ(4)='1' OR DOWN_REQ(4)='1'))THEN
                   IF(DOWN_REQ(6 DOWNTO 5)="00")THEN 
                          RUN<='0';
                          STATE(2)<='0';
                   END IF;
               ELSIF(STATE(0)='0' AND (INNER_REQ(4)='1' OR DOWN_REQ(4)='1'))THEN
                          RUN<='0';
                          STATE(2)<='0';
               ELSIF(STATE(1 DOWNTO 0)="10" AND (INNER_REQ(4)='1' OR UP_REQ(4)='1'))THEN
                   IF(UP_REQ(3 DOWNTO 1)="000")THEN    
                          RUN<='0';
                          STATE(2)<='0';
                   END IF;
               END IF;
             END IF;
          END IF;     
  WHEN 5=>IF(STATE(2)='0')THEN
             RUN<='0'; 
             IF(DOOR_TIME="111")THEN
               STATE(2)<='1';
             END IF;
          ELSE
             IF(RUN='0')THEN
               IF(UP_REQ(5)='1')THEN STATE(2)<='0';
               ELSIF(INNER_REQ(6)>'0' OR UP_REQ(6)>'0')THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="11";
               ELSIF(UP_REQ(4 DOWNTO 1)>"0000")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="10";
               ELSIF(DOWN_REQ(5)='1')THEN
                     STATE(2)<='0';
               ELSIF(INNER_REQ(4 DOWNTO 1)>"0000" OR DOWN_REQ(4 DOWNTO 2)>"000")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="00";
               ELSIF(DOWN_REQ(6)>'0')THEN 
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="01";
               END IF;
             ELSE
               IF(STATE(0)='1' AND (INNER_REQ(5)='1' OR UP_REQ(5)='1'))THEN
                          RUN<='0';
                          STATE(2)<='0';
               ELSIF(STATE(1 DOWNTO 0)="01" AND (INNER_REQ(5)='1' OR DOWN_REQ(5)='1'))THEN
                   IF(DOWN_REQ(6)='0')THEN 
                          RUN<='0';
                          STATE(2)<='0';
                   END IF;
               ELSIF(STATE(0)='0' AND (INNER_REQ(5)='1' OR DOWN_REQ(5)='1'))THEN
                          RUN<='0';
                          STATE(2)<='0';
               ELSIF(STATE(1 DOWNTO 0)="10" AND (INNER_REQ(5)='1' OR UP_REQ(5)='1'))THEN
                   IF(UP_REQ(4 DOWNTO 1)="0000")THEN    
                          RUN<='0';
                          STATE(2)<='0';
                   END IF;
               END IF;
             END IF;
          END IF;     
  WHEN 6=>IF(STATE(2)='0')THEN
             RUN<='0'; 
             IF(DOOR_TIME="111")THEN
               STATE(2)<='1';
             END IF;
          ELSE
             IF(RUN='0')THEN
               IF(UP_REQ(6)='1')THEN STATE(2)<='0';
               ELSIF(UP_REQ(5 DOWNTO 1)>"00000")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="10";
               ELSIF(INNER_REQ(5 DOWNTO 1)>"00000" OR DOWN_REQ(5 DOWNTO 2)>"0000")THEN
                     RUN<='1';
                     STATE(1 DOWNTO 0)<="00";
               END IF;
             ELSE
               IF(STATE(0)='1' AND (INNER_REQ(6)='1' OR UP_REQ(6)='1'))THEN
                          RUN<='0';
                          STATE(2)<='0';
               END IF;
             END IF;
          END IF;     
  WHEN OTHERS=>RUN<='0';STATE(2 DOWNTO 0)<="100";
  END CASE;
  END IF;
END PROCESS;
END BEHAV;

⌨️ 快捷键说明

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