【发布时间】: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