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

в Коментариях у исходника написано время реакции лифта.

Для примера я выбрал одну микросекунду.

    process 
        variable pos_number : integer := 0;
        variable marker : bit_vector (0 to 7) := "10000000";  
    begin
        if (marker = input) then 
            state <= "00";    
            marker := marker;
            wait for 1us;      -- Lift reaction time;
        elsif (marker > input) then
            state <= "01";
            if marker /= "00000001"  then
                pos_number := pos_number + 1;
                marker := marker srl 1;
                wait for 1000ms;   -- Lift up speed;
            end if;
        elsif (marker < input) then
            state <= "10";
            if marker /= "10000000"  then
                pos_number :=pos_number - 1;  
                marker := marker sll 1;
                wait for 1000ms;  -- Lift down speed;
            end if;    
        end if;
        position <= pos_number; 
    end process;

 

как вариант можно еще установить реакцию на событие input:

 

...
        if (marker = input) then 
            state <= "00";    
            marker := marker;
            wait until input'event;
        elsif (marker > input) then
....

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


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

ура, посавил на событие, работает как надо :)

 

Только конструкции, предложенные SFx, не синтезируемые!!! :( Для синтезируемых конструкций нужно просто добавить счетчик который бы отсчитывал бы время! :)

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


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

Только конструкции, предложенные SFx, не синтезируемые!!! :( Для синтезируемых конструкций нужно просто добавить счетчик который бы отсчитывал бы время! :)

Я об этом уже писал выше (пост номер 2 и пост номер 10).

 

Чтобы сделать конструкцию синтезируемой, вводится тактирующий сигнал (к примеру CLK), заданной частоты. Значение входного сигнала input сохраняется в регистре. в реальной схеме управления индикации лифта должен быть еще вход с датчика этажа или с датчика пересечения границы этажа. если такой вход будет то никаких счетчиков ставить не нужно будет.

 

Я так понимаю автору темы нужно сначала изучить сами возможности VHDL, а уж потом начинать на нем писать реальные проекты для FPGA. Пусть он меня поправит если это не так.

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

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


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

Я об этом уже писал выше (пост номер 2 и пост номер 10).

 

Чтобы сделать конструкцию синтезируемой, вводится тактирующий сигнал (к примеру CLK), заданной частоты. Значение входного сигнала input сохраняется в регистре. в реальной схеме управления индикации лифта должен быть еще вход с датчика этажа или с датчика пересечения границы этажа. если такой вход будет то никаких счетчиков ставить не нужно будет.

 

Я так понимаю автору темы нужно сначала изучить сами возможности VHDL, а уж потом начинать на нем писать реальные проекты для FPGA. Пусть он меня поправит если это не так.

 

Не заметил. Как говорится повторение - мать учения :beer:

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


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

imenno tak, mne nado sna4ala jazqk izu4it, potom uze na shelezo perehodit,

kstati a mozno popodrobnee pto clock, ja 4ital 4to clock signalq ushe est vnutri apparaturq

 

kam v FPGA kakieto manedgerq sinhro signalov est

 

 

 

malo togo ja ne znakom s programmiruemoi logikoi, no ja smotrel Verilog, on vorde ponjatnee nemnogo.

4to lu4she, kakoi jazqk ? ili eto on zaada4i zavisit ?

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

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


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

хех, я чтото в коде запутался, если я пишу if (marker > input ) then

выполняется если больше? то лог. 1 как бы и выполнение, или наоборот?

 

или дело в том что сигнал и переменные обьявлены как 0 to 7 ... т.е кто больше 0010_0000 или 0000_1000 по числовому второй, т.к наиоболее значимый последний, а если так сверять, то первый :)

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

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


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

если бы вы писали эту задачу для Плис, то вам нужно было бы просто использовать std_logic_vector(7 downto 0).

далее вы их сравниваете как два числа и решение будет на поверхности. попробуйте сделать это.

также заведите сигнал clk и используйте rising_edge (clk) для формирования тригера.

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


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

:) надо будет поробовать.

 

 

кстати часто в туториалах используют стд логис, а зачем, т.е там есть какие то слабые подтянутые, не подтянутые, вроде 9 значений, или это у ulogic

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

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


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

просто большенство типов к std_logic(_vector) приводится, да и сам тип этот наиболее просто описывает сигнал или сигнальную шину. кроме того можно массив std_logic_vector, и это будет называться памятью.

 

9 значений - это полезность при симуляции. очень важно чтобы было. на самом деле для плис они излишни (я не встречал их использование)

 

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

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


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

или дело в том что сигнал и переменные обьявлены как 0 to 7 ... т.е кто больше 0010_0000 или 0000_1000 по числовому второй, т.к наиоболее значимый последний, а если так сверять, то первый :)
Ничего не понял из этого потока сознания.

 

Порядок нумерации бит значения не имеет. В веторе MSB -- это 'left, LSB -- соответственно, 'right.

 

И ещё. Я никогда не работал с bit_vector и могу ошибаться. Я не вижу у вас декларации математического пакета. А без него bit_vector со значением "1000_0000" это +128 и -128? Результат сравнения зависит от интерпретации .

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


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

такой вопрос, если в архитектуре насколько процессов, то они выоплняются паралельно, а сигналы в процессах меняют значения по окончанию процесса, или через некое дельта Т, тогда чем определяется это дельто Т?

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


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

How long does it take to execute the for loop? Does it depend on the number of iterations?

 

я так понимаю что время выполнения зависит от кол-ва итераций. но ответ неверен. Препод сказал что по отношению к реальному времени да. та и есть,а вот по отношению в времени ВХДЛ симуляции нет. тут вопрос напрашивается, а чем разница, или симуляция не так циклы симулирует?

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


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

Нужна сного помощь, такая проблема, есть вектор, от 1 до константы, как мне сделать его вида 1000.....00

 

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 
  current_floor(0) := '0';

 

компилятор говорит ошибка, но я уже столько раз проверял... я вместо 0 ставил переменную, я пробовл переобьявить сам вектор, число заменял битом со значением 1 ... что тоьлко не пробовал..... в общем 4 часа только над этим бьюсь, помогите.... пожалуйста :help:

 

ещё вопрос назрел, почему я не могу проверить два элемента массива выражением :

IF ( current_floor(current_floor_num) and floors_to_visit(current_floor_num)) THEN

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

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


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

Например, так:

current_floor :=(current_floor'low + 1 to current_floor'high => '0', current_floor'low => '1')

 

А вообще, почитайте http://www.eda.org/comp.lang.vhdl/FAQ1.html#const_vectors

Думаю, найдете много для себя полезного.

 

 

 

ещё вопрос назрел, почему я не могу проверить два элемента массива выражением :

IF ( current_floor(current_floor_num) and floors_to_visit(current_floor_num)) THEN

 

Потому что не может быть автоматически приведено к булевскому типу, поэтому нужно писать так:

IF ( current_floor(current_floor_num)='1' and floors_to_visit(current_floor_num)='1') THEN

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


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

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

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

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

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

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

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

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

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

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