libricon 0 11 октября, 2008 Опубликовано 11 октября, 2008 (изменено) · Жалоба Спасибо большое Насчет ифа я догодался , сделал так и получилось, а вот насчет вектора... почему нельзя папрямую индексом дать значение? фокус не удается, он говорит синтаксис эррор Изменено 11 октября, 2008 пользователем Kirill Trusov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 11 октября, 2008 Опубликовано 11 октября, 2008 · Жалоба фокус не удается, он говорит синтаксис эррор Если бы Вы дали полный код ошибки (желательно с куском исходного текста), то это было бы куда более информативное сообщение. А пока я могу лишь добавить, что в приведённой мною строке должна быть точка с запятой на её конце, а сама строка должна размещаться в теле процесса после ключевого слова begin, которое почему-то отсутствует в приведённом Вами примере. а вот насчет вектора... почему нельзя папрямую индексом дать значение? Потому что индекс вектора у Вас изменяется в пределах от 1, а не от 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
libricon 0 11 октября, 2008 Опубликовано 11 октября, 2008 · Жалоба 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 12 октября, 2008 Опубликовано 12 октября, 2008 · Жалоба Инициализируйте при объявлении: shared variable current_floor : bit_vector (1 to NUM_FLOORS) := (2 to NUM_FLOORS => '0', 1 => '1'); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
libricon 0 12 октября, 2008 Опубликовано 12 октября, 2008 (изменено) · Жалоба не получилось, компилятор говорит чтото о единсвенном выборе, и что одим следуюет за другим, короче не дает, я попробовал 1 вперед поставить, но компилятору похоже пофиг. а можно другой вектор как others=> 0 ? вот это он принял shared variable current_floor : bit_vector (1 to NUM_FLOORS) := ( 1 => '1', others => '0'); так как мне сделать работающим эту строку floors_to_visit(current_floor) := '0'; может сделать и с нулем? Изменено 12 октября, 2008 пользователем Kirill Trusov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
libricon 0 12 октября, 2008 Опубликовано 12 октября, 2008 · Жалоба такой вопрос есть код 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; будет ли он работать? похоже что не работает, к сожалению, циклы выполняются тоже последовательно. или паралельно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
libricon 0 12 октября, 2008 Опубликовано 12 октября, 2008 · Жалоба Всем спасибо, работает, вроде все как надо, прикрепляю файл. если будет кому интересно. Последний пока вопрос, посматрите файл для проверки, этот тестбенч. я не понимаю как он работает, там какая то фунция, зачем она нужна. и получается что она двухмерная. i j параметры, т.е чтото странное. Всем спасибо за помощь, теперь я немного ориентируюсь в языке, и куча заклодок необходимых к прочтению positioning.vhd t_positioning.vhd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
libricon 0 14 октября, 2008 Опубликовано 14 октября, 2008 · Жалоба Why resolved function WiredOR is required in testbench? Explain the behavior of this resolved function. ну что, кто-нибуть поможет с ответом, я не понимаю, перелистал 2 книжки ничаво не нашел... главаное я не понимаю зачем нужна фунция, которую никто не использует Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SFx 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба такой вопрос есть код 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) с несколькоми состояниями. к примеру первое состояние содержет проверку наличия непосещенных этажей. во втором указание (определение) номера этажа, на который ехать и третье состояние - ожидать приезда на заданный этаж, после чего перходить в начальное состояние. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
libricon 0 15 октября, 2008 Опубликовано 15 октября, 2008 (изменено) · Жалоба работает кстати :) сейчас важно понять, зачем функция wireor в программе для симуляции, зачем она??? PS! Чувствую себя ламером, кож совсем ужасно написан? просто работает симуляция как надо.... я не знаю просто как эти финти стате машин делать, не делал никогда ... Вопрос касателньо того. что я навоял... это совсем фигово ? Изменено 15 октября, 2008 пользователем Kirill Trusov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SFx 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Вопрос касателньо того. что я навоял... это совсем фигово ? да, такие циклы разные компиляторы по разному будут обрабатывать, одни проглотят, другие ругаться будут сейчас важно понять, зачем функция wireor в программе для симуляции, зачем она??? где исходник? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
libricon 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба выше выкладывал. но вот ещё раз t_elevator_fnc.vhd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться