我目前正在编写我的第一个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)
吗?
答案 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;