Events 依赖于输入事件VHDL的状态转换

Events 依赖于输入事件VHDL的状态转换,events,vhdl,clock,fsm,Events,Vhdl,Clock,Fsm,我是VHDL的新手。我目前正在FSM上工作,我希望我的状态机仅在输入更改时才更改状态。我应该在下面的代码中做什么更改 entity fsm is Port ( clk : in STD_LOGIC; reset : in STD_LOGIC; x_in : in STD_LOGIC; -- input Bitstream y_out : out STD_LOGIC_VEC

我是VHDL的新手。我目前正在FSM上工作,我希望我的状态机仅在输入更改时才更改状态。我应该在下面的代码中做什么更改

entity fsm is
    Port ( clk : in STD_LOGIC;
           reset : in STD_LOGIC;
           x_in : in STD_LOGIC;                         -- input Bitstream  
           y_out : out STD_LOGIC_VECTOR (1 downto 0));  -- Encoded output
end fsm;

-----------------------------------------------------
architecture Behavioral of fsm is

  -- Building an Enumerated type for the state machine
  type state_type is (s_idle,s1,s2,s3,s4);  -- constraint length = 3, Hence number of Regs = 2 therefore Number of states = 4
  signal state, next_state: state_type ;    -- Registers to hold the Present and next states

begin
-----------------------------------------------------
  process1: process (reset, clk)             --  Sequential Logic Selection process:
     begin

          if (reset ='1') then  
              state <=s_idle;         
          elsif (clk='1' and x_in'Event) then     
              state <= next_state;  
          end if;  
-----------------------------------------------------         
  end process process1;
实体fsm是
端口(时钟:在标准逻辑中;
复位:在标准逻辑中;
x_in:in标准逻辑;--输入位流
y_out:out标准逻辑向量(1到0));--编码输出
结束fsm;
-----------------------------------------------------
fsm的体系结构是
--为状态机生成枚举类型
类型状态_类型为(s_空闲、s1、s2、s3、s4);--约束长度=3,因此正则数=2,因此状态数=4
信号状态,下一个状态:状态类型;——注册以保存当前和未来状态
开始
-----------------------------------------------------
过程1:过程(复位,clk)——顺序逻辑选择过程:
开始
如果(reset='1'),则

状态假设您希望在-->

  • clk
    过高
  • 中的
    X_值发生变化
    另外,我将假设您的
    next_state
    变量是
    state
    的一些组合函数,您没有提到。只需一个更改即可,将
    X_in
    添加到您的过程敏感性列表中

    -----------------------------------------------------
      process1: process (X_in, reset, clk)             --  Sequential Logic Selection process:
         begin
    
              if (reset ='1') then  
                  state <=s_idle;         
              elsif (clk='1' and x_in'Event) then     
                  state <= next_state;  
              end if;  
    -----------------------------------------------------         
      end process process1;
    
    -----------------------------------------------------
    过程1:过程(X_输入、复位、时钟)——顺序逻辑选择过程:
    开始
    如果(reset='1'),则
    
    状态假设
    输入中的
    x_与
    clk
    同步,这将执行您描述的操作:

     process1: process (reset, clk)
     begin
    
          if (reset ='1') then  
              state <=s_idle;         
          elsif (clk='1' and clk'Event) then
              x_in_prev <= x_in;
              if x_in_prev /= x_in then
                  state <= next_state;
              end if;
          end if;
     end process process1;
    
    process1:进程(重置,时钟)
    开始
    如果(reset='1'),则
    
    我编辑了你的问题,但从中间部分看不太有意义。您可能需要重新格式化它。这不会合成;它既不将clk也不将x_in视为正确的时钟信号。这是rising_edge()函数可以防止的错误。他似乎并不想要一个
    rising_edge
    依赖项。这是个错误。