2016-02-26 3 views
1

Код VHDL ниже - простая программа обмена. Но он не заменяет входы a и b. Я дал значения транскрипта в комментариях.vhdl программа не меняет целые числа

library ieee; 
use ieee.std_logic_1164.all; 

entity vhdl_swap is 
    port(a,b: inout integer); 
end vhdl_swap; 

architecture ar of vhdl_swap is 
    signal s : std_logic; 
begin 

    process(s) 
    variable var : integer:=0; 
    begin 
    report "var is" & integer'image(var); -- 0 
    report "a is " & integer'image(a); -- 10 - (given value when simulated) 
    report "b is " & integer'image(b); -- 20 - (given value when simulated) 

    report "---------------------------"; 

    var := a; 
    report "var is " & integer'image(var);--var = 10 (assigned properly) 
    a<=b; 
    report "a is " & integer'image(a);-- a=10(same value but not assigned) 
    b<=var; 
    report "b is " & integer'image(b);-- b=20(same value but not assigned) 

    report "-----------------------------------"; 

    report "a is " & integer'image(a);--a=10 
    report "b is " & integer'image(b);--b=20 

    --print() 

    end process; 
end; 

Существует нечто, что действует в заявлении a<=b, но я не знаю, что мешает самому назначать ее.

ответ

3

Новое значение, присвоенное VHDL <=, недоступно для чтения до тех пор, пока не пройдет delta delay.

Это фундаментальное свойство VHDL, поскольку оно отражает то, как работает обновление регистра, а сигнал, запускающий обновление, - это часы.

Это также означает, что вы на самом деле может сделать своп без переменной, а просто делать:

a <= b; 
b <= a; 

Есть другие проблемы с кодом, например, то, что используется s, используя a и b для входа и выхода, приведет к конфликту с диском, если функция разрешения не будет добавлена.

1

Если вы назначили новое значение для сигнала в VHDL с <= без явной задержки (с after <time>), то новое значение сигнала будет доступно в следующем дельта-цикле. Новый дельта-цикл начинается, когда симулятор приостановил все процессы, которые были запланированы для текущего дельта-цикла. И процесс приостанавливается в заявлении wait. В конце процесса у вас есть неявный оператор wait on S;, потому что вы описали процесс со списком чувствительности, содержащим S. Вы назначили порты inouta и b, которые ведут себя так же, как и сигнал.

Поскольку обновление сигнала отображается только до следующего цикла дельта, все ваши операторы отчетов распечатывают одинаковое значение для a и b соответственно. То есть, они печатают значения a и b, когда процесс был запущен/возобновлен.

Назначение сигнала отличается от назначения переменной, например. var в вашем коде, который немедленно обновляется.

Ваш процесс выполняется только один раз, потому что сигнал S не изменяется. Каждый процесс выполняется один раз после запуска моделирования, а затем приостанавливается в операторе wait (неявный в коде, как описано выше).

Вы сказали, что a и b имеют начальное значение 10 и 20 соответственно, но я не смог воспроизвести это с помощью ModelSim или GHDL. Я попытался с помощью следующей тестбенча, которую я считаю единственно возможным способом:

library ieee; 
use ieee.std_logic_1164.all; 

entity vhdl_swap_tb is 
end entity vhdl_swap_tb; 

architecture sim of vhdl_swap_tb is 
    -- component ports 
    signal a : integer := 10; 
    signal b : integer := 20; 
begin -- architecture sim 

    -- component instantiation 
    DUT: entity work.vhdl_swap 
    port map (
     a => a, 
     b => b); 

end architecture sim; 

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


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

library ieee; 
use ieee.std_logic_1164.all; 

entity swap is 
end entity swap; 

architecture sim of swap is 
    signal a  : integer := 10; 
    signal b  : integer := 20; 
    signal clock : std_logic := '1'; 
begin 

    -- clock generation 
    clock <= not clock after 10 ns; 

    -- swapping 
    process(clock) 
    begin 
    if rising_edge(clock) then 
     a <= b; 
     b <= a; 
    end if; 
    end process; 
end sim; 

подкачка делается на каждом нарастающем фронте тактового сигнала, как можно видеть в следующей форме волны:

simulation output

+0

Спасибо u для ур подробный ans..ur код в процентах работает. У меня есть некоторые вопросы. 1) все порты являются сигналами по умолчанию, поэтому почему модификации ur не работали в моем коде при изменении.2) Я хочу поменять значения, данные пользователями во время симуляции, когда я сделал это в программе ур, это не замена, почему так? – george

+0

@george Вам нужны разные порты для входов и выходов. Вы не можете переключаться с помощью 'inout'. (Мой код на самом деле демонстрирует обмен значениями регистров.) –

+0

поэтому, когда мы можем использовать inout и buffer? – george