2014-07-14 2 views
0

저는 학교를위한 최종 프로젝트를 진행하고 있으며 Quartus 및 ModelSIM에서 VHDL로 작업 한 것은 이번이 처음입니다. 그것은 3 층에 서비스를 제공하는 엘리베이터의 제어 장치가되어야합니다. 몇 가지 신호에이 이상한 스파이크가 있으며 소스를 찾을 수없는 것 같습니다.신호의 이상한 급증 ModelSim VHDL

내가 가진 한 가지 문제점은 현재 바닥을 보여주는 위/아래 카운터에 신호를 보내는 신호입니다. 바닥에서 멈 추면 한 번 더 계산하거나 한 층을 너무 높이거나 한 층을 너무 낮게 끝내는 반면, 다음 층에는 다른 층이 호출 될 때까지 동일한 층을 표시하는 것처럼 보입니다. 다음 플로어 디스플레이는 FSM에서 나오고, 현재 플로어 디스플레이는 위/아래 카운터에서옵니다.

여기에 모든 것을 게시하는 것이 약간 복잡하므로 누군가이 신호 스파이크를 우연히 만났을 때를 대비해 파형을 게시 할 예정이며 사소한 오류/쉬운 수정이 될 수 있습니다.

waveform

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가있는 구성 요소로가는 신호를 보냅니다.

+0

Elev_Pulse를 할당 한 코드를 게시하십시오. 네가 OR 게이트를 지정했을거야? – Russell

+0

스파이크로 인해 추가 카운트가 발생 했습니까? 일반적으로 시계처럼 사용할 수 없다면 (마스터 시계를 사용하는 것처럼 보이지는 않습니다), 또는 명백하지 않은 다른 작업을 수행하지 않는 한 일반적으로 사용하지 않을 것입니다. – fru1tbat

답변

1

CLK 및 RST에 대한 클럭 및 리셋의 재 할당을 제거하고 포트에서 직접 신호를 사용합니다. 이것은 이러한 종류의 스파이크의 원인 인 델타주기 지연을 생성합니다. 문제가 복잡해질 수있는 디자인의 지연이 다른 리셋이있는 것 같습니다. 간접 검색을 제거해도 문제가 해결되지 않으면 신호가 생성 될 때와 처리 될 때의 순서를 면밀히 조사해야합니다.

상태 시스템의 출력물이 등록되지 않았으므로 잠재적으로 관련이 있습니다. FSM을 재 작업하여 모든 출력이 등록되도록하십시오. 이것은 다운 스트림 로직에 영향을 미치는 알려지지 않은 조합 지연을 가지지 않기 때문에 일반적으로 더 나은 설계 방법입니다.

+0

나는 시계와 리셋의 재 할당을 없앴습니다 (전체 프로젝트에서 한 쌍이있었습니다). 나는 교수님이 유언장이나 유인물에서 보았는지, 어디에서 가져 왔는지 확실하지 않습니다. 어쨌든, 그것은 100 ps 펄스를 순간 펄스로 바꿨습니다. 내가 기대했던 것이 아니었지만 지금은 엘리베이터가 제대로 작동하는 것 같습니다. 이것이 RTL 시뮬레이션 만하고 있다는 사실과 관련이 있는지 궁금합니다. – user112828

+0

디자인에서 여전히 델타 - 사이클 지연 문제가 있습니다. FSM의 비동기 출력이 관련되어있을 수 있습니다. 빠른 해킹으로'foo_delay <= foo after 1 ps'를 사용하면 어떤 일이 일어나는지 조금 더 지연시켜 볼 수 있습니다. 스파이크는 합성 후 문제가 될 수있는 타이밍 위험이 있음을 의미합니다. –

+0

그래, 그것은 프로젝트를 시작하기 위해 변경 사항을 되돌려 야 할 수도 있습니다. 왜냐하면 그것이 바닥 사이를 움직이는 방식 이었지만, 이제는 처음 두 번의 호출을 할 것이고, 그러면 플립 - 단추 누르기를하는 데 쓰는 수류탄. 현재 리셋은 첫 번째 호출 이후에 버튼을 영구적으로 비활성화합니다. 레지스터가 유용 할 것입니다.하지만 불행히도이 프로젝트를 실제로 수행 할 시간이 없습니다. 무슨 일이 일어나는지 다시 게시하겠습니다. 정말 감사드립니다! – user112828