2013-03-18 5 views
0

저는 VHDL과 XILINX ISE를 처음 사용했습니다. 나는 자일링스 ISE 버전 13.2를 사용한다.VHDL과 자일링스를 이용한 푸시 버튼 스위치 설계 카운터

나는 다음과 같은 입력이 매우 간단한 카운터 설계 할 :

  • 방향을
  • 카운트

카운트 입력이 버튼에 할당 내가 계산하는 카운터를 원하는 것 버튼을 누를 때 방향 입력에 따라 위 또는 아래로 움직입니다. 이 전에 샘플 VHDL을 작성했습니다. 그것은 클럭 입력을 가졌고 그것은 클럭 입력에 따라 세고있었습니다. 이제는 동 기적으로 계산하는 대신 버튼을 누르면 계산됩니다.

여기에 (내 코드는 논리적 또는 기타 결함이 있으면 말씀 해주십시오) 내 VHDL 코드입니다 :

entity counter is 
    Port (COUNT_EN : in STD_LOGIC; 
      DIRECTION : in STD_LOGIC; 
      COUNT_OUT : out STD_LOGIC_VECTOR (3 downto 0)); 
end counter; 

architecture Behavioral of counter is 

signal count_int : std_logic_vector(3 downto 0) := "0000"; 
begin 
process 
begin 
    if COUNT_EN='1' then 
     if DIRECTION='1' then 
      count_int <= count_int + 1; 
     else 
      count_int <= count_int - 1; 
     end if; 
    end if; 
end process; 
COUNT_OUT <= count_int; 
end Behavioral; 

나는 스파르타 xc3s500e를 사용하고 난 그에 따라 입력을 두었다.

#Created by Constraints Editor (xc3s500e-fg320-5) - 2013/03/18 
NET "COUNT_EN" LOC = K17; 
NET "COUNT_OUT[0]" LOC = F12; 
NET "COUNT_OUT[1]" LOC = E12; 
NET "COUNT_OUT[2]" LOC = E11; 
NET "COUNT_OUT[3]" LOC = F11; 
NET "DIRECTION" LOC = L13; 
#Created by Constraints Editor (xc3s500e-fg320-5) - 2013/03/18 
NET "COUNT_EN" CLOCK_DEDICATED_ROUTE = FALSE; 

나는 내가 오류가 발생했기 때문에 마지막 라인을 변경하는 데 필요한 :

This will not allow the use of the fast path between the IO and the Clock... 

이 오류가 간 후에, 나는 장치를 프로그램 아래 내 .ucf 파일입니다. 그러나 출력 (leds)은 미친 듯이 행동했다. 그들은 때로는 몇 초 동안 그대로 서 있었고 때로는 매우 빠르게 깜박 거리기도했습니다. 나는 내 실수가 어디인지 알 수 없었다. 어떤 도움을 주시면 감사하겠습니다. 초보자 용 자습서를 많이 읽으 셨습니다. (링크를 통해 자일링스 문서에 대한 안내를 받았으며 초보자에게는 상당히 복잡해 보였습니다.)

답변

1

귀하의 설명에서 나는 이 아니며Asynchronous Counter을 찾고 있음을 이해합니다.

필요한 것은 푸시 버튼 스위치의 트리거로 계산되는 카운터입니다. RTL 아래의 작업을해야합니다 :

enter image description here

를 HDL에 어떤 어려움이 알려 코딩합니다.

+0

나는이 게시물이 오래되었음을 알고 있지만, 여기 아래 그림에서 중요한 결함이 있습니다! 표시된 디 바운스 로직은 에지 감지입니다. 실제 디 바운스 로직은 글리치 (debouncing)에 대한 입력 신호를 필터링하기 위해 타이머와 FSM이 필요합니다. – Paebbels

1

시계가 없습니다. COUNT_ENDIRECTION 조건이 만족되면 count_int 변수가 가능한 한 빨리 증가 할 것입니다 ... 실제로 개별 비트가 변경 될 때 타이밍이 전체를 완전히 불안정하고 부정확하게 만듭니다. .

FPGA는 타이밍을 올바르게 잡기 위해 항상 시계를 사용해야합니다.

이 경우 시계를 다시 넣은 다음 새 신호 COUNT_EN_LAST을 추가하십시오. 이전 COUNT_EN을 각각 시간이 지정된 프로세스를 통과하도록 저장합니다. COUNT_EN = '1'COUNT_EN_LAST = '0' 인 경우에만 증가합니다.

실제로 입력을 "디 바운스 (debounce)"해야합니다. 물리적 인 버튼/스위치가 "바운스 (bounce)"되고 단일 버튼 누름마다 여러 개의 오프 - 온 이벤트를 제공합니다. 이를 위해, 당신은 단순히, COUNT_EN_LAST 벡터 (긴 5 말)을 만드는 것 그것으로 때마다 새 값을 이동 ("COUNT_EN_LAST < = COUNT_EN_LAST (3 downto 0) & COUNT_EN를,"을) 만 증가 할 때 을 COUNT_EN_LAST = "01111" 또는 모두 1이되기 바로 전에 필요한 벡터의 길이는 시계의 속도와 스위치가 새로운 상태로 내려 가기 전에 얼마나 오래 바뀔 수 있는지에 따라 달라집니다.

+0

내가 "단순한"것으로 생각한 것은 이전의 쉬운 클럭 된 예제보다 복잡하다는 것으로 판명 된 것 같습니다. 보드에서 말하는 것을 시도 할 때 알려 드리겠습니다. 시간 내 주셔서 감사합니다 :) – Varaquilex