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