【问题标题】:VHDL - Inferred Latch With Reset - FSMVHDL - 带复位的推断锁存器 - FSM
【发布时间】:2019-11-15 00:20:55
【问题描述】:

我在这个过程中有一个问题,如果我包含一个重置语句,我会得到一个推断的锁存器。但是,如果我不包含 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,它将使用 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


    【解决方案1】:

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

    triangle_count: PROCESS(clk, reset signal, tick_zero)

    应该是

    triangle_count: PROCESS(reset, clk)

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

    【讨论】:

    • 合成对敏感性列表的关注历史上来自于要求合成后的模拟行为与输入行为匹配,现在改为通过形式化方法进行验证。无论有没有锁存器,仿真和合成模型的行为都会匹配。将行为映射到应依赖于固有优先级的合成原语不依赖于敏感度列表。存在锁存器是一种特殊的综合工具映射缺陷,而不是过程语句的问题。
    【解决方案2】:

    没有尝试,我想知道当重置语句被删除时,该工具是否将进程识别为同步进程并推断寄存器。在这种情况下,您不需要为流程的每个结果显式定义 duty_cycle_triangle,因为值存储在寄存器中。

    如果包含 reset 语句,它可能会将过程视为组合过程,因此在未明确定义时推断锁存器来存储 duty_cycle_triangle 的状态。

    无论哪种方式,我都同意 Russell 的建议,即更改应该摆脱闩锁的进程敏感度列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 2014-01-16
      • 2013-06-03
      • 1970-01-01
      • 2013-11-30
      • 2018-11-01
      相关资源
      最近更新 更多