2017-01-22 16 views
-2

Я пытаюсь разработать автономный автомобиль. У меня есть датчик, который подсчитывает количество кругов колес нашего автомобиля. Когда число кругов достигает определенного номера входа, оно должно изменять состояния, но оператор if, похоже, не работает. Вместо сравнения двух чисел он вводит оператор else, пока входные vueltas не будут «1». Если я изменю код и напишу if (vueltas < 15), он будет работать. Но мне нужно, чтобы номер был изменчивым. Это код, я хочу, чтобы программа оставалась в том же состоянии до тех пор, пока число lapsis этого номера ввода не будет. Я уже доказал, что входной номер правильный и равен 15. Значение elsif (obst = '1') в том случае, если автомобиль обнаруживает препятствие, но это не имеет значения с этой проблемой.VHDL - если <заявление не работает

Примечание: Vueltas = коленей в испанской

  library IEEE; 
    use IEEE.STD_LOGIC_1164.ALL; 
    use IEEE.NUMERIC_STD.ALL; 
    --use IEEE.STD_LOGIC_ARITH.ALL; 
    use IEEE.STD_LOGIC_UNSIGNED.ALL; 

    entity Circuito is Port (
     clk : in STD_LOGIC; 
     ir1 : in STD_LOGIC; 
     ir2 : in STD_LOGIC; 
     moverCoche : in STD_LOGIC; 
     angulo : in STD_LOGIC_VECTOR(4 downto 0); 
     vMaxCurva : in STD_LOGIC_VECTOR(4 downto 0); 
     posInicial : in STD_LOGIC_VECTOR(9 downto 0); 
     vueltasCurva : in STD_LOGIC_VECTOR(9 downto 0); 
     vueltasRecta : in STD_LOGIC_VECTOR(9 downto 0); 
     obst : in STD_LOGIC; 
     servoOut : out STD_LOGIC; 
     motorOut : out STD_LOGIC; 
     vueltasLed : out STD_LOGIC_VECTOR(9 downto 0); 
     vueltasDentroDeCircuito : out STD_LOGIC_VECTOR(11 downto 0); 
     revolucionesPorSeg : out STD_LOGIC_VECTOR(11 downto 0)); 
    end Circuito; 

    architecture Behavioral of Circuito is 

     component motor_pwm_clk32kHz is Port (
      clk  : in STD_LOGIC; 
      entrada : in STD_LOGIC_VECTOR(4 downto 0); 
      salida : out STD_LOGIC); 
     end component; 

     component servo_pwm_clk32kHz is Port (
      clk : in STD_LOGIC; 
      pos : in STD_LOGIC_VECTOR(4 downto 0); 
      servo : out STD_LOGIC); 
     end component; 

     component Contador_Vueltas is Port ( 
      out1 : in STD_LOGIC; --Negro: 1 Blanco: 0 
      out2 : in STD_LOGIC; --Negro: 1 Blanco: 0 
      vueltas : out STD_LOGIC_VECTOR (9 downto 0); 
      rst : in STD_LOGIC; 
      clk : in STD_LOGIC); 
     end component; 

     component revoluciones is Port (
      clk : in STD_LOGIC; 
      vueltasDentroDeCircuito : in STD_LOGIC_VECTOR(11 downto 0); 
      revoluciones : out STD_LOGIC_VECTOR(11 downto 0)); 
     end component; 

     signal posServo, posMotor: STD_LOGIC_VECTOR(4 downto 0); 

     signal vueltas : STD_LOGIC_VECTOR(9 downto 0); 
     signal primeraVuelta : STD_LOGIC := '1'; 
     signal sigReiniciarVueltas : STD_LOGIC; 
     signal sigVueltasDentroDeCircuito : STD_LOGIC_VECTOR(11 downto 0); 
     signal sigVueltasInicioEstado : STD_LOGIC_VECTOR(11 downto 0); 
     --signal sigVueltasRecta : unsigned := to_integer(unsigned(vueltasRecta)); 
     --constant sigVueltasRecta : STD_LOGIC_VECTOR(9 downto 0) := "0000011110"; 
     --constant sigVueltasCurva : STD_LOGIC_VECTOR(9 downto 0) := "0000011110"; 
     signal flag : STD_LOGIC := '0'; 

     signal Qt: STD_LOGIC_VECTOR(3 downto 0); 
     SUBTYPE STATE_TYPE IS STD_LOGIC_VECTOR(3 downto 0); 
     SIGNAL STATE: STATE_TYPE; 
     CONSTANT s0 : STATE_TYPE := "0000"; 
     CONSTANT s1 : STATE_TYPE := "0001"; 
     CONSTANT s2 : STATE_TYPE := "0010"; 
     CONSTANT s3 : STATE_TYPE := "0011"; 
     CONSTANT s4 : STATE_TYPE := "0100"; 
     CONSTANT s5 : STATE_TYPE := "0101"; 
     CONSTANT s6 : STATE_TYPE := "0110"; 
     CONSTANT s7 : STATE_TYPE := "0111"; 
     CONSTANT s8 : STATE_TYPE := "1000"; 

    begin 

     UUT_Motor: motor_pwm_clk32kHz Port Map (
      clk => clk, 
      entrada => posMotor, 
      salida => motorOut); 

     UUT_Servo: servo_pwm_clk32kHz Port Map (
      clk => clk, 
      pos => posServo, 
      servo => servoOut); 

     UUT_ContadorVueltas: Contador_Vueltas Port Map (
      clk => clk, 
      rst => sigReiniciarVueltas, 
      vueltas => vueltas, 
      out1 => ir1, 
      out2 => ir2); 

     UUT_Revoluciones: revoluciones Port Map(
      clk => clk, 
      vueltasDentroDeCircuito => sigVueltasDentroDeCircuito, 
      revoluciones => revolucionesPorSeg 
     ); 

     process(clk, moverCoche) 
     begin 
      if (moverCoche = '0') then 
       Qt <= s0; 
       sigReiniciarVueltas <= '1'; 
       sigVueltasDentroDeCircuito <= (others => '0'); 
       posServo <= "10000"; 
       posMotor <= "10000"; 
      elsif (clk'event and clk = '1') then 
       case Qt is 
       --Quieto 
       when s0 => 
        posServo <= "10000"; 
        posMotor <= "10000"; 
        sigReiniciarVueltas <= '0'; 
        Qt <= s1; 
       --Recta1 
       when s1 => 
        sigReiniciarVueltas <= '0'; 
        posServo <= "10000"; 
        posMotor <= vMaxCurva; --Min: 10011 
        sigVueltasDentroDeCircuito <= ("00" & vueltas); 
        if (unsigned(vueltas) >= unsigned(vueltasRecta)) then 
         Qt <= s2; 
         sigReiniciarVueltas <= '1'; 
        elsif (obst = '1') then 
         Qt <= s8; 
        else 
    --     sigVueltasRecta <= vueltasRecta;   
         Qt <= s1;     
        end if; 
       -- Curva1 
       when s2 => 
        sigReiniciarVueltas <= '0'; 
        posServo <= angulo; 
        posMotor <= vMaxCurva; 
        sigVueltasDentroDeCircuito <= posInicial + ("00" & vueltas); 
        if (unsigned(vueltas) >= unsigned(vueltasCurva)) then 
         sigReiniciarVueltas <= '1'; 
         Qt <= s3; 
        elsif (obst = '1') then 
         Qt <= s8; 
        else 
         Qt <= s2; 
        end if; 
       --Recta2 
       when s3 => 
        sigReiniciarVueltas <= '0'; 
        posServo <= "10000"; 
        posMotor <= vMaxCurva; --Min: 10011 
        sigVueltasDentroDeCircuito <= posInicial + vueltasCurva + ("00" & vueltas); 
        if (unsigned(vueltas) >= unsigned(vueltasRecta)) then 
         sigReiniciarVueltas <= '1'; 
         Qt <= s4; 
        elsif (obst = '1') then 
         Qt <= s8; 
        else 
         Qt <= s3; 
        end if; 
       --Curva2 
       when s4 => 
        sigReiniciarVueltas <= '0'; 
        posServo <= angulo; 
        posMotor <= vMaxCurva; 
        sigVueltasDentroDeCircuito <= posInicial + vueltasCurva + vueltasRecta + ("00" & vueltas); 
        if (unsigned(vueltas) >= unsigned(vueltasCurva)) then 
         sigVueltasDentroDeCircuito <= (others => '0'); 
         sigReiniciarVueltas <= '1'; 
         Qt <= s4; 
        elsif (obst = '1') then 
         Qt <= s8; 
        else 
         Qt <= s1; 
        end if; 

       --Mantener Quieto 
       when s5 => 
        posMotor <= "10000"; 
        Qt <= s5; 

       when others => 
        if(obst = '1') then 
         posMotor <= "00000"; 
         --sigReiniciarVueltas <= '0'; 
         Qt <= s8; 
        else 
         Qt <= s1; 
        end if; 
       end case; 
       vueltasDentroDeCircuito <= sigVueltasDentroDeCircuito; 
       vueltasLed <= vueltasRecta; 
      end if; 
     end process; 
    end Behavioral; 
+2

См. [Как создать минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). Ваш вопрос не позволяет вашим читателям воспроизвести вашу проблему. – user1155120

ответ

0

Хотя можно выполнить арифметическое сравнение (в данном случае, <) на std_logic_vector, это, вероятно, не лучшая практика, так как неизвестно, будет ли базовое значение подписано или без знака. Если вам нужна какая-либо арифметика или сравнения, используйте unsigned или signed типов из пакета numeric_std.

Хорошая дискуссия найдена here.

+0

Он все еще не работает. Он по-прежнему делает то же самое. Я изменил код, есть ли другие изменения, которые я могу сделать? – ainhoarru

+0

@ainhoarru Это неправда. Хотя вы вообще не можете выполнять арифметику с помощью 'std_logic_vector', вы можете сравнить' std_logic_vector' с '<' и аналогичными операторами. Вы должны позаботиться о том, если векторы имеют разную длину, но вы получите странные результаты. –

+1

@MatthewTaylor Я отредактировал свой ответ, чтобы отразить ваш комментарий. Хотя вы правильно говорите, что можно выполнить арифметическое сравнение на SLV, я бы не счел это хорошей практикой дизайна. – gsm