Как сделать конечный автомат VHDL Mealy? - PullRequest
0 голосов
/ 06 апреля 2020

"Я программирую конечный автомат VHDL (modelsim) (машина Мили). Я нашел этот код в inte rnet, но если я его запускаю, он выдает следующую ошибку, помогите мне заранее спасибо:"

** Error: D:/modelsim_ase/esercizi/prova.vhd(32): near "<=": (vcom-1576) expecting => or '|' or '!'.
** Error: D:/modelsim_ase/esercizi/prova.vhd(46): near "<=": (vcom-1576) expecting => or '|' or '!'.
** Error: D:/modelsim_ase/esercizi/FSM.vhd(85): VHDL Compiler exiting

строка:

    when others => next_state <= (others <= 'x');

"код выглядит следующим образом:"

VHDL

-- Example of a 5-state Mealy FSM
library ieee;
use ieee.std_logic_1164.all;
entity mealy is
 port (clock, reset: in std_logic;
       data_out: out std_logic;
       data_in: in std_logic_vector (1 downto 0));
end mealy;
architecture behave of mealy is
 type state_values is (st0, st1, st2, st3, st4);
 signal pres_state, next_state: state_values;
begin
-- FSM register
statereg: process (clock, reset)
begin
 if (reset = '0') then
  pres_state <= st0;
  elsif (clock'event and clock ='1') then
    pres_state <= next_state;
  end if;
end process statereg;
-- FSM combinational block
fsm: process (pres_state, data_in)
begin
 case pres_state is
 when st0 =>
  case data_in is
   when "00" => next_state <= st0;
   when "01" => next_state <= st4;
   when "10" => next_state <= st1;
   when "11" => next_state <= st2;
   when others => next_state <= (others <= 'x');
  end case;
  when st1 =>
   case data_in is
    when "00" => next_state <= st0;
    when "10" => next_state <= st2;
    when others => next_state <= st1;
   end case;
  when st2 =>
   case data_in is
    when "00" => next_state <= st1;
    when "01" => next_state <= st1;
    when "10" => next_state <= st3;
    when "11" => next_state <= st3;
    when others => next_state <= (others <= 'x');
   end case;
  when st3 =>
   case data_in is
    when "01" => next_state <= st4;
    when "11" => next_state <= st4;
    when others => next_state <= st3;
   end case;
  when st4 =>
   case data_in is
    when "11" => next_state <= st4;
    when others => next_state <= st0;
   end case;
  when others => next_state <= st0;
 end case;
end process fsm;
-- Mealy output definition using pres_state w/ data_in
outputs: process (pres_state, data_in)
begin
 case pres_state is
  when st0 =>
   case data_in is
    when "00" => data_out <= '0';
    when others => data_out <= '1';
   end case;
  when st1 => data_out <= '0';
  when st2 =>
   case data_in is
    when "00" => data_out <= '0';
    when "01" => data_out <= '0';
    when others => data_out <= '1';
   end case;
  when st3 => data_out <= '1';
  when st4 =>
   case data_in is
    when "10" => data_out <= '1';
    when "11" => data_out <= '1';
    when others => data_out <= '0';
   end case;
  when others => data_out <= '0';
 end case;
end process outputs;
end behave;

1 Ответ

0 голосов
/ 06 апреля 2020

Следующее из вашего кода является ошибкой
Вы переместили символ "=>" в агрегат, который содержит только другие:

when others => next_state <= (others <= 'x');

The следующее также является ошибкой, так как это неправильный тип для вашего примера
Если здесь уместно использовать совокупное присвоение (это не так), стрелка должна указывать в противоположном направлении (=>), как показано ниже. Также обратите внимание, что элементы в одинарных кавычках чувствительны к регистру и что все буквы std_ulogic / std_logi c имеют верхний регистр и, следовательно, это должен быть 'X' (также показан).

when others => next_state <= (others => 'X');

Вы должны сделайте это, чтобы исправить ваш код
Так как next_state имеет тип, state_values, вместо него должно быть:

when others => next_state <= st0;

Кроме того, часть вашего другого кода выглядит смешно, или вы используете некоторые языки альтернативные символы («00»). Вместо этого я бы рекомендовал использовать «00», если ваша клавиатура имеет символ «:

case data_in is
  when "00" => next_state <= st1;
»
...