Перейти к содержанию
    

Спасибо большое

 

Насчет ифа я догодался , сделал так и получилось, а вот насчет вектора... почему нельзя папрямую индексом дать значение?

 

 

фокус не удается, он говорит синтаксис эррор

Изменено пользователем Kirill Trusov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

фокус не удается, он говорит синтаксис эррор

 

Если бы Вы дали полный код ошибки (желательно с куском исходного текста), то это было бы куда более информативное сообщение. А пока я могу лишь добавить, что в приведённой мною строке должна быть точка с запятой на её конце, а сама строка должна размещаться в теле процесса после ключевого слова begin, которое почему-то отсутствует в приведённом Вами примере.

 

 

а вот насчет вектора... почему нельзя папрямую индексом дать значение?

 

Потому что индекс вектора у Вас изменяется в пределах от 1, а не от 0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 
library IEEE;
use IEEE.std_logic_1164.all;

entity ELEVATOR is
generic (NUM_FLOORS: positive);
  port (BUTTONS_IN     : in  bit_vector(1 to NUM_FLOORS);
        BUTTONS_OUT    : in  bit_vector(1 to NUM_FLOORS);
        DIR_UP         : out bit;
        DIR_DN         : out bit;
        DOORS_OPENED   : out bit_vector(1 to NUM_FLOORS);
        MOTOR          : out bit_vector(1 downto 0);
        FLOOR_NUM      : out integer);
end ELEVATOR;

architecture MUDEL of ELEVATOR is

shared variable floors_to_visit : bit_vector (1 to NUM_FLOORS);
shared variable current_floor : bit_vector (1 to NUM_FLOORS);
shared variable pr_direction : bit_vector (1 downto 0) := "00";
shared variable nw_direction : bit_vector (1 downto 0) := "00";
shared variable current_floor_num : integer := 1; 
shared variable carry : bit := '0'; 

begin    
  
process 
  
  begin
  case (nw_direction) is  
  when "01" =>             --  means moving  UP
      dir_up <= '1';
      dir_dn <= '0'; 
      motor  <= "10";
      floor_num <= current_floor_num;
      
      IF ( (current_floor(current_floor_num) = '1') and (  floors_to_visit(current_floor_num) = '1') ) THEN
         doors_opened(current_floor_num) <= '1';
         wait for 5 sec;  
         doors_opened(current_floor_num) <= '0';
      END IF;
      
      floors_to_visit(current_floor) := '0';
      
      IF ( current_floor_num = NUM_FLOORS) THEN
         nw_direction := "00";
      END IF;
      
      current_floor_num := current_floor_num +1;
      current_floor := current_floor srl 1;

  when "10" =>             -- means moving DOWN
      dir_up <= '0';
      dir_dn <= '1';
      motor  <= "01";
      floor_num <= current_floor_num;
    
      IF ( (current_floor(current_floor_num) = '1') and (  floors_to_visit(current_floor_num) = '1') ) THEN
         doors_opened(current_floor_num) <= '1';
         wait for 5 sec;  
         doors_opened(current_floor_num) <= '0';
      END IF;
      
      floors_to_visit(current_floor) := '0';
      
      IF ( current_floor_num = 0) THEN
         nw_direction := "00";
      END IF;
      
      current_floor_num := current_floor_num -1;
      current_floor := current_floor sll 1;
      
  when "00" =>             -- means STOP
      dir_up <= '0';
      dir_dn <= '0'; 
      motor <= "00"; 
      floor_num <= current_floor_num;
  when others => null;
  end case;  
  
wait for 1 sec;
end process;

-- This process determines a new direction, forms vector with pressed floors 
process ( BUTTONS_IN, BUTTONS_OUT )     -- if Button is pressed
  
-- floors_to_visit :=(floors_to_visit'low + 1 to floors_to_visit'high => '0', floors_to_visit'low => '1');
  begin
  floors_to_visit := BUTTONS_IN or floors_to_visit;  -- old floors + new floors

  -- determine direction :)
  IF ( nw_direction = "00" ) THEN                      -- If Lift wait a action
       carry := '0';                                   -- variable
       FOR i in current_floor_num to NUM_FLOORS LOOP   -- Look up , is it necessary to move down
           carry := carry or floors_to_visit(i);         
       END LOOP;
       nw_direction(0) := carry;                       -- Set if needed to move up
       carry := '0'; 
       FOR i in 1 to current_floor_num LOOP            -- Look up , is it necessary to move up
           carry := carry or floors_to_visit(i);
       END LOOP;
       nw_direction(1) := carry;                       -- Set if needed to move down   
  END IF;
  floors_to_visit := BUTTONS_OUT or floors_to_visit;  -- Add floors from OUT buttons

  IF ( nw_direction = "00" ) THEN                      -- If INNER BUTTONS are not pressed
       carry := '0';
       FOR i in current_floor_num to NUM_FLOORS LOOP   -- Look up , is it necessary to move up
           carry := carry or floors_to_visit(i);
       END LOOP;
       nw_direction(0) := carry;
       carry := '0'; 
       FOR i in 1 to current_floor_num LOOP        -- Look up , is it necessary to move down
           carry := carry or floors_to_visit(i);
       END LOOP;
       nw_direction(1) := carry;
  END IF;
  
  IF (nw_direction = "11") THEN                        -- If both directions are presented, choose 
       nw_direction := nw_direction xor pr_direction;  -- the opposite to previous direction 
  END IF;
  
  pr_direction := nw_direction;
    
end process;




end MUDEL;

 

Вот код, но мне надо только один раз инициализировать вектор, если я его поставлю после бегин. то он будет при каждом вызове процесса переписывать вектор, а это не допустимо .....

 

хотел добавить что строчку floors_to_visit(current_floor) := '0'; он тоже не принимает. а мне очень надо менять биты в векторе ..... :05:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Инициализируйте при объявлении:

shared variable current_floor : bit_vector (1 to NUM_FLOORS) := (2 to NUM_FLOORS => '0', 1 => '1');

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не получилось, компилятор говорит чтото о единсвенном выборе, и что одим следуюет за другим, короче не дает, я попробовал 1 вперед поставить, но компилятору похоже пофиг.

а можно другой вектор как others=> 0 ?

 

вот это он принял shared variable current_floor : bit_vector (1 to NUM_FLOORS) := ( 1 => '1', others => '0');

 

так как мне сделать работающим эту строку

floors_to_visit(current_floor) := '0';

 

может сделать и с нулем?

Изменено пользователем Kirill Trusov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

такой вопрос

есть код

 FOR i in current_floor_num to NUM_FLOORS LOOP   -- Look up , is it necessary to move down
           carry := carry or floors_to_visit(i);       -- Carry will be '1' if there are requests
           IF floors_to_visit(i) = '1' THEN
           finit_floor := i;                           -- If is request => remember the last floor    
           END IF; 
       END LOOP;

будет ли он работать? похоже что не работает, к сожалению, циклы выполняются тоже последовательно. или паралельно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо, работает, вроде все как надо, прикрепляю файл. если будет кому интересно.

 

Последний пока вопрос, посматрите файл для проверки, этот тестбенч.

я не понимаю как он работает, там какая то фунция, зачем она нужна. и получается что она двухмерная. i j параметры, т.е чтото странное.

 

 

Всем спасибо за помощь, теперь я немного ориентируюсь в языке, и куча заклодок необходимых к прочтению

positioning.vhd

t_positioning.vhd

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Why resolved function WiredOR is required in testbench? Explain the behavior of this resolved function.

 

ну что, кто-нибуть поможет с ответом, я не понимаю, перелистал 2 книжки ничаво не нашел... главаное я не понимаю зачем нужна фунция, которую никто не использует

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

такой вопрос

есть код

 FOR i in current_floor_num to NUM_FLOORS LOOP   -- Look up , is it necessary to move down
           carry := carry or floors_to_visit(i);       -- Carry will be '1' if there are requests
           IF floors_to_visit(i) = '1' THEN
           finit_floor := i;                           -- If is request => remember the last floor    
           END IF; 
       END LOOP;

будет ли он работать? похоже что не работает, к сожалению, циклы выполняются тоже последовательно. или паралельно?

не будет. carry:= должно быть тоже с индексом i как минимум.

иначе происходит multiple driving.

циклы в vhdl, это не циклы из C или паскаля.

к примеру

   FOR i in 0 to 4 LOOP
       output(i) := input xor vector_out(i);
   END LOOP;

будет идентично что и :

       output(0) := input xor vector_out(0);
       output(1) := input xor vector_out(1);
       output(2) := input xor vector_out(2);
       output(3) := input xor vector_out(3);
       output(4) := input xor vector_out(4);

циклы удобно для работы с масивами сигналов. к примеру в первый момент времени нужно все сигналы с индексамм такими то отXORить таким то значением, а остальные не трогать.

 

здесь нужно ставить автомат (Finite state machine) с несколькоми состояниями. к примеру первое состояние содержет проверку наличия непосещенных этажей. во втором указание (определение) номера этажа, на который ехать и третье состояние - ожидать приезда на заданный этаж, после чего перходить в начальное состояние.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

работает кстати :)

 

сейчас важно понять, зачем функция wireor в программе для симуляции, зачем она???

 

 

 

 

PS! Чувствую себя ламером, кож совсем ужасно написан? просто работает симуляция как надо.... я не знаю просто как эти финти стате машин делать, не делал никогда ...

 

 

Вопрос касателньо того. что я навоял... это совсем фигово ?

Изменено пользователем Kirill Trusov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос касателньо того. что я навоял... это совсем фигово ?

да, такие циклы разные компиляторы по разному будут обрабатывать, одни проглотят, другие ругаться будут

сейчас важно понять, зачем функция wireor в программе для симуляции, зачем она???

где исходник?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...