[英]VHDL - Inferred Latch With Reset - FSM
我对这个过程有一个问题,如果我包含一个重置语句,我会得到一个推断的锁存器。 但是,如果我不包含 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,它将 output 使用 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)
这些工具不会将其视为一个顺序过程并将其组合起来,这就是您获得闩锁的方式。
在没有尝试的情况下,我想知道当重置语句被删除时,该工具是否将进程识别为同步进程并推断寄存器。 在这种情况下,您不需要为流程的每个结果显式定义 duty_cycle_triangle,因为值存储在寄存器中。
包含 reset 语句后,它可能会将过程视为组合过程,因此在未明确定义时推断锁存器以存储 duty_cycle_triangle 的 state。
无论哪种方式,我都同意 Russell 的建议,即更改应该摆脱闩锁的过程敏感度列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.