Vhdl 状态由两个进程控制的有限状态机

Vhdl 状态由两个进程控制的有限状态机,vhdl,state-machine,fsm,Vhdl,State Machine,Fsm,我现在正试图用VHDL语言编写一个有限状态机FSM,实际上我是VHDL新手。我试图实现的是,每当机器处于S11时,时间间隔将随着CLK2分别减少,因此我可以控制减少的速度。然而,S0到S10由CLK1控制 这是我的密码: 我尝试过许多替代方案,例如使用CLK1作为停止时间递减的时钟,但效果不好,因为其他整数会一次又一次递减。 为了进一步了解,该FSM实际上类似于自动售货机,除了在S11中,计时器将开始倒计时,然后进入下一个状态,即S0。其他状态仅用于输入(如货币)和输出(如变化)。在S11中,

我现在正试图用VHDL语言编写一个有限状态机FSM,实际上我是VHDL新手。我试图实现的是,每当机器处于S11时,时间间隔将随着CLK2分别减少,因此我可以控制减少的速度。然而,S0到S10由CLK1控制

这是我的密码:

我尝试过许多替代方案,例如使用CLK1作为停止时间递减的时钟,但效果不好,因为其他整数会一次又一次递减。 为了进一步了解,该FSM实际上类似于自动售货机,除了在S11中,计时器将开始倒计时,然后进入下一个状态,即S0。其他状态仅用于输入(如货币)和输出(如变化)。在S11中,只要计时器仍在倒计时,ST LED将点亮。 我有什么办法可以做到这一点吗?如果有人能指出为什么我的代码不起作用,我会非常高兴。似乎每当机器处于S11时,它都无法更改其状态。这是TINA中我的代码的样子:

多谢各位。祝您有个美好的一天!
备注:计时器显示在STcount输出中

您的方法中有一些问题:

FSM的多个时钟。您应该避免在设计中使用多个时钟,并且仅在必要时使用。为给定电路设置两个时钟是有问题的。 使用单个时钟。如果您想使用时钟保持控制,请构建一个单独的电路来控制时钟的生成。计数器可以解决简单设计的问题。更复杂的设计可能需要使用特定的硬件来产生时钟.g PLL。 您正在为不同进程中的信号分配至少DO。这不应该是综合性的。
我建议您重新考虑您的状态机控制,并了解速度下降的限制

首先,为帮助我们,为您提供帮助。关于VHDL的两个提示:时钟进程在sensivity列表中应该只有CLK和潜在的异步RST,并且在进程中只写一个CLK边缘检测。然后,要使用两个不同的时钟,请通读有关时钟域交叉的内容。1/您的代码中充满了时钟。删除所有XX'事件和XX='1',除非XX是主时钟。2/每个输入信号都需要一个同步器电路。之后,你可以检查它是高还是低。3/如果这是一个真实电路,则添加开关反弹跳。4/将1K时钟替换为1K“有效”,将2K中的1K“有效”替换为除以2。您不能驱动来自多个进程的信号。不要使用多个时钟:使用计时器/延迟计数器。
begin
 process(state,DI,HI,QI,rst)      
 begin
    case State is
      when S0 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0'; STint <= 9;
        if DI'EVENT and DI = '1' then Nextstate <= S4;
          elsif HI'EVENT and HI = '1' then Nextstate <= S2;
          elsif QI'EVENT and QI = '1' then Nextstate <= S1;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S0; end if;
      when S1 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
        if DI'EVENT and  DI = '1' then Nextstate <= S5;
          elsif HI'EVENT and HI = '1' then Nextstate <= S3;
          elsif QI'EVENT and QI = '1' then Nextstate <= S2;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S1; end if;
      when S2 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
        if DI'EVENT and DI = '1' then Nextstate <= S6;
          elsif HI'EVENT and HI = '1' then Nextstate <= S4;
          elsif QI'EVENT and QI = '1' then Nextstate <= S3;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S2; end if;  
      when S3 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
        if DI'EVENT and DI = '1' then Nextstate <= S7;
          elsif HI'EVENT and HI = '1' then Nextstate <= S5;
          elsif QI'EVENT and QI = '1' then Nextstate <= S4;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S3; end if;       
      when S4 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
        if DI'EVENT and DI = '1' then Nextstate <= S8;
          elsif HI'EVENT and HI = '1' then Nextstate <= S6;
          elsif QI'EVENT and QI = '1' then Nextstate <= S5;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S4; end if;  
      when S5 =>
          DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
        if DI'EVENT and DI = '1' then Nextstate <= S9;
          elsif HI'EVENT and HI = '1' then Nextstate <= S7;
          elsif QI'EVENT and QI = '1' then Nextstate <= S6;
          elsif rst'EVENT and rst = '1' then Nextstate <= S10;
        else Nextstate <= S5; end if;  
      when S6 =>
        DO <= '0'; HO <= '0'; QO <= '0'; ST <= '0';
          Nextstate <= S11;      
      when S7 =>
        DO <= '0'; HO <= '0'; QO <= '1'; ST <= '0';
          QOint <= -1;
          Nextstate <= S11;
      when S8 =>
        DO <= '0'; HO <= '1'; QO <= '0'; ST <= '0';
          HOint <= HOint -1;
          Nextstate <= S11;
      when S9 =>
        DO <= '0'; HO <= '1'; QO <= '1'; ST <= '0';
          HOint <= HOint -1;
          QOint <= QOint -1;
          Nextstate <= S11;
      when S10 =>                 
        DOint <= 9; HOint <= 9; QOint <= 9; STint <= 9;
          Nextstate <= S0;
      when others => null;          
    end case;
  end process;

  process(CLK1)   
  begin
   if CLK1'EVENT and CLK1 = '1' then
      State <= Nextstate;
   end if;
  end process;

  process(state,CLK2)
  begin
   case State is 
       when S11 =>
        DO <= '0'; HO <= '0'; QO <= '0'; ST <= '1';
    if CLK2'EVENT and CLK2 = '1' then STint <= STint -1;
    elsif STint <= 0 then Nextstate <= S0; end if;
       when others => null;
    end case;
  end process;