Events 依赖于输入事件VHDL的状态转换
我是VHDL的新手。我目前正在FSM上工作,我希望我的状态机仅在输入更改时才更改状态。我应该在下面的代码中做什么更改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
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
依赖项。这是个错误。