vhdl中的FSM使用计数器作为输出

时间:2014-03-09 20:33:04

标签: logic vhdl fsm digital-logic

我目前正在编写我的第一个FSM,并且不确定我的逻辑是否正确。我的任务是为以下逻辑创建状态图:

A = 00
B = 01
C = 10
D = 11

在以下情况下输出为:

BDA
BAA
BAD

所以我创建了以下vhdl代码来完成此任务:

因此,每次输出1时,我都会将其发送回B并计数+ 1.这应该在LED上显示为18位序列中的次数。

我是否以正确的方式处理此问题?我对如何通过18位序列移动它感到困惑。我应该把我板上的swtiches作为我的18位表示为SW。我会将data_in替换为SW(17 downto 0)吗?

1 个答案:

答案 0 :(得分:0)

这是一个评论而不是我回答的答案,因为我还没有资格发表评论。

我认为您在FSM概念方面存在一些问题。同样在评论中说data_in是std_logic而不是向量。 您正在一次串行输入一个输入,因此请编写进程。您可以编写代码来检测序列为“011100”,“010000”和“010011”的序列BDA,BAA,BAD。我会编写一个简单的FSM代码,以便您可以尝试清除概念。

library ieee;
use IEEE.std_logic_1164.all;

entity mealy is
port (clk : in std_logic;
      reset : in std_logic;
      input : in std_logic;
      output : out std_logic
  );
end mealy;

architecture behavioral of mealy is

type state_type is (s0,s1,s2,s3);  --type of state machine.
signal current_s,next_s: state_type;  --current and next state declaration.

begin

process (clk,reset)
begin
 if (reset='1') then
  current_s <= s0;  --default state on reset.
elsif (rising_edge(clk)) then
  current_s <= next_s;   --state change.
end if;
end process;

--state machine process.
process (current_s,input)
begin
  case current_s is
     when s0 =>        --when current state is "s0"
     if(input ='0') then
      output <= '0';
      next_s <= s1;
    else
      output <= '1';
      next_s <= s2;
     end if;   

     when s1 =>;        --when current state is "s1"
    if(input ='0') then
      output <= '0';
      next_s <= s3;
    else
      output <= '0';
      next_s <= s1;
    end if;

    when s2 =>       --when current state is "s2"
    if(input ='0') then
      output <= '1';
      next_s <= s2;
    else
      output <= '0';
      next_s <= s3;
    end if;


  when s3 =>         --when current state is "s3"
    if(input ='0') then
      output <= '1';
      next_s <= s3;
    else
      output <= '1';
      next_s <= s0;
    end if;
  end case;
end process;

end behavioral;