【问题标题】:Strange spikes in the signal ModelSim VHDL信号 ModelSim VHDL 中的奇怪尖峰
【发布时间】:2014-07-14 13:02:01
【问题描述】:

我正在为学校做一个期末项目,这是我第一次在 Quartus 和 ModelSIM 中使用 VHDL。它应该是服务于三层楼的电梯的控制装置。我在一些信号中有这些奇怪的尖峰,我似乎无法找到它们的来源。

我遇到的一个问题是信号中的峰值,该信号馈送到显示当前楼层的向上/向下计数器。当它停在一个楼层时,它最终会再计算一次,然后将楼层过高或过低,而下一层显示似乎可以正常显示同一楼层,直到另一个楼层被调用。下一层显示来自 FSM,而当前楼层显示来自上/下计数器。

在这里发布所有内容有点复杂,所以我现在只发布波形,以防有人遇到这个信号尖峰问题,最终成为一个小错误/容易修复。!

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity FSM_Elevador is
    port (Up_Down, Igual, Reset, Clock: in std_logic;
            Andar_Dif: out std_logic
            );
end FSM_Elevador;

architecture FSM_beh of FSM_Elevador is
    type Elev_States is (Start, Wait_State, Pulse_State);
    signal Current_State, Next_State: Elev_States;
    signal RST, CLK, Sig_Andar_Dif, Cont_Mesmo_Andar: std_logic;

begin

RST <= Reset;
CLK <= Clock;

process(RST, CLK)
begin
    if RST = '0' then
         Current_State <= Start;
    elsif CLK'event and  CLK = '1' then
         Current_State <= Next_State;
    end if;
end process;

process(Current_State, Igual)
begin
    case Current_State is
        when Start =>
            Next_State <= Wait_State;
        when Wait_State =>
            if Igual = '1' then
                Next_State <= Wait_State;
                Sig_Andar_Dif <= '0';
            else
                Next_State <= Pulse_State;
                Sig_Andar_Dif <= '1';
            end if;
        when Pulse_State =>
            if Igual = '1' then
                Sig_Andar_Dif <= '0';
                Next_State <= Wait_State;
            else
                Sig_Andar_Dif <= '0';
                Next_State <= Pulse_State;
            end if;
    end case;
end process;
Andar_Dif <= Sig_Andar_Dif;
end FSM_beh;

fru1tbat:我使用 Elev_pulse 使计数器上升或下降一次,是的,它作为时钟进入计数器。这是教授建议的。

编辑:抱歉,之前的代码是错误的。 Andar_Dif 发出的信号最终到达具有 Elev_Pulse 的组件

【问题讨论】:

  • 发布您分配 Elev_Pulse 的代码。我敢打赌你给它分配了一个或门?
  • 您确定这些尖峰会导致您的额外计数吗?通常它们不会,除非您将它们用作时钟(看起来不像您打算这样做,因为您似乎有一个主时钟),或者做其他不明显的事情。

标签: vhdl modelsim


【解决方案1】:

摆脱将时钟和复位重新分配给 CLK 和 RST,直接使用来自端口的信号。这会产生增量周期延迟,这是导致此类尖峰的原因。看起来你在设计中有不同的延迟重置,这也可能使事情复杂化。如果移除间接性并不能解决问题,您需要仔细检查信号上何时生成事件以及何时处理它们的顺序。

您的状态机的输出未注册,这也可能涉及。考虑重新设计 FSM,以便注册所有输出。一般来说,这是一种更好的设计实践,因为它可以确保您不会有影响下游逻辑的未知组合延迟。

【讨论】:

  • 我摆脱了时钟和重置的重新分配(整个项目中有几个)。我不确定我是从教授还是他的讲义中看到的,还是从哪里得到的。不管怎样,它把 100 ps 的脉冲变成了瞬时脉冲。不是我所期望的,但现在电梯似乎工作正常。我想知道这是否与我只进行 RTL 模拟有关。
  • 您在设计中仍然存在增量周期延迟问题。可能涉及来自 FSM 的异步输出。作为一种快速破解,您可以尝试使用foo_delay &lt;= foo after 1 ps 对它们施加更多延迟,看看会发生什么。尖峰意味着您有时间风险,这可能是综合后的问题。
  • 是的,我可能必须还原更改才能上交项目,因为它会在楼层之间移动,但现在它会执行前两个调用,然后我有一个问题在按下按钮的触发器上进行复位。目前重置在第一次调用后永久禁用按钮,我意识到寄存器在这里很有用,但不幸的是我没有时间真正做好这个项目。我会回复发生的事情,非常感谢您的意见!
  • 感谢您的帮助,很遗憾我无法完成这个项目。但是,我确实学到了一些东西,即尖峰的重要性。
猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多