同步状态机VHDL

时间:2013-12-12 19:26:25

标签: vhdl synchronous xilinx

我正在尝试设计一个具有一个输入X和一个输出Z的同步状态机 仅当x没有时,z才为1。 1的mod 3 = 0 甚至没有。 0的 无论如何我准备了我的状态图

我试图在xillinix上测试代码并打印信号以跟踪它 但它没有按照代码中的说法正确地从一个状态跳到另一个状态 任何帮助赞赏 这是链接感谢

的输出

http://pastebin.com/14e5ZkX4

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity machine is
    Port ( X : in  STD_LOGIC;
            clk : in  STD_LOGIC;
           Z : out  STD_LOGIC);
end machine;

architecture Behavioral of machine is
signal state,nextstate  : integer range 0 to 5 := 0;
signal flag : integer range 0 to 5 := 0;

begin
--state 0 (even and mod3=0)
--state 1 (odd  and mod3=0)
--state 2 (even and mod3=1)
--state 3 (odd  and mod3=1)
--state 4 (even and mod3=2)
--state 5 (odd  and mod3=2)
sequence:process(CLK)
 begin

 if rising_edge(CLK) then

 report "prevstate"& integer'image(state);
 report "x" & STD_LOGIC'image(X);

 if X='0' then
 case state is
   when 0=>
     nextstate<= 1;

   when 1=>
      nextstate<= 0;

  when 2=>
     nextstate<= 3;

 when 3=>
  nextstate<= 2;

 when 4=>
  nextstate<= 5;

 when 5=>
  nextstate<= 4;

 end case;

 --if x=1
 else

 case state is
when 0=>
      flag<= 1;
  nextstate<= 2;

 when 1=>
  nextstate<= 3;

 when 2=>
  nextstate<= 4;

 when 3=>
  nextstate<= 5;

 when 4=>
  nextstate<= 0;

 when 5=>
  nextstate<= 1;

 end case;
 end if;
-- report "flag"&  integer'image(flag);

 report "next state"&  integer'image(nextstate);
 state<=nextstate;


if state=1 then
z<='1';
else
z<='0';
end if;
end if;
end process;

end Behavioral;

2 个答案:

答案 0 :(得分:0)

看起来像是一种奇怪的方式来实现你想要的......非常复杂并将两个独立的任务合二为一,这使得很难检查(通过眼睛)一切都是应该的。当你描述问题时,我赞成描述解决方案。

分别跟踪两位信息。下面的一些示例代码,如果不完整,您必须将其合并到一个时钟进程中,并确保完成重置。

有一个'even'标志,每次X为'0'时,都会切换它。确保将其重置为零。

if x = '1' then 
   even := not even;
end if;

还有一个计数器,每次X为'1'时,递增计数器。如果它变为3,则将其重置为零。并确保它在重置后从零开始!

if x = '1' then
    counter := counter + 1;
    if counter = 3 then
       counter := 0;
    end if;
end if;

然后取两者并合并它们以产生输出:

z <= '0';
if counter = 0 and even = '1' then
  z <= '1';
end if;

答案 1 :(得分:-1)

嗯,我是VHDL的新手,但我认为有一个大问题。 您尝试使用标准顺序 - '编程'模式来描述硬件! 在描述硬件时,您必须记住,硬件是并发的。

您的FSM不会有预期的行为,因为您没有记住这一点。 例如,下一个状态计算是在一个定时进程中完成的,这没关系, 但是那时应该有状态信号的并发信号分配(在过程之外)。 nextstate信号的新值将不会在同一个过程循环中可用。 它们将在过程完成后分配。 (警告:仅适用于信号, 变量有一些不同的行为!)

我认为一本好的VHDL书会教你基础知识......