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

Вопрос для разминки

Собственно работаю в Quartus6.0.

 

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

 

Если подаем на него в симуляции ресет из вне, то все работет.

Как я понял автомату нужен ресет из вне, но к сожелению у меня нет такой возможности. по этому я на ресет подаю постоянно 0. Но воз и ныне там.

 

1. Разве ему все же нужен внешний ресет и без этого ни как?

2. Как заставить его запуститься в железе?

 

Спасибо.

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


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

Собственно работаю в Quartus6.0.

 

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

 

Если подаем на него в симуляции ресет из вне, то все работет.

Как я понял автомату нужен ресет из вне, но к сожелению у меня нет такой возможности. по этому я на ресет подаю постоянно 0. Но воз и ныне там.

 

1. Разве ему все же нужен внешний ресет и без этого ни как?

2. Как заставить его запуститься в железе?

 

Спасибо.

Покажите ту часть кода где Вы выставляете Ваш reset сигнал. По идее ресет который всегда заземленный в коде не должен и не может требовать сигнал извне. В Вашем случае вобще не надо выводить reset в top port declaration, раз все равно им не пользоются.

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


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

Покажите ту часть кода где Вы выставляете Ваш 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(т.е. автомат ресетится с какимто периудом. это автомат для тестирования так что это позвалительно).

 

А есть ли более красивые решения проблемы?

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


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

1) пользуйтесь пожалуйста дескриптором

[cоde] your code [/cоde]

при вставке кода в сообщение - неформатированный код большого размера невозможно читать

2) прочтите, пожалуйста, правила пользования форумом - предыдущим постом вы нарушаете п.п. 3.3 Правил - нарвётесь на предупреждение

3) я сейчас работаю с Virtex от Xilinx - у них в аpхитектуре есть блоки фазовой подстройки частоты DCM (digital clock manager) при включение питания проходит некоторое время для того чтобы этот блок откалибровался и тактовый сигнал стабилизировался - о завершение калибровки оповещает установка выходного сигнала LOCKED из DCM. этот LOCKED и является для меня сигналом начального сброса регистров (хотя если более точно я этот LOCKED сигнал пропускаю ещё и через сдвиговый регистр)

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


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

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. Сейчас у вас ничего не работает, тк не указано ни одного начального значения, которое бы устанавливалось после подачи питания.

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


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

устанавливать сигнал reset при подаче питания и сбрасывать при переполнении счетчика, а счетчик после переполнения останавливать.

маленькое дополнение - останавливать счётчик необходимости в общем-то нет (если не вдаваться в филосовские вопросы энергосбережения ;) ) у вас же нет условия установки сигнала сброса снова в активное состояние

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


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

маленькое дополнение - останавливать счётчик необходимости в общем-то нет (если не вдаваться в филосовские вопросы энергосбережения ;) ) у вас же нет условия установки сигнала сброса снова в активное состояние

 

было в исходном коде, тут стерла во избежание... :tongue:

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


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

Если подаем на него в симуляции ресет из вне, то все работет.

Как я понял автомату нужен ресет из вне, но к сожелению у меня нет такой возможности. по этому я на ресет подаю постоянно 0.

Интересно, зачем вам ресет(в принципе вообще любой сингал), который в процессе своей работы вообще не меняет свое значение? :cranky:

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


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

Интересно, зачем вам ресет(в принципе вообще любой сингал), который в процессе своей работы вообще не меняет свое значение? :cranky:

 

 

Я просто не коректно выразился. Под фразой "подать ресет" я понимал подать на вх. ресет единичный импульс, который в свою очередь должен установить внутренние регистры в начальное состояние=)

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


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

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

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

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

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

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

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

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

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

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