silica 0 23 февраля, 2006 Опубликовано 23 февраля, 2006 · Жалоба Подскажите как лучше сделать запуск 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 23 февраля, 2006 Опубликовано 23 февраля, 2006 · Жалоба я в этом деле не профессионал конечно, но мне кажется, что все лучше засинхронизировать на один клок, а то никто не даст гарантии что 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 по падающему, а состояния менять по восходящему… Но я больше чем уверен что для детерминированности необходимо иметь единый синхро клок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gate 0 23 февраля, 2006 Опубликовано 23 февраля, 2006 · Жалоба Сформируйте из фронта и спада этого асинхронного события однотактные стробы в сетке главного клока и дальше работайте с ними. В таком случае вся SM будет синхронной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
silica 0 23 февраля, 2006 Опубликовано 23 февраля, 2006 · Жалоба Спасибо всем, я уже понял, что не суждено мне овладеть искусством асинхронной схемотехники :) Все перевел в синхронную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 26 февраля, 2006 Опубликовано 26 февраля, 2006 · Жалоба Сформируйте из фронта и спада этого асинхронного события однотактные стробы в сетке главного клока и дальше работайте с ними. В таком случае вся SM будет синхронной. Немного добавлю для ясности. Дело в том, что у синхронных сигналов детерминированные setup-hold. А у асинхронного - недетерминированные. Поэтому до части триггеров СМ сигнал дойдет правильно, а до части - может и не дойти. Вот тогда Ваш СМ перекосит так, как Вам и не приснится в страшном сне. Посмотрите сайт фирмы sunburst, там много доки. Удачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться