Подтвердить что ты не робот

VHDL Variable Vs. сигнал

Я читал текст (не имею его спереди, поэтому не могу дать название) о программировании VHDL. Одна из проблем, с которыми мне трудно разбираться в тексте, - это когда использовать переменную или сигнал. Я думаю, что у меня есть четкое представление о том, когда использовать сигнал (внутренний сигнал, который есть), но не столько для переменной.

Я заметил, что текст обычно объявляет и инициализирует сигналы перед определением процесса, в то время как переменная объявляется (и, я думаю, никогда не инициализирована..) внутри процесса.

В любом случае, чтобы очистить это, по определению или по примеру было бы здорово!

4b9b3361

Ответ 1

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

signal a,b : std_logic_vector(0 to 4);

process (CLK)
    begin
        if (rising_edge(clk)) then
            a <= '11111';
            b <= a;
        end if;
end process;

помещает в b значение a до запуска процесса, а не '11111 '. С другой стороны, код:

signal a,b : std_logic_vector(0 to 4);

process (CLK)
    variable var : std_logic_vector(0 to 4);
    begin 
        if (rising_edge(clk)) then
            var := '11111';
            a <= var;
            b <= var;
        end if;
end process;

поместит значение '11111' в a и b.

Честно говоря, по моему опыту, большую часть времени, когда вам не нужно использовать переменные, единственное место, которое я использовал, было в цикле, где мне нужно было проверить, не имеет ли какое-либо количество сигналов 1:

type    BitArray        is array (natural range <>) of std_logic;

--...

entity CAU_FARM is
    port
        (
            --   IN   --
              REQUEST         : in BitArray(0 to (FLOW_num -1));
              --..
        );
end CAU_FARM;
--...

farm_proc: process(CLK_FARM, RESET)
    variable request_was_made_var : std_logic;
    begin
    if RESET = C_INIT then 
       -- ...

    elsif rising_edge(CLK_FARM) then

            -- read state machine --
        case read_state is
            when        st_read_idle =>

                request_was_made_var := '0';
                for i in 0 to (FLOW_num -1) loop
                    if (REQUEST(i) = '1') then
                        request_was_made_var := '1';
                    end if;
                end loop;
                if (request_was_made_var = '1') and (chosen_cau_read_sig /= 8) then
                    read_state <= st_read_stage_1;
                    for i in 0 to (FLOW_num -1) loop
                        if (i = choice_out_sig) then
                            ACKNOWLEDGE(i) <= '1';
                        end if;
                    end loop;
                else
                    read_state <= st_read_idle;
                end if;
            ------------------------
            when        st_read_stage_1 =>
            --...

Ответ 2

Переменные предназначены для хранения значения внутри процесса. Таким образом, его объем ограничен. Там, как правило, менее прямая связь с синтезированным оборудованием.

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

signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5);

process (CLK)
    Variable TEMP : STD_LOGIC_VECTOR(0 to 5);
    begin
        if (rising_edge(clk)) then
            TEMP := IP;
            IP <= NEXTP;
            NEXTP <= TEMP(5) & TEMP(0 to 4);
        end if;
end process;

signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5);

process (CLK)

    begin
        if (rising_edge(clk)) then
            IP <= NEXTP;
            NEXTP <= IP(5) & IP(0 to 4);
        end if;
end process;

Это связано с тем, что обновления становятся запланированными, но пока еще не изменились. <= содержит временный элемент.

Ответ 3

переменные: временное местоположение; они используются для хранения промежуточных значений внутри "процесса".

Сигналы

: Обновить значения сигнала. Запустите процесс, активированный изменениями в сигнале. Когда процесс запущен, все сигналы в системе остаются неизменными.

Отличия:

переменные: они локальны; без задержки; объявлено в процессе

сигналы: они глобальны (до начала); задержка из-за провода; объявлено до начала ключевого слова

Ответ 4

На стороне примечание переменные не могут просто жить в процессах (но также, например, в процедурах), кроме того, они могут быть общими переменными, доступными из нескольких процессов (см. http://www.ics.uci.edu/~jmoorkan/vhdlref/var_dec.html).

Ответ 5

Переменные - они являются локальными для процесса, их значение обновляется, как только переменная получает новое значение.

Общие переменные - это как переменные, но к ним можно получить доступ из разных процессов.

Сигналы. Их объем больше, каждый процесс может получить доступ к сигналам, объявленным в архитектуре или конкретном блоке (если есть). Там значения обновления после приостановки процесса или встречает выражение ожидания.