Перейти к содержанию
    

VHDL. Работа с флагом.

В С я часто делаю так.

If (flag)
{
    flag = 0;
    //do something
}

По аналогии пишу в VHDL.

if (CLK'event and CLK='1') then

    If (packet_ready = '1') then

        --DO SOMETHING
        packet_ready <= '0';

    end if;    

end if;

И это даже компилируется. Но уменя есть сомнения что на том же клоке сигнал примет новое значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В С я часто делаю так.

If (flag)
{
    flag = 0;
    //do something
}

По аналогии пишу в VHDL.

if (CLK'event and CLK='1') then

    If (packet_ready = '1') then

        --DO SOMETHING
        packet_ready <= '0';

    end if;    

end if;

И это даже компилируется. Но уменя есть сомнения что на том же клоке сигнал примет новое значение.

 

Если это происходит в процессе, то код более, чем синтезируем. Но смысл будет иметь только, если у вас этот флаг при прогрузке инициализируется единицей и то, что вы делаете, делается один раз. Скорее всего проблема в том, что вы этот флаг пытаетесь в '1' устанавливать из другого процесса. VHDL не позволяет так делать.

 

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

 

Если нужно "мнгновенное" изменение какого-то флага, то используйте переменную в процессе.

Изменено пользователем Tausinov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если это происходит в процессе, то код более, чем синтезируем. Но смысл будет иметь только, если у вас этот флаг при прогрузке инициализируется единицей и то, что вы делаете, делается один раз. Скорее всего проблема в том, что вы этот флаг пытаетесь в '1' устанавливать из другого процесса. VHDL не позволяет так делать.

 

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

 

Если нужно "мнгновенное" изменение какого-то флага, то используйте переменную в процессе.

Я понял. Я таки делаю это в процессе.

process (CLK, State) begin 

    if (CLK'event and CLK='1') then
        
        case State is
                    
            when ST_WAIT_DONE =>
                 if (spi_can_wr_done_reg = '1') then
                  spi_can_wr_done_reg <= '0';
                                  
                 end if;

            end case;

end process;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

if (CLK'event and CLK='1') then

    If (packet_ready = '1') then

        --DO SOMETHING
        packet_ready <= '0';

    end if;    

end if;

И это даже компилируется. Но уменя есть сомнения что на том же клоке сигнал примет новое значение.

Присвоение значения в VHDL производится либо

flag <= x; если это сигнал

либо flag:=x; если флаг переменная.

Что у Вас (сигнал или переменная) - неясно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присвоение значения в VHDL производится либо

flag <= x; если это сигнал

либо flag:=x; если флаг переменная.

Что у Вас (сигнал или переменная) - неясно.

у меня сигнал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наличие процесса не избавляет от необходимости где-то этот флаг устанавливать. Из другого процесса у вас это сделать не получится все равно.

State в списке чувствительность лишний, возможны различия между симуляцией и реализацией.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наличие процесса не избавляет от необходимости где-то этот флаг устанавливать. Из другого процесса у вас это сделать не получится все равно.

State в списке чувствительность лишний, возможны различия между симуляцией и реализацией.

 

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

сигнал устанавливается в том же процесе в другом стэйте. насчет списка чувствительности - каждый раз думаю что в него засовывать а что нет. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сигнал устанавливается в том же процесе в другом стэйте. насчет списка чувствительности - каждый раз думаю что в него засовывать а что нет. :)

 

С этим все просто. Если процесс асинхронный, то все сигналы, а в VHDL2008 можно писать process(all). Если синхронный, т.е. все происходит под клоком, то только сам клок.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С этим все просто. Если процесс асинхронный, то все сигналы, а в VHDL2008 можно писать process(all). Если синхронный, т.е. все происходит под клоком, то только сам клок.

 

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

понял. спасибо.

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

переменную в смысле variable rx_byte_idx : integer; не сигнал?

 

кстати я читал что лучше использовать синхронные процессы.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кстати я читал что лучше использовать синхронные процессы.
Категория лучше/хуже здесь неприменима. Процесс -- это просто часть схемы, срабатывающая при изменении одного или нескольких сигналов. Описание асинхронной логики процессом нормальное явление.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

понял. спасибо.

 

переменную в смысле variable rx_byte_idx : integer; не сигнал?

 

кстати я читал что лучше использовать синхронные процессы.

 

 

process(clk)

variable flag_var : std_logic;

begin

if (rising_edge(clk)) then

if (flag_sig = '1') then

flag_var := '0';

else

flag_var := '1';

end if;

 

логика установки flag_sig;

 

дальше условия уже от (flag_var)

.....

end process;

 

Типа такого что-то. Можно даже в отдельный процесс вынести для наглядности.

 

Синхронные процессы используются для последовательной логики. Если задан клок некой частоты, то при совпадении таймингов гарантируется, что к следующему фронту клока все сигналы примут нужные значения. Использую синхронную логику можно организовать конвеерную обработку, позволяющую максимизировать пропускную способность и т.д.

Асинхронный процесс - комбинаторная логика со всеми вытекающими отсюда последствиями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Асинхронный процесс - комбинаторная логика со всеми вытекающими отсюда последствиями.
Ну и какие же последствия будут, если я вместо

y <= x1 when (s = '1') else x2;

напишу

process (x1, x2, s)
begin
  if (s = '1') then
    y <= x1;
  else
    y <= x2;
  end if;
end process;

?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и какие же последствия будут?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...