集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 727|回复: 0

求助,一个关于8层电梯设计的程序分析 求高手帮忙分析

[复制链接]
llll 发表于 2013-3-10 16:02:44 | 显示全部楼层 |阅读模式
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 ,INNER_F7 ,INNER_F8:IN STD_LOGIC;---内部请求信号
OUTER_U1, OUTER_U2, OUTER_U3, OUTER_U4, OUTER_U5, OUTER_U6, OUTER_U7:IN STD_LOGIC;--外部上升信号
OUTER_D2, OUTER_D3, OUTER_D4, OUTER_D5, OUTER_D6, OUTER_D7, OUTER_D8:IN STD_LOGIC;---外部下降信号
F1, F2, F3, F4, F5, F6, F7, F8:IN STD_LOGIC;---楼层信号
UP_REQ:BUFFER STD_LOGIC_VECTOR(8 DOWNTO 1);--上升请求楼层指示
DOWN_REQ: BUFFER STD_LOGIC_VECTOR(8 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); --state(2):1-运行允许标志,0-运行禁止标志;state(1):1-上行任务标志,0-下行任务标志;state(0):1-正在上行标志,0-正在下行标志;
SIGNAL FLOOR: STD_LOGIC_VECTOR (8 DOWNTO 1);
SIGNAL CUPRENT_FLOOR: INTEGER RANGE 8 DOWNTO 0;
SIGNAL DOOR_TIME: STD_LOGIC_VECTOR (2 DOWNTO 0);
SIGNAL INNER_REQ: STD_LOGIC_VECTOR (8 DOWNTO 1);
BEGIN
FLOOR<=F8&F7&F6&F5&F4&F3&F2&F1;
ALUM<=OVER;
PROCESS (RST, CLK)
BEGIN
IF (RST= '1') THEN
   UP_REQ<= "00000000";
   DOWN_REQ<= "00000000";
   INNER_REQ<= "00000000";
ELSIF (CLK'EVENT AND CLK= '1')THEN
   IF(OUTER_U7= '1')THEN
      UP_REQ (7)<= '1';
ELSIF (CUPRENT_FLOOR=7 AND RUN= '0')THEN
UP_REQ (7)<= '0';
ELSIF (CUPRENT_FLOOR=7 AND RUN= '1' AND STATE(1 DOWNTO 0)= "10" AND DOWN_REQ(6 DOWNTO 1)= "000000")THEN UP_REQ(7)<='0';
END IF;

IF(OUTER_U6= '1')THEN
       UP_REQ(6)<= '1';
ELSIF (CUPRENT_FLOOR=6 AND RUN= '0')THEN
UP_REQ(6)<= '0';
ELSIF (CUPRENT_FLOOR=6 AND RUN= '1' AND STATE(1 DOWNTO 0)= "10"AND DOWN_REQ(5 DOWNTO 1)= "00000")THEN UP_REQ(6)<= '0';
END IF;

IF(OUTER_U5= '1')THEN
       UP_REQ(5)<= '1';
ELSIF(CUPRENT_FLOOR=5 AND RUN= '0')THEN
UP_REQ(5)<= '0';
ELSIF (CUPRENT_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(CUPRENT_FLOOR=4 AND RUN= '0')THEN
UP_REQ(4)<= '0';
ELSIF (CUPRENT_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(CUPRENT_FLOOR=3 AND RUN= '0')THEN
UP_REQ(3)<= '0';
ELSIF (CUPRENT_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(CUPRENT_FLOOR=2 AND RUN= '0')THEN
UP_REQ(2)<= '0';
ELSIF (CUPRENT_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(CUPRENT_FLOOR=1 AND RUN= '0')THEN
UP_REQ(1)<= '0';
END IF;

IF(OUTER_D8= '1')THEN
        DOWN_REQ(8)<= '1';
ELSIF(CUPRENT_FLOOR=8 AND RUN= '0')THEN
DOWN_REQ(8)<= '0';
END IF;

IF(OUTER_D7= '1')THEN
       DOWN_REQ(7)<= '1';
ELSIF(CUPRENT_FLOOR=7 AND RUN='0')THEN
DOWN_REQ(7)<='0';
ELSIF (CUPRENT_FLOOR=7 AND RUN= '0' AND STATE(1 DOWNTO 0)= "01" AND DOWN_REQ(8)= '0')THEN DOWN_REQ(7)<= '0';
END IF;

IF(OUTER_D6= '1')THEN
        DOWN_REQ(6)<= '1';
ELSIF(CUPRENT_FLOOR=6 AND RUN='0')THEN
DOWN_REQ(6)<= '0';
ELSIF (CUPRENT_FLOOR=6 AND RUN= '0' AND STATE(1 DOWNTO 0)= "01" AND DOWN_REQ(8 DOWNTO 7)= "00")THEN DOWN_REQ(6)<= '0';
END IF;

IF(OUTER_D5= '1')THEN
       DOWN_REQ(5)<= '1';
ELSIF(CUPRENT_FLOOR=5 AND RUN= '0')THEN
DOWN_REQ(5)<= '0';
ELSIF (CUPRENT_FLOOR=5 AND RUN= '0' AND STATE(1 DOWNTO 0)= "01" AND DOWN_REQ(8 DOWNTO 6)= "000")THEN DOWN_REQ(5)<= '0';
END IF;

IF(OUTER_D4= '1')THEN
       DOWN_REQ(4)<= '1';
ELSIF(CUPRENT_FLOOR=4 AND RUN= '0')THEN
DOWN_REQ(4)<= '0';
ELSIF (CUPRENT_FLOOR=4 AND RUN= '0' AND STATE(1 DOWNTO 0)= "01" AND DOWN_REQ(8 DOWNTO 5)= "0000")THEN DOWN_REQ(4)<= '0';
END IF;

IF(OUTER_D3= '1')THEN
        DOWN_REQ(3)<= '1';
ELSIF(CUPRENT_FLOOR=3 AND RUN= '0')THEN
DOWN_REQ (3)<= '0';
ELSIF (CUPRENT_FLOOR=3 AND RUN= '0' AND STATE(1 DOWNTO 0)= "01" AND DOWN_REQ(8 DOWNTO 4)= "00000")THEN DOWN_REQ(3)<= '0';
END IF;

IF(OUTER_D2= '1')THEN
      DOWN_REQ(2)<= '1';
ELSIF(CUPRENT_FLOOR=2 AND RUN= '0')THEN
DOWN_REQ(2)<= '0';
ELSIF (CUPRENT_FLOOR=2 AND RUN= '0' AND STATE(1 DOWNTO 0)= "01" AND DOWN_REQ(8 DOWNTO 3)= "000000")THEN DOWN_REQ(2)<= '0';
END IF;

IF(INNER_F1= '1')THEN
      INNER_REQ(1)<= '1';
      ELSIF(CUPRENT_FLOOR=1 AND RUN= '0')THEN INNER_REQ(1)<=  '0';
END IF;

IF(INNER_F2= '1')THEN
      INNER_REQ(2)<= '1';
      ELSIF(CUPRENT_FLOOR=2 AND RUN= '0')THEN INNER_REQ(2)<=  '0';
END IF;

IF(INNER_F3= '1')THEN
      INNER_REQ(3)<= '1';
      ELSIF(CUPRENT_FLOOR=3 AND RUN= '0')THEN INNER_REQ(3)<= '0';
END IF;

IF(INNER_F4= '1')THEN
      INNER_REQ(4)<= '1';
      ELSIF(CUPRENT_FLOOR=4 AND RUN= '0')THEN INNER_REQ(4)<= '0';
END IF;

IF(INNER_F5= '1')THEN
      INNER_REQ(5)<= '1';
      ELSIF(CUPRENT_FLOOR=5 AND RUN= '0')THEN INNER_REQ(5)<= '0';
END IF;
IF(INNER_F6= '1')THEN
      INNER_REQ(6)<= '1';
      ELSIF(CUPRENT_FLOOR=6 AND RUN= '0')THEN INNER_REQ(6)<= '0';
END IF;
IF(INNER_F7= '1')THEN
       INNER_REQ(7)<= '1';
       ELSIF(CUPRENT_FLOOR=7 AND RUN= '0')THEN INNER_REQ(7)<= '0';
END IF;

IF(INNER_F8= '1')THEN
       INNER_REQ(8)<= '1';
       ELSIF(CUPRENT_FLOOR=8 AND RUN= '0')THEN INNER_REQ(8)<= '0';
END IF;
END IF;
END PROCESS;

PROCESS (RST, CLK)
BEGIN
  IF(RST= '1')THEN   
      CUPRENT_FLOOR<= 1;
  ELSIF(CLK'EVENT AND CLK= '1') THEN
    CASE FLOOR  IS
        WHEN "00000001" => CUPRENT_FLOOR <= 1;
        WHEN "00000010" => CUPRENT_FLOOR <= 2;
        WHEN "00000100" => CUPRENT_FLOOR <= 3;
        WHEN "00001000" => CUPRENT_FLOOR <= 4;
        WHEN "00010000" => CUPRENT_FLOOR <= 5;
        WHEN "00100000" => CUPRENT_FLOOR <= 6;
        WHEN "01000000" => CUPRENT_FLOOR <= 7;
        WHEN "10000000" => CUPRENT_FLOOR <= 8;
        WHEN OTHERS => CUPRENT_FLOOR <= CUPRENT_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, CUPRENT_FLOOR)
BEGIN
IF(RST = '1')THEN
     RUN<= '0';
     STATE(2 DOWNTO 0)<= "100";
   ELSIF(CLK'EVENT AND CLK = '1') THEN
      CASE CUPRENT_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(8 DOWNTO 2) > "0000000" OR UP_REQ(7 DOWNTO 2)> "000000")THEN
                   RUN<= '1';
                   STATE (1 DOWNTO 0)<= "11";
             ELSIF (DOWN_REQ (8 DOWNTO 2)>= "0000000") 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(8 DOWNTO 3)> "000000" OR UP_REQ(7 DOWNTO 3)> "00000")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 (8 DOWNTO 3)> "000000") 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(8 DOWNTO 3) = "000000") 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;
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-27 08:38 , Processed in 0.084480 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表