VHDL Как переключить выход с 1 на 0 после определенного периода времени? - PullRequest
0 голосов
/ 06 июня 2018
entity seguidor is
    port(
        clk, sensorIzq, sensorDer, sensorDisp : in std_logic;
        llantaIzq, llantaDer, disp: out std_logic);
end;

architecture comportamiento of seguidor is

begin

    movimiento: process (sensorIzq, sensorDer, sensorDisp,clk)
     begin
        if(sensorIzq='1' and sensorDer='0' and sensorDisp = '0') then
            llantaIzq<='1';
            llantaDer<='0';
        elsif(sensorIzq='0' and sensorDer='1'and sensorDisp = '0') then
            llantaIzq<='0';
            llantaDer<='1';
        elsif(sensorIzq = '1' and sensorDer = '1' and sensorDisp = '0') then
            llantaIzq <= '1';
            llantaDer <= '1';
        elsif(sensorIzq = '1' and sensorDer = '1' and sensorDisp = '1') then
            llantaIzq <= '0';
            llantaDer <= '0';

        end if;
    end process movimiento;
    end comportamiento;

Таким образом, код предназначен для линейного последователя: если он читает «1» с одного из датчиков, он должен передать «1» (т. Е. 5 В) на одно из своих колес.После прочтения «1» из «sensorDisp» автомобиль должен ненадолго остановиться, давая «disp» значение «1» в это время.После этого он должен продолжить свой веселый путь.Я с трудом пытаюсь добиться этой задержки.Спасибо за помощь!

1 Ответ

0 голосов
/ 06 июня 2018

Я сделал то же самое на Этлис.Есть счетчики clk. Знать частоту часов в файле .ucf (файл отображения).Имеется логическое значение состояния ожидания, isWait. Когда sensorDisp равен 1, тогда isWait = true. Я уже упоминал псевдокод ниже.

Вы можете создать отдельный процесс для этого с помощью ввода clk и sensordisp.И запомните, если какой-либо переменной / сигналу не было присвоено какое-либо значение в каком-либо прогоне кода, if выведет защелку, поскольку ей нужно предыдущее значение, поскольку она не назначена.

movimiento: process (clk,sensorIzq, sensorDer, sensorDisp,clk)
     begin
     if(clk edge ) then 
        if (isWait) then 
            if(wait_counter < "frequency")) then 
              wait_couter++;
             else 
              isWait = False;
              Disp = '0';
            end if;
        else 
          if(sensorDisp = '1') then 
             wait_counter = 0;
             isWait = True;
              Disp <= '1';
          end if;

          if(sensorIzq='1' and sensorDer='0' and sensorDisp = '0') then
              llantaIzq<='1';
              llantaDer<='0';
          elsif(sensorIzq='0' and sensorDer='1'and sensorDisp = '0') then
              llantaIzq<='0';
              llantaDer<='1';
          elsif(sensorIzq = '1' and sensorDer = '1' and sensorDisp = '0') then
              llantaIzq <= '1';
              llantaDer <= '1';
          elsif(sensorIzq = '1' and sensorDer = '1' and sensorDisp = '1') then
              llantaIzq <= '0';
              llantaDer <= '0';
          end if;
      end if;
    end if;
    end process movimiento;
    end comportamiento;
...