начать с конкретной статистики в FSM - PullRequest
0 голосов
/ 31 декабря 2018

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

library ieee;
use ieee.std_logic_1164.all;
use work.all;

entity ELEVAR is
port(
clk, rst: in std_logic;
NF,status : in std_logic_vector(2 downto 0);
output: out std_logic_vector(2 downto 0));
end ELEVAR;

architecture struct of ELEVAR is
type state is(S,S0,S1,S2,S3,S4,S5,S6,S7,S8,HI);
signal current_state, next_state:state; 
signal output22 : std_logic_vector(2 downto 0);

begin 
    process(clk, rst)
    begin
            if(rst='1')then
                current_state<=S0;

            elsif(rising_edge(clk))then


            else
                    null;
            end if;

    end process;




    process(current_state)

    begin

            case current_state is

                when S8=>next_state<=S7;
                            output<="111";

 output22<="111";
    if (NF=output22) then
    next_state<=HI;
    output<="111";
    end if;

                when S7=>next_state<=S6;
                            output<="110";

 output22<="110";
    if (NF=output22) then
    next_state<=HI;
    output<="110";
    end if;
                when S6=>next_state<=S5;
                            output<="101";

 output22<="101";
    if (NF=output22) then
    next_state<=HI;
    output<="101";

    end if;
                when S5=>next_state<=S4;
                            output<="100";

 output22<="100";
    if (NF=output22) then
    next_state<=HI;
                output<="100";
    end if;
                when S4=>next_state<=S3;
                            output<="011";

 output22<="011";
    if (NF=output22) then
    next_state<=HI;
    output<="011";
    end if;
                when S3=>next_state<=S2;
                            output<="010";

 output22<="010";
    if (NF=output22) then
    next_state<=HI;
        output<="010";
    end if;
                when S2=>next_state<=S1;
                            output<="001";

 output22<="001";
    if (NF=output22) then
    next_state<=HI;
            output<="001";
    end if;
                when S1=>next_state<=S0;
                            output<="000";

 output22<="000";
    if (NF=output22) then
    next_state<=HI;
        output<="000";
    end if;

                 when others => next_state<=HI;
                            null;


            end case;
    end process;

  end struct;

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

   current_state<=next_state;
                elsif status = "000" then 
                current_state<=S0;
                elsif 
                status = "001" then 
                current_state<=S1;
                elsif 
                status = "010" then 
                current_state<=S2;
                elsif 
                status = "011" then 
                current_state<=S3;
                elsif 
                status = "100" then 
                current_state<=S4;
                elsif 
                status = "101" then 
                current_state<=S5;
               elsif 
                status = "110" then 
                current_state<=S6;
                elsif 
                status = "111" then 
                current_state<=S7;

1 Ответ

0 голосов
/ 02 января 2019

Сигналы инициализируются по умолчанию с помощью крайнего левого значения диапазона подтипа этого сигнала, если не указано начальное значение.В вашем случае тип - State, а самое левое значение - S.Таким образом, ваше начальное состояние S.

. При объявлении сигнала вы можете назначить начальное значение:

signal current_state : State := S4;
signal next_state    : State;

Теперь начальное значение S4 и начальное состояниетакже S4.

Обратите внимание, что FSM может иметь разные состояния запуска и сброса.(Не говоря, что это всегда умно.) Это зависит от базовой технологии (FPGA, Xilinx, Altera, ASIC, ...), если состояние сброса может отличаться от исходного состояния.


Другоеподсказки:

  • Не перечислять идентификаторы, такие как S1, S2!
    Используйте правильные имена состояний.
  • Если вам нужно проверить status для нескольких различных значений,используйте оператор case, но не if / elsif дерево решений.
  • Список чувствительности вашего процесса неполон.
  • Не используйте асинхронный сброс.
...