我在此过程中遇到问题,如果我包含一个reset语句,则会得到一个推断的闩锁。但是,如果不包含reset语句,则不会在duty_cycle_triangle上得到推断的闩锁。
SIGNAL duty_cycle_triangle : INTEGER := 0;
SIGNAL count_up : STD_LOGIC;
SIGNAL tick_zero : STD_LOGIC;
triangle_count: PROCESS(clk, reset signal, tick_zero)
BEGIN
IF (reset = '1') THEN
duty_cycle_triangle <= 0;
ELSIF (RISING_EDGE(clk)) THEN
IF (tick_zero = '1') THEN
IF (count_up = '1') THEN
duty_cycle_triangle <= duty_cycle_triangle + 2;
ELSE
duty_cycle_triangle <= duty_cycle_triangle - 2;
END IF;
END IF;
END IF;
END PROCESS;
我正在尝试设计一个如下所示的FSM,该FSM将使用PWM和FSM输出三角波:
FSM_comb: PROCESS(currentState, duty_cycle_triangle)
BEGIN
CASE currentState IS
WHEN triangle_up =>
PWM_enable <= '1';
count_up <= '1';
IF (duty_cycle_triangle > 99) THEN
nextState <= triangle_down;
ELSE
nextState <= triangle_up;
END IF;
WHEN triangle_down =>
PWM_enable <= '1';
count_up <= '0';
IF (duty_cycle_triangle < 1) THEN
nextState <= triangle_up;
ELSE
nextState <= triangle_down;
END IF;
END CASE;
END PROCESS;
FSM_seq: PROCESS(clk, reset)
BEGIN
IF (reset = '1') THEN
currentState <= triangle_up;
ELSIF (RISING_EDGE(clk)) THEN
currentState <= nextState;
END IF;
END PROCESS FSM_seq;
[基本上,在每个“滴答”之后,我希望三角波的占空比增加2。在占空比达到100之后,我希望占空比减小2,直到占空比达到0。达到0,我希望占空比从0开始再次增加,直到达到100,然后重新开始。
有人看到我的代码有任何问题吗?有人可以指出正确的方向纠正我的问题吗?
如果要创建顺序过程,请在敏感度列表中仅包含一个重置和一个时钟。我怀疑这是在推断闩锁,因为在此过程中您包含了太多信号:
triangle_count: PROCESS(clk, reset signal, tick_zero)
应该是
triangle_count: PROCESS(reset, clk)
这些工具不会将其视为一个顺序过程,而是将其组合起来,这就是您获取闩锁的方式。
没有尝试,我想知道是否在删除reset语句时,该工具会将进程识别为同步进程并推断出寄存器。在这种情况下,由于该值存储在寄存器中,因此无需为该过程的每个结果显式定义duty_cycle_triangle。
[包含reset语句时,可能会将其视为组合过程,因此,当未明确定义占空比时,会推断出闩锁来存储duty_cycle_triangle的状态。
无论哪种方式,我都同意罗素提出的更改过程敏感度列表的建议,该建议应消除闩锁。