Связь между процессами в VHDL

У меня проблемы с общением между процессами. Раньше я использовал flag и clearFlag для решения этой проблемы, но это немного раздражает и выглядит не очень хорошо. Как лучше всего справиться с этим? Вот пример кода того, как я это делал раньше:

Proc_A : process (clk, reset, clrFlag)
begin
    if clrFlag = '1' then
        flag <='0';
    elsif reset = '0' then 
        A <= (others => '0');
    elsif rising_edge (clk) then
        A <= in;
        flag <= '1';
    end if;
end process;

Proc_B : process (clk, reset)
begin
    if reset = '0' then 
        B <= (others => '0');
    elsif rising_edge (clk) then
        if flag = '1' then
            B <= data;
            clrFlag <= '1';
        else 
            clrFlag <= '0';
        end if;
    end if;
end process;

Этот способ работает, но я не думаю, что это хороший метод. Я должен написать пару флагов и clrFlag, чтобы выполнить эту задачу. Все, что я хочу сделать, это когда что-то произошло (например, A ‹= in;), оно запускает другой процесс, например Proc_B, для запуска один или несколько раз. Какова наилучшая практика решения этой проблемы? Спасибо!


person nigong    schedule 01.05.2013    source источник


Ответы (1)


Для моделирования вы можете заставить процесс ожидать сигнала:

Proc_B : process
begin
    wait until flag'event;
    B <= data;
end process;

и просто пишите флаг с инверсией каждый раз, когда вам нужно, чтобы что-то произошло.

В синтезируемой логике вы либо должны обмениваться флаговыми сигналами, как вы это делаете, либо использовать какую-либо другую связь более высокого уровня (например, FIFO, окно сообщений или подобное).

Однако, если вся ваша proc_b логика выполняется в одном цикле - так что вы можете гарантировать, что не пропустите флаг и сможете не отставать, даже если флаг установлен все время (как это похоже на то, что вы делаете) - вы можете сделайте это (и объедините два процесса):

Proc : process (clk, reset, clrFlag)
begin
    flag <='0';
    if reset = '0' then 
        A <= (others => '0');
        B <= (others => '0');
    elsif rising_edge (clk) then
        if some_trigger_event = '1' then
           A <= in;
           flag <= '1';
        end if;
        -- recall that due to VHDL's scheduling rules, this "if" will take place 
        -- one clock cycle after the flag is written to, just as if it were in a
        -- separate process
        if flag = '1' then
            B <= data;
        end if;
    end if;
end process;

Боковое примечание: ваш код не идеален для синтеза... вам действительно нужна только часть сброса вне тактовой части:

Proc_A : process (clk, reset)
begin
    if reset = '0' then 
        A <= (others => '0');
    elsif rising_edge (clk) then
      if clrFlag = '1' then
        flag <='0';
      else
        A <= in;
        flag <= '1';
    end if;
end process;
person Martin Thompson    schedule 01.05.2013