同步状态机VHDL

同步状态机VHDL,vhdl,synchronous,xilinx,Vhdl,Synchronous,Xilinx,我正在尝试设计一个同步状态机,它有一个输入X和一个输出Z 仅当x的模数为3=0时,z才为1 甚至是0的数量 无论如何,我准备好了我的状态图 我试图在xillinix上测试代码,并打印信号以跟踪它 但它并不像代码中写的那样从一个州跳到另一个州 谢谢你的帮助 这是链接中的输出,谢谢 嗯,我不熟悉VHDL,但我认为有一个大问题。 您尝试使用标准的顺序“编程”模式来描述硬件! 在描述硬件时,您必须记住,硬件是并发的 您的FSM不会有预期的行为,因为您没有记住这一点。 例如,nextstate计算是在时钟

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

我试图在xillinix上测试代码,并打印信号以跟踪它 但它并不像代码中写的那样从一个州跳到另一个州 谢谢你的帮助 这是链接中的输出,谢谢


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

您的FSM不会有预期的行为,因为您没有记住这一点。 例如,nextstate计算是在时钟进程中完成的,这是可以的, 但是,在状态信号的处理之外,应该有一个并发的信号分配。 nextstate信号的新值在同一进程周期中不可用。 他们将在流程完成后分配。警告:这仅适用于信号, 变量有一些不同的行为


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

似乎是实现你想要的东西的一种奇怪的方式。。。非常复杂,将两个单独的任务合并为一个任务,因此很难用肉眼检查是否一切正常。我赞成像你描述问题那样描述解决方案

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

有一个“偶数”标志,每次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;

谢谢你的帮助。我试试看
z <= '0';
if counter = 0 and even = '1' then
  z <= '1';
end if;