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

Асинхронное событие и стейт машина.

Подскажите как лучше сделать запуск SM по асинхронному событию?

К примеру есть тактовая, ресет и асинхронный сигнал, необходимо что бы SM запускался каждый раз по переднему и заднему фронту этого асинхронного сигнала. Я думал сделать так ( но понимаю что не правильно):

process (rst,clk,FR)                   
begin
    if (rst = '1') then
           next_state <= IDLE;   
    elsif (FR'event)and (FR='1' or FR='0') then       
         next_state <= LOAD;      
    elsif (clk'event and clk = '0') then
        case next_state is
        when IDLE =>   
           next_state <= IDLE;
        when LOAD =>
           next_state <=WORK;
        when WORK =>
           next_state <=IDLE;
        end case;
  end if;
end process;

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


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

я в этом деле не профессионал конечно, но мне кажется, что все лучше засинхронизировать на один клок, а то никто не даст гарантии что CLK'event и RST’event и FR’event не произойдут в один момент...

 

 

я бы сделал так:

 

signal LastFRState: std_logic :='0';

process (rst,clk,FR)

begin

if clk'event and clk='1' then

if (rst='1') then

next_state <= IDLE;

else

if LastFRState /= FR then

next_state <= LOAD;

LastFRState <= FR;

else

case next_state is

when IDLE =>

next_state <= IDLE;

when LOAD =>

next_state <=WORK;

when WORK =>

next_state <=IDLE;

end case;

end if;

end if;

end if;

end process;

 

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

ресет происходит синхронно, если нет ресета то каждый раз когда происходит смена состояния FR, машина переходит в состояние лоад, причем опять же это происходит по клоку а не когда попало..., если нет ресета и нет смены FR, то машина выполняет свою работу. По моему так получилось достаточно детерменированно, и при достаточной разнице частот FR и CLK, никаких проблем быть не должно... Плата за это возможно 1 лишний такт работы машины при поднятии FR между фронтами сигнала CLK, но я думаю это небольшая плата за надежность системы?...

 

возможны вариации с тем где стоит LastFRState <= FR, ее можно и в общий процесс запихать, логики это не изменит. А можно еще попробовать работать по обоим фронтам CLK, то есть обрабатывать FR по падающему, а состояния менять по восходящему… Но я больше чем уверен что для детерминированности необходимо иметь единый синхро клок.

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


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

Сформируйте из фронта и спада этого асинхронного события однотактные стробы в сетке главного клока и дальше работайте с ними. В таком случае вся SM будет синхронной.

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


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

Спасибо всем, я уже понял, что не суждено мне овладеть искусством асинхронной схемотехники :)

Все перевел в синхронную.

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


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

Сформируйте из фронта и спада этого асинхронного события однотактные стробы в сетке главного клока и дальше работайте с ними. В таком случае вся SM будет синхронной.

 

Немного добавлю для ясности. Дело в том, что у синхронных сигналов детерминированные setup-hold.

А у асинхронного - недетерминированные. Поэтому до части триггеров СМ сигнал дойдет правильно, а до части - может и не дойти. Вот тогда Ваш СМ перекосит так, как Вам и не приснится в страшном сне.

Посмотрите сайт фирмы sunburst, там много доки.

Удачи.

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


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

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

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

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

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

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

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

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

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

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