繁体   English   中英

VHDL - 带复位的推断锁存器 - FSM

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM