slash_spb 0 28 апреля, 2007 Опубликовано 28 апреля, 2007 · Жалоба Собственно работаю в Quartus6.0. Написал(VHDL) простенький автомат, который в свою очередь должен циклически посылать определенные данные(куда не очень и важно в вопросе). Так вот даже при симуляции он ни как не хочет запускатся(в железе аналогично). Если подаем на него в симуляции ресет из вне, то все работет. Как я понял автомату нужен ресет из вне, но к сожелению у меня нет такой возможности. по этому я на ресет подаю постоянно 0. Но воз и ныне там. 1. Разве ему все же нужен внешний ресет и без этого ни как? 2. Как заставить его запуститься в железе? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CodeWarrior1241 0 28 апреля, 2007 Опубликовано 28 апреля, 2007 · Жалоба Собственно работаю в Quartus6.0. Написал(VHDL) простенький автомат, который в свою очередь должен циклически посылать определенные данные(куда не очень и важно в вопросе). Так вот даже при симуляции он ни как не хочет запускатся(в железе аналогично). Если подаем на него в симуляции ресет из вне, то все работет. Как я понял автомату нужен ресет из вне, но к сожелению у меня нет такой возможности. по этому я на ресет подаю постоянно 0. Но воз и ныне там. 1. Разве ему все же нужен внешний ресет и без этого ни как? 2. Как заставить его запуститься в железе? Спасибо. Покажите ту часть кода где Вы выставляете Ваш reset сигнал. По идее ресет который всегда заземленный в коде не должен и не может требовать сигнал извне. В Вашем случае вобще не надо выводить reset в top port declaration, раз все равно им не пользоются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slash_spb 0 28 апреля, 2007 Опубликовано 28 апреля, 2007 · Жалоба Покажите ту часть кода где Вы выставляете Ваш reset сигнал. По идее ресет который всегда заземленный в коде не должен и не может требовать сигнал извне. В Вашем случае вобще не надо выводить reset в top port declaration, раз все равно им не пользоются. ... architecture one of top_fsm is ... signal RST: std_logic; begin RST <= '0'; A:FSM_micrel_io port map(clock,RST,t_done,t_datai,t_addri,t_wri,t_run,t_rst); end architecture; Вы правильно поняли. Только вот что получается. Процесс с моим автоматом A:FSM_micrel_io не запускается. На симуляции я неоднократно убеждался. Приведу еще один пример, простенький автомат: library ieee; use ieee.std_logic_1164.all; entity fsm is port(clk: in std_logic; w: in std_logic; z: out std_logic; state: out std_logic_vector(3 downto 0)); end entity; architecture behavior of fsm is type state_fsm is (A,B,C,D,E,F,G,H,I); signal y_Q,y_D: state_fsm;--y_Q present state, y_D is next state signal reset: std_logic; begin reset <= '1'; process(w,y_Q) begin case y_Q is when A => if w='0' then y_D <= B; elsif w='1' then y_D <= F; end if; state <= "0000"; when B => if w='0' then y_D <= C; elsif w='1' then y_D <= F; end if; state <= "0001"; when C => if w='0' then y_D <= D; elsif w='1' then y_D <= F; end if; state <= "0010"; when D => if w='0' then y_D <= E; elsif w='1' then y_D <= F; end if; state <= "0100"; when E => if w='0' then y_D <= E; elsif w='1' then y_D <= F; end if; state <= "1000"; when F => if w='0' then y_D <= B; elsif w='1' then y_D <= G; end if; state <= "1001"; when G => if w='0' then y_D <= B; elsif w='1' then y_D <= H; end if; state <= "0101"; when H => if w='0' then y_D <= B; elsif w='1' then y_D <= I; end if; state <= "0111"; when I => if w='0' then y_D <= B; elsif w='1' then y_D <= I; end if; state <= "1111"; end case; end process; process(clk,reset) begin if reset='0' then y_Q <= A; elsif clk='1' and clk'event then y_Q <= y_D; end if; end process; process(y_Q) begin --case y_Q is -- when A => state <= "0000"; -- when B => state <= "0001"; -- when C => state <= "0010"; -- when D => state <= "0011"; -- when E => state <= "0100"; -- when F => state <= "0101"; -- when G => state <= "0110"; -- when H => state <= "0111"; -- when I => state <= "1000"; --end case; case y_Q is when E => z<='1'; when I => z<='1'; when others => z<='0'; end case; end process; end behavior; Как видно сигнал RESET в 1 следовательно автомат должен сразу начать свою работу при заливке в кристал, но не туто было, он не запустится(на симуляции тоже самое). Сейчас я решил эту проблему так, поставил счетчик и старший разряд завел на RESET(т.е. автомат ресетится с какимто периудом. это автомат для тестирования так что это позвалительно). А есть ли более красивые решения проблемы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 28 апреля, 2007 Опубликовано 28 апреля, 2007 · Жалоба 1) пользуйтесь пожалуйста дескриптором [cоde] your code [/cоde] при вставке кода в сообщение - неформатированный код большого размера невозможно читать 2) прочтите, пожалуйста, правила пользования форумом - предыдущим постом вы нарушаете п.п. 3.3 Правил - нарвётесь на предупреждение 3) я сейчас работаю с Virtex от Xilinx - у них в аpхитектуре есть блоки фазовой подстройки частоты DCM (digital clock manager) при включение питания проходит некоторое время для того чтобы этот блок откалибровался и тактовый сигнал стабилизировался - о завершение калибровки оповещает установка выходного сигнала LOCKED из DCM. этот LOCKED и является для меня сигналом начального сброса регистров (хотя если более точно я этот LOCKED сигнал пропускаю ещё и через сдвиговый регистр) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SunnyAngel 0 28 апреля, 2007 Опубликовано 28 апреля, 2007 · Жалоба 2 slash_spb: 1. signal reset: std_logic := '0'; -- начальное значение сигнала. Если этого присвоения не будет, то компилятор подставит то значение, которое будет удобнее. 2. reset <= '1'; -- убрать эту строку после begin 3. частенько возникает необходимость удерживать сигнал reset в течение некоторого времени. Для этого удобно сделать счетчик нужной разрядности, устанавливать сигнал reset при подаче питания и сбрасывать при переполнении счетчика, а счетчик после переполнения останавливать. signal cnt : std_logic_vector(2 downto 0) := "000"; reset_proc: process ( clk ) begin if clk'event and clk = '1' then if cnt = wait_1s then RESET <= '1'; else cnt <= cnt + 1; end if; end if; end process; 4. Сейчас у вас ничего не работает, тк не указано ни одного начального значения, которое бы устанавливалось после подачи питания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 28 апреля, 2007 Опубликовано 28 апреля, 2007 · Жалоба устанавливать сигнал reset при подаче питания и сбрасывать при переполнении счетчика, а счетчик после переполнения останавливать. маленькое дополнение - останавливать счётчик необходимости в общем-то нет (если не вдаваться в филосовские вопросы энергосбережения ;) ) у вас же нет условия установки сигнала сброса снова в активное состояние Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SunnyAngel 0 28 апреля, 2007 Опубликовано 28 апреля, 2007 · Жалоба маленькое дополнение - останавливать счётчик необходимости в общем-то нет (если не вдаваться в филосовские вопросы энергосбережения ;) ) у вас же нет условия установки сигнала сброса снова в активное состояние было в исходном коде, тут стерла во избежание... :tongue: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slash_spb 0 29 апреля, 2007 Опубликовано 29 апреля, 2007 · Жалоба Спасибо всем большое=) Извиняюсь за нарушения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OgRe 0 30 апреля, 2007 Опубликовано 30 апреля, 2007 · Жалоба Если подаем на него в симуляции ресет из вне, то все работет. Как я понял автомату нужен ресет из вне, но к сожелению у меня нет такой возможности. по этому я на ресет подаю постоянно 0. Интересно, зачем вам ресет(в принципе вообще любой сингал), который в процессе своей работы вообще не меняет свое значение? :cranky: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slash_spb 0 1 мая, 2007 Опубликовано 1 мая, 2007 · Жалоба Интересно, зачем вам ресет(в принципе вообще любой сингал), который в процессе своей работы вообще не меняет свое значение? :cranky: Я просто не коректно выразился. Под фразой "подать ресет" я понимал подать на вх. ресет единичный импульс, который в свою очередь должен установить внутренние регистры в начальное состояние=) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться