VHDL-复位复位的锁存器-FSM

问题描述 投票:0回答:2

我在此过程中遇到问题,如果我包含一个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,然后重新开始。

有人看到我的代码有任何问题吗?有人可以指出正确的方向纠正我的问题吗?

vhdl fpga fsm
2个回答
1
投票

如果要创建顺序过程,请在敏感度列表中仅包含一个重置和一个时钟。我怀疑这是在推断闩锁,因为在此过程中您包含了太多信号:

triangle_count: PROCESS(clk, reset signal, tick_zero)

应该是

triangle_count: PROCESS(reset, clk)

这些工具不会将其视为一个顺序过程,而是将其组合起来,这就是您获取闩锁的方式。


0
投票

没有尝试,我想知道是否在删除reset语句时,该工具会将进程识别为同步进程并推断出寄存器。在这种情况下,由于该值存储在寄存器中,因此无需为该过程的每个结果显式定义duty_cycle_triangle。

[包含reset语句时,可能会将其视为组合过程,因此,当未明确定义占空比时,会推断出闩锁来存储duty_cycle_triangle的状态。

无论哪种方式,我都同意罗素提出的更改过程敏感度列表的建议,该建议应消除闩锁。

© www.soinside.com 2019 - 2024. All rights reserved.