【问题标题】:VHDL FSM not working?VHDL FSM 不工作?
【发布时间】:2013-11-30 03:30:13
【问题描述】:

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

【问题讨论】:

  • 如果您希望人们阅读它,请更好地格式化它。这也是为什么单进程风格的状态机更有可能工作的一个很好的例子。 :见stackoverflow.com/questions/19463359/…
  • operacao 从 P2 的灵敏度列表中丢失,这与 10 月 31 日的评论相反。如果没有看到更多您的设计,波形中的名称与您的 FSMctrl 无关。我也忍不住想知道回车键是否不需要去弹跳。还有@Brian,我完全不明白为什么这是单个进程状态机更有可能工作的一个例子。 states、Estado Atual 和 Proximo Estado 都定义在两个进程共有的架构声明区域中。展示的设计部分是一个简单的摩尔机器。
  • @David:敏感度列表问题(错误?故意的?我的葡萄牙语不行)正是我更喜欢单一进程的原因。感谢扩展 EA、PE!虽然你说的去抖动是对的,但我不确定这是否有助于模拟......
  • 下面添加了更多详细信息
  • 顺便说一句,不要对时钟进行赋值:“clock

标签: simulation vhdl state-machine intel-fpga


【解决方案1】:

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

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

步骤如下: 在这种情况下,operacao 必须是“01”,所以 selecao 是一样的 开始: enter='1' -> enter='0' -> enter='1' -> enter='0' -> enter="1"

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

【讨论】:

  • puu.sh/5l3l3.png 这里可以看到当 enter(key1) 变为 '0' 时,selecao 立即变为 "01"。但是,只要状态从 S4 变为 S7,selecao 就会变回“00”。 (这是与系统其余部分的 FSM)。我真的不明白为什么,因为 S7 没有为 selecao 分配任何值...
猜你喜欢
  • 2014-01-16
  • 2014-10-03
  • 2018-11-01
  • 1970-01-01
  • 2011-08-25
  • 2019-04-23
  • 2015-07-29
  • 1970-01-01
  • 2020-11-27
相关资源
最近更新 更多