vhdl-fsm с таймером задержки тактового цикла

я должен написать в vhdl FSM с таймером.

Я думаю, чтовам не нужно утомляться от понимания того, что будет делать моя схема.

Я просто хотел помочь мне с этим: при каждом переходе из одного состояния в другое возникает одна (или более) задержка такта. Вопрос в том, как я могу этого избежать?< /сильный>

мой VHDL-код:

library IEEE;
   use IEEE.STD_LOGIC_1164.ALL;
   use IEEE.STD_LOGIC_unsigned.ALL;

entity fsm_timers is
port( x: in bit; 
      clk, rst: in std_logic;
        y: out bit);
end fsm_timers;

architecture Behavioral of fsm_timers is
constant T1: std_logic_vector(7 downto 0) :="00000011";                                                       
constant T2: std_logic_vector(7 downto 0) :="00000111";               
signal t: std_logic_vector(7 downto 0) := (others=>'0');
signal rst_cnt: std_logic :='0';

Type state is (A,B,C);
signal pr_state, nx_state : state := A;

component counter is
 port(reset,clock, inner_rst:in std_logic;
      cnt:out std_logic_vector(7 downto 0));
 end component;
begin
U_sum_counter: counter port map(
        reset => rst,
        inner_rst => rst_cnt,
        clock => clk,
        cnt => t);

process(clk,rst)
begin
    if (rst='1') then
        pr_state<= A;
    elsif (rising_edge(clk)) then
       pr_state<=nx_state;
    end if;

end process;

process(x,t,pr_state)
begin
    case pr_state is
        when A =>
            y<='0';
            rst_cnt<='1';
            if (x='1') then             
                nx_state<= B;
            else 
                nx_state<= A;
            end if;
        when B =>
            y<='0';
          rst_cnt<='0';
            if (x='0' and t=(T1-1)) then
                nx_state<= C;
            end if;
            if ((x='0' and t<(T1-1)) or (x/='0' and t<(T2-1))) then
                nx_state<= B;                   
            end if;
            if (t=(T2-1)) then
                nx_state<= A;
            end if;
        when C =>
            y<='1';
          rst_cnt<='0';
            if (t=(T2-1)) then
                nx_state<= A;
            else
                nx_state<= C;
            end if;
    end case;
end process;
end Behavioral;

заранее спасибо


person maria    schedule 11.01.2014    source источник


Ответы (1)


Я думаю, что вы не можете избежать хотя бы одной задержки часов. Причина в том, что вы должны помнить свое текущее состояние. Для сохранения состояния вы должны использовать регистр, что вызовет задержку. В противном случае вы можете избежать этого, используя асинхронный конечный автомат, но тогда вам придется быть осторожным с вводом данных.

Обычный конечный автомат Мура имеет:

           \/-------------|

вход --> логика перехода --> память состояния --> выходная логика --> выход

                    ^-clk ^-rst ^-enable

Эта структура может быть хорошо выражена тремя процессами. Чтобы попытаться уменьшить задержку, вы можете подключить логику вывода напрямую к логике перехода, но после этого вам все равно может понадобиться регистр.

Подробнее см. эту страницу, которую я искал в Google, она довольно подробная.

person hr0m    schedule 12.02.2014