在图中你可以看到,当key(1)=0和时钟上升沿时,SELECAO变为01。但经过一个时钟周期后,它变为00(它应该保持在01)
FSM 模拟单独运行时可以正常工作,但每当我在整个系统上尝试时它都会失败。
你能在下面的 vhdl 代码中找到问题吗?
library ieee;
use ieee.std_logic_1164.all;
entity FSMctrl is port (
Clk, Rst, Enter : in std_logic;
operacao: in std_logic_vector(1 downto 0);
selecao: out std_logic_vector(1 downto 0);
Enable_1, Enable_2: out std_logic
);
end FSMctrl;
architecture FSM_beh of FSMctrl is
type states is (S0, S1, S2, S3, S4, S5, S6, S7);
signal EA, PE: states;
signal clock: std_logic;
signal reset: std_logic;
begin
clock <= Clk;
reset <= Rst;
P1: process (clock, reset)
begin
if reset = '0' then
EA <= S0;
elsif clock'event and clock = '1' then
EA <= PE;
end if;
end process;
--adicionar operacao na sensitivity list em 31/10 pois a compilacao deu um
--alerta
P2: process (EA, Enter)
begin
case EA is
when S0 =>
if Enter = '1' then--teste
--enable_1 <= '1';
PE <= S0;
else
PE <= S1;
end if;
Enable_1 <= '0';
Enable_2 <= '0';
when S1 =>
if Enter = '0' then
PE <= S1; --ele deve esperar soltar o botao
else
PE <= S2;
end if;
Enable_1 <= '1';
Enable_2 <= '0';
when S2 => -- Operador
Enable_1 <= '0';
Enable_2 <= '0';
-- PE <= S3 when operacao = "00" else
-- S4 when operacao = "01" else
-- S5 when operacao = "10" else
-- S6;
if operacao = "00" then
PE <= S3; -- Fazer soma
elsif operacao = "01" then
PE <= S4; -- Fazer subtracao
elsif operacao = "10" then
PE <= S5; --fazer divisao
elsif operacao = "11" then
PE <= S6;--fazer produto
end if;
--01/11: movendo atribuicoes de selecao para dentro da condicao enter=0 em S3, S4, enter=1 nos S5 e S6
when S3 =>
if Enter = '1' then
PE <= S3;
else
PE <= S7;
Selecao <= "00";
end if;
when S4 =>
if Enter = '1' then
PE <= S4;
else
PE <= S7;
Selecao <= "01";
end if;
when S5 =>
if Enter = '0' then --verificar aqui
PE <= S5; --do S5 pro S6??? deveria ser pro S7?
else
PE <= S0;
Selecao <= "10";
end if;
Enable_1 <= '0'; --adicionado (SANDBOX)
Enable_2 <= '1'; --adicionado (SANDBOX)
when S6 =>
if Enter = '0' then --adicionado um looping para esperar o Enter ser solto
PE <= S6;
else
PE <= S0;
Selecao <= "11";
end if;
Enable_1 <= '0';
Enable_2 <= '1';
when S7 =>
Enable_1 <= '0';
Enable_2 <= '1';
if Enter = '0' then --adicionado um looping para esperar o Enter ser solto
PE <= S7;
else
PE <= S0;
end if;
end case;
end process;
end FSM_beh; -- fim da architecture