【发布时间】:2016-07-07 10:57:16
【问题描述】:
我是新来的,这是我的问题:
我有一个状态机,它有 3 个状态(s0,s1.s2)和输入:(reset、clk、start)和输出(完成)。我的状态机是这样工作的:重置时它到达 s0,然后如果 start = '1' 进入 s2,在这种状态下,我希望它在那里停留 12 个时钟周期(12 个时钟周期延迟),然后进入 s2并在此处完成 ='1',然后返回 s0。 我的代码是这样的:
我的代码看起来不错,但我的模拟结果不行。
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY fsm_count IS
port(clk : in std_logic;
reset : in std_logic;
start : in std_logic ;
don : out std_logic );
END ENTITY fsm_count;
--
ARCHITECTURE arc OF fsm_count IS
type statetype is (s0,s1,s2);
signal pr_state,nx_state : statetype;
signal s_counter : std_logic_vector (3 downto 0):=(others=>'0'); -- zero
begin
fsmcount: process(clk,reset,pr_state,start)
begin
if reset = '1'then pr_state <= s0;
elsif (clk'event and clk='1') then
case pr_state is
when s0 =>
if start ='1' then nx_state <=s1;
else nx_state <= s0;
end if;
when s1 =>
s_counter <= s_counter + '1';
if (s_counter = "1100") then
nx_state <= s2;
s_counter <=(others =>'0'); -- initializing the counter back to zero
else nx_state <=s1;
end if;
when s2 =>
nx_state<= s0;
end case;
end if;
end process fsmcount;
don <= '1' when (pr_state = s2) else '0';
END ARCHITECTURE arc;
【问题讨论】:
-
您需要包含一个最小版本的代码,向我们展示您的设计是如何工作的
-
是的,我只是在编辑我的问题。
-
您的计数器不在同步进程中;它可能不会做你想做的事。你试过单进程状态机吗?它们通常更容易设计。
-
我现在使用一个进程:
-
我编辑了我的代码并为它使用了一个进程,但计数值仍然卡在零并且似乎没有计数。