1

在图中你可以看到,当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
4

1 回答 1

0

我很抱歉格式不好,我还是很新,我想我知道 ctrl+k 是如何工作的,我会尝试在没有链接的情况下添加图片(感谢 sharth)。因此,这段代码就像我们使用 RTL 模拟时所说的那样工作,如下所示:

在此处输入图像描述

如您所见,“selecao”应该保留“01”,而且确实如此!我完全不知道为什么会发生这种情况,我想这是 FSM 本身的问题,否则,它会在哪里?

步骤是:在这种情况下,operacao 必须是“01”,所以 selecao 将是相同的开始: enter='1' -> enter='0' -> enter='1' -> enter='0' - > 输入="1"

感谢您对我的其他问题(帖子)的支持!

于 2013-11-17T14:15:47.067 回答