Проблем ли е времето за настройка при асинхронни сигнали в процеси?

Когато даден сигнал е включен в списъка за чувствителност, този процес се изпълнява всеки път, когато този сигнал се промени. Например,

-- State Memory
-- Synchronous Reset
process (clk)
begin
    if (rst = '1') then
        p_state <= initialization;
    elsif (rising_edge(clk)) then
        p_state <= n_state;
    end if;
end process;

Ако обаче rst е включен в списъка за чувствителност, той става асинхронно нулиране. Моят въпрос сега би бил, когато се твърди първо. Процесът се изпълнява. Но стабилен ли е вече първият сигнал, така че стойността на първия сигнал да е '1'?


person Xegara    schedule 19.12.2013    source източник
comment
Можете ли да прегледате и изясните въпроса си; Не мога да разбера какво точно питаш. Bts. кодът по-горе ще ви даде предупреждение за синтез за липсващи сигнали rst и initialization в списъка за чувствителност.   -  person Morten Zilmer    schedule 19.12.2013


Отговори (3)


Вашият пример не е синхронно нулиране.

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

Предполагам, че initialization е дефинирано състояние, а не сигнал, в противен случай имате друг проблем там (стойностите за нулиране винаги трябва да са постоянни и да не зависят от друг сигнал).

person zennehoy    schedule 19.12.2013

Обикновено VHDL се използва за описание на проекти на ниво на прехвърляне на регистър. На това ниво на абстракция времето за настройка и задържане се игнорират. Тъй като времето за настройка и задържане на срещата често е по-скоро функция на физическото оформление на дизайна, отколкото на логиката, това предположение обикновено е разумно, когато се проверява логиката на дизайна.

Когато пишете VHDL process блокове, които имат непълни списъци с чувствителност, рискувате разлики между симулация и синтез, тъй като инструментите за синтез обикновено игнорират списъците с чувствителност. В резултат на това наистина имате два избора:

-- Asynchronous Reset
process (clk, rst)
begin
    if (rst = '1') then
        p_state <= (others => '0');
    elsif (rising_edge(clk)) then
        p_state <= n_state;
    end if;
end process;

-- Synchronous Reset
process (clk)
begin
    if (rising_edge(clk)) then
        if (rst = '1') then
            p_state <= (others => '0');
        else
            p_state <= n_state;
        end if;
    end if;
end process;

Не трябва да прилагате синхронно нулиране, като използвате шаблона за асинхронно нулиране и след това пропускате rst от списъка за чувствителност.

person godel9    schedule 19.12.2013
comment
Примерът с асинхронно нулиране по-горе липсва initialization в списъка с чувствителност. Също така наличието на стойност за асинхронно нулиране, която зависи от външен сигнал, вероятно ще създаде проблеми в някои FPGA технологии. - person Morten Zilmer; 19.12.2013
comment
@MortenZdk Добър улов... Не забелязах, че нулирането не използва постоянна стойност. - person godel9; 19.12.2013
comment
@MortenZdk Предполагам, че initialization не е сигнал, а състоянието, в което да започне след нулиране. - person zennehoy; 19.12.2013

Ако съм разбрал въпроса ви правилно, вие сте загрижени за времето за настройка (и, следователно, също времето за задържане) на тригера. Такива времена се отнасят за въвеждането на данни, а не за въвеждането за нулиране, което се изисква за предотвратяване на метастабилност и за постигане на правилно съхранение на данни.

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

person VAP    schedule 22.12.2013