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

добрый день,

Задача такая, на вход подается 8 битный вектор, в котором только одна 1, начальное условие 10000000, еще есть выходное число, позиция, оно соответсвуе месту 1цы в векторе.

 

library IEEE;
use IEEE.std_logic_1164.all;

--------------------------------------------------------
entity POSITIONING is
  port (INPUT          : in  bit_vector(0 to 7);
        STATE          : out bit_vector(1 downto 0);
        POSITION       : out integer);
end POSITIONING;


--------------------------------------------------------
architecture MUDEL of POSITIONING is   
begin    
  
  process  
  variable pos_number : integer := 1;
  variable marker : bit_vector (0 to 7) := "10000000";  
  
  begin  
    if (marker = input) then 
      state <= "00";
      position <= pos_number;
    
    elsif (marker > input) then
      state <= "01";
      pos_number := pos_number - 1;
      position <= pos_number;
      marker := marker sll 1;
      
    
    elsif (marker <input) then
      state <= "10";
      pos_number :=pos_number + 1;
      position <= pos_number;
      marker := marker srl 1;
    
    end if;
  wait for 1000 ms;   
  end process; 
    
end MUDEL;

 

я написал код. как смог... но в симуляции число растет, и не меняется ... и ещё... важно чтобы изменения происходили раз в секунду ... это чтото вроде описания движения лифта , вектор это этаж, позиция номер этажа, а двойной вектор, это просто анправление, 00 стоим, 01 10 вверх и вниз.

 

Я не понимаю почему не выполняются условия, почему он все вермя увеличивает значение маркера?

 

Буду очень благодарен за помощь

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


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

у вас конструкция не синтезируемая.

 

напишите как вы изменяете input вход.

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

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


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

у меня есть второй файл, дляс имуляции

 

library IEEE;
use IEEE.std_logic_1164.all;

entity TB_POSITIONING is
end TB_POSITIONING;

architecture testbench of TB_POSITIONING is

component POSITIONING is
  port (INPUT          : in  bit_vector(0 to 7);
        STATE          : out bit_vector(1 downto 0);
        POSITION       : out integer);
end component;

signal t_input: bit_vector(0 to 7);
signal t_state: bit_vector(1 downto 0);
signal t_position: integer;

begin

POS: POSITIONING port map(t_input, t_state, t_position);    
    process
    begin
    t_input<="00010000";
    wait for 10 sec;
    
    t_input<="00010000";
    wait for 10 sec;
    
    t_input<="00000001";
    wait for 10 sec;
    
    t_input<="01000000";
    
    wait;
    end process;
    
end testbench;

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


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

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

 

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

 

 

ещё, если кому не сложно, посоветуйте хорошую книжку по вхдлу, чтобы можно было заказать её с сайта www.books.ru

заранее спасибо, я только с этого сайта могу русские книги получать, тут у нас из русских только сорокин :)

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

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


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

Ошибка в сдвиге. Вы сразу сдвигали влево и '1' исчезала.

Довил условие и теперь ниже 1 этаже (ровно также как и выше 8го) уехать нельзя ;)

 

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

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

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


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

чтото не так, вообще никак не реагирует в симуляции....

 

 

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

почему то он начинает сразу с 2 ... т.е такой шустрый малый :) и второе , он реагирует раз в секунду :) тупит.

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

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


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

то что нашел ,model sim работает и не надо платить, и не требует 4 гига ... как этот quadrus или как его там

 

какая у вас программа хорошая .. наглядно, я нажал в модео сим сохранить диаграмму, завис, жду....

 

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

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

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


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

Вот то что в modelsim получилось и исходники

Оказывается modelsim не умеет выводить в waveforms переменную из процесса.

 

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

 

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

если будете что то подобное синтезировать получите неработоспособную схему.

msim.zip

post-6688-1223317997_thumb.jpg

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


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

 
library IEEE;
use IEEE.std_logic_1164.all;

--------------------------------------------------------
entity POSITIONING is
  port (INPUT          : in  bit_vector(0 to 7);
        STATE          : out bit_vector(1 downto 0);
        POSITION       : out integer);
end POSITIONING;


--------------------------------------------------------
architecture MUDEL of POSITIONING is   
begin    
  
  process 
        variable pos_number : integer := 0;
        variable marker : bit_vector (0 to 7) := "10000000";  
    begin
        if (marker = input) then 
            state <= "00";    
            position <= pos_number;
            marker := marker;
            
        elsif (marker > input) then
            state <= "01";
            position <= pos_number;
            pos_number := pos_number + 1;
            if marker /= "00000001"  then
                marker := marker srl 1;         
            end if;
            
        elsif (marker < input) then
            state <= "10";
            position <= pos_number;    
            pos_number :=pos_number - 1;  
            if marker /= "10000000"  then
                marker := marker sll 1;
            end if;    
            
        end if;
        
        wait for 1000ms;
                
    end process;
    
end MUDEL;

 

вот в таком виде все как надо , но http://www.pld.ttu.ee/~uljana/IAY0040/lab2...es/image004.jpg

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

 

вот кстати картинка

 

 

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

post-29867-1223318523_thumb.jpg

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

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


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

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

у Вас шаг в файле для симуляции как раз секунда.

 

Там можно попробовать вот так написать:

wait for 10.36 sec;

 

А если вам нужно чтобы быстрее значение на выходе появлялось тo

wait for 1ms; нужно поставить в modul.vhd

 

дельта T - это шаг симуляции. если вы поставите его слишком маленький то 50 sec будете ждать то утра следующей недели. поэтому он должен быть выбран оптимально, быть равен минимальной задержке (если 'wait'-конструкция используется). Изменяется через параметр при старте: vsim -t <ms|us|ns|ps|fs> <entity>

 

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

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

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


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

пока надо освоиться с языком...

 

у меня одна секунда потому, что "лифт" едет медленно, и менятся должны значения разв в секунду

 

 

 

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

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

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


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

пока надо освоиться с языком...

 

у меня одна секунда потому, что "лифт" едет медленно, и менятся должны значения разв в секунду

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

 

Опишите свою задачу более подробно, пожайлуста. Какие входные данные, какие выходные данные, что должно делать Ваше устройство?

 

По поводу русских книг поищите здесь в поиске наберите VHDL

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


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

это чтото вроде модели лифта, входные данные, это вектор (8 бит ), 1 в нём означает этаж, куда ехать надо, выходной вектор (2 бита ) это направление движения, 00 стоим, 01 вверх 10 вниз. и одно число - это типо этаж, на котором мы.

 

изначально 1000_0000 ( младший слева ).

 

Например подаем 0000_1000.

начинается, выходной 01 (вверх), число 0, через секунду 1 , через секунду 2, через секунду 3, через секунду 4 и сразу вектор 00 , типо приехали.

 

Подаем 0010_0000

выходной вектор 10 (вниз), число 4, секунда 3, секунда 2 и вектор 00, стоим.

 

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

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


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

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

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

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

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

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

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

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

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

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