2017-01-17 2 views
0

Я трудно понять последствия этого кода: Мой компонент:Когда изменяется переменная в списке чувствительности, запускает процесс в vhdl?

library IEEE; 
use IEEE.std_logic_1164.all; 

entity problem is 
    port(
    clk : in std_logic; 
    a : in std_logic); 
end problem; 

architecture impl of problem is 
    signal a_sig : std_logic; 

begin 
    clk_proc : process(clk) 
    begin 
    if rising_edge(clk) then 
     a_sig <= '0'; 
    end if; 
    end process; 

    a_proc : process(a) 
    begin 
    report "a received : " & std_logic'image(a); 
    a_sig <= a; 
    end process; 

    a_sig_proc : process(a_sig) 
    begin 
    report "a_sig set : " & std_logic'image(a_sig); 
    end process; 
end impl; 

и это мой testbench.vhd:

library IEEE; 
use IEEE.std_logic_1164.all; 

entity testbench is 
end testbench; 

architecture tb of testbench is 
    component problem is 
    port (clk : in std_logic; 
      a : in std_logic); 
    end component; 

    constant clk_period : time := 1 ms; 
    signal clk_sig : std_logic; 
    signal a_sig : std_logic; 
begin 
    dut : problem port map (clk_sig, a_sig); 

    process 
    begin 
    clk_sig <= '1'; 
    wait for clk_period/2; 
    clk_sig <= '0'; 
    wait for clk_period/2; 
    end process; 

    process 
    begin 
    wait for clk_period * 0.75; 
    a_sig <= '1'; 
    end process; 

end tb; 

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

$ ghdl -r testbench --vcd=testbench.vcd --stop-time=2ms 
problem.vhd:23:5:@0ms:(report note): a received : 'U' 
problem.vhd:29:5:@0ms:(report note): a_sig set : 'U' 
problem.vhd:23:5:@750us:(report note): a received : '1' 
problem.vhd:29:5:@1ms:(report note): a_sig set : 'X' 
./testbench:info: simulation stopped by --stop-time 

Я понимаю, сигналы на «U» поступают в 0ms, и я могу понять сигнал «1» принимается в problem.a_proc в 750microseconds. Первое, что меня смущает, - почему проблема not.a_sig_proc запускается с помощью команды a_sig в ​​том же процессе? И затем, когда запускается проблема.a_sig_proc, a_sig имеет значение «X». Если бы кто-то мог указать мне на источник, чтобы объяснить это, было бы здорово :)

Заранее благодарен!

ответ

2

Вы управляете сигналом a_sig из нескольких процессов (clk_proc и a_proc). Вам нужно будет удалить назначение a_sig в ​​одном из процессов (поскольку симулятор не может решить, какое присвоение имеет приоритет), или диск «Z» (высокий импеданс) на a_sig из процессов, в то время как это не «их очередь». Имеются хорошие пояснения here и here

Смежные вопросы