Я пытаюсь написать счетчик, имеющий вход (начало) и три выхода (tsy, tsr, tlg), которые утверждаются для 1 clk_period
после 4, 6 и 16 clk_period
соответственно. Следующий код отлично подходит для одного утверждения запуска.Weird delayed-output поведение при вызове процесса дважды
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.numeric_std.all ;
entity proj_test is
port (
clk, start : in bit;
tsy, tsr, tlg : out bit
) ;
end entity ; -- proj_test
architecture behav of proj_test is
constant clk_period : time := 100 ns;
begin
process (start)
begin
if (start='1') then
tsy <= '1' after 4*clk_period, '0' after 5*clk_period;
tsr <= '1' after 6*clk_period, '0' after 7*clk_period;
tlg <= '1' after 16*clk_period, '0' after 17*clk_period;
end if;
end process;
end architecture ; -- behav
В start
импульсы 400 нс друг от друга, как и приводится ниже код:
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.numeric_std.all ;
entity proj_test_test is
end entity proj_test_test;
architecture behav of proj_test_test is
constant clk_period : time := 100 ns;
signal clk, start : bit;
signal tsy, tsr, tlg : bit;
begin
P : entity work.proj_test port map (clk, start, tsy, tsr, tlg);
start <= '0',
'1' after 2*clk_period,
'0' after 3*clk_period,
'1' after 6*clk_period,
'0' after 7*clk_period,
'1' after 42*clk_period;
end architecture behav;
или следующих команд тренажера:
force -freeze sim:/proj_test/clk 0 0, 1 {50 ns} -r 100
force -freeze sim:/proj_test/start 1 0, 0 100, 1 400, 0 500
Однако, когда я утверждаю вход start
во второй раз, tsy
охватывает несколько периодов времени.
Я пытаюсь понять, почему. Я предполагаю, что второй вызов процесса «сбрасывает» присвоения первого. Кроме того, есть ли лучший способ написать поведение этого счетчика?
Вы пытаетесь написать код, который может быть синтезирован? –
@scary_jeff Нет, это для тестового стенда. – usfmohy
Отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve). Странное поведение выглядит вне этого кода. –