Как использовать цикл for в процедуре - PullRequest
0 голосов
/ 11 июля 2019

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

Мой код выглядит так:

FSM : process(CLK, RST)
    procedure Reset is
    begin
        triplet_check_vec <= (others=>'0');
    end Reset;

    procedure triplet_check is
    begin
        for k in 0 to 19 loop
            triplet_check_vec(k) <= (DATA_IN(3*k+0) and DATA_IN(3*k+1) and DATA_IN(3*k+2)) or (not(DATA_IN(3*k+0)) and not(DATA_IN(3*k+1)) and not(DATA_IN(3*k+2)));
        end loop;
    end triplet_check;

begin
    if RST = '1' then
        Reset;

    elsif rising_edge(CLK) then
        -- some stuff
        -- ...

        triplet_check;

        -- ...
        -- some stuff
    end if;

end process FSM;

По какой-то причине triplet_check_vec инициализируется процедурой Reset, но не затрагивается процедурой triplet_check.

Есть идеи почему?

1 Ответ

0 голосов
/ 15 июля 2019

Список параметров процедуры определяет ее входы и выходы, как мини-модуль.Это может быть сигнал или константа, но, в отличие от модуля, он также может быть переменной.Подробнее Как использовать процедуру в VHDL

Основной синтаксис для создания процедуры:

procedure <procedure_name> (signal|variable|constant <name1> : in|out|inout <type>;
                            signal|variable|constant <name2> : in|out|inout <type>;
                            ... ) is
    <signal_constant_or_variable_declarations_for_use_within_the_procedure>
begin
    <code_performed_by_the_procedure_here>
end procedure;

Для вашего примера

procedure triplet_check (constant DATA_IN             : in    std_logic_vector(59 downto 0);
                         variable triplet_check_vec   : out   std_logic_vector(19 downto 0)) is
begin
    for k in 0 to 19 loop
        triplet_check_vec(k) <= (DATA_IN(3*k+0) and DATA_IN(3*k+1) and DATA_IN(3*k+2)) or (not(DATA_IN(3*k+0)) and not(DATA_IN(3*k+1)) and not(DATA_IN(3*k+2)));
    end loop;
end triplet_check;
...