2011-10-20 5 views
1

나는 시프트 키 탐지기를 설계하고 있습니다. 테스트 벤치를 작성했습니다. 테스트 결과 구현이 잘못되었다고 나타났습니다.VHDL - 키 검색에서 정의되지 않은 동작

다음은 ModelSim의 시뮬레이션입니다.

enter image description here

은 빨간색 선은 정의되지 지적했다. 이 동작은 두 번 발생했습니다.

나를 혼란스럽게 만든 것은 왜 그 두 값 사이에 큰 격차가 있습니까? 테스트 벤치를 보면 3 단계와 4 단계 절차는 1 단계와 2 단계에 사용 된 형식을 사용합니다.

테스트 벤치는 여기에 있습니다 : http://pastebin.com/BJVFFgGr

검출기 코드는 여기에 있습니다 : http://pastebin.com/di42FLqT

당신이 볼 수 있듯이. 내 디자인에는 두 가지 주들이 있습니다. PS2 수신기는 키를 누르거나 떼면 클린 8 비트 코드를 필터링하고 생성합니다. 중단 코드는 방금 릴리스 된 키의 작성 코드 다음에 오는 F0입니다. 내 상태 머신은 두 개의 추가 비트를 사용하여 어떤 시프트 키가 눌려 졌는지 추적합니다.

디버그를 거쳤으며 세 번째 테스트 값을 입력하면 이전 값에서 1 대신 SHIFT = U가됩니다.

-- release left shift 
hex <= "11110000"; 
wait for 5 ns; 
clk <= NOT clk; 
wait for 50 ns; 
clk <= NOT clk; 
wait for 50 ns; 

hex <= "00010010";  <----- when I am here shift is already U 
wait for 5 ns; 
clk <= NOT clk; 
wait for 50 ns; 
clk <= NOT clk; 
wait for 50 ns; 

if (shift /= '0')then 
    error <= '1'; 
end if; 

left_pressed 및 right_pressed는 변수가 아닌 신호입니다. 그래서 그들은 어떤 경우에도 가치를 가져야합니다. 그 중 하나가 변경되면 시프트 신호로의 연결이 자동으로 업데이트됩니다.

누군가 나를 도울 수 있습니까? 감사.

감사합니다.

답변

3

나는

shift <= left_pressed or right_pressed; 

및 right_pressed이 정의되어 있기 때문에 당신이 'U'출력을 받고있어 기대, 그래서 left_pressed 때를 통해 right_pressed 쇼에서 '0' 'U'를하게된다.

기억

1 or x == 1 
0 or x == x 

는 X는 '0', '1', 'U', 'X', 'Z'가 될 수있는 것을 '-', 'H', 'L'

이 left_pressed 순간 나를

  1. 에게 서서 그들이 어떤 조건에서 다음에 한 사이클에서 자신의 가치를 전달하므로 래치가 right_pressed있는 코드에 몇 가지 문제가 있지만, 그들은있어 클록 된 프로세스가 아닙니다. 그것들을 보통 신호로 만들기를 원한다면, 프로세스 시작시에 기본값을 주어야합니다. 이들을 레지스터로 사용하려면 클록 처리가 필요합니다.

    이는 next_state에도 해당됩니다. 기본값이 있어야합니다.

    next_state <= current_state; 
    
  2. current_state는 비동기 프로세스의 민감도 목록에 있어야합니다.

  3. 테스트 벤치에서 시계를 생성하는 별도의 프로세스를 사용하십시오. 지금은 시계가 엉망인 자극과 섞여 있습니다. 또한 읽는 것을 어렵게 만듭니다.

    process p_clkgen 
    begin 
        repeat begin 
         clk <= NOT clk; 
         wait for 50 ns; 
        end; 
    end process; 
    

    그러면 다른 프로세스는 입력이 전환 될 때만 처리합니다. (나는 반복이 VHDL에서 유효한 키워드인지 기억할 수 없다. 그러나 아이디어를 얻는다.)

  4. 나는 당신의 상태가 섞여 있다고 생각한다. 아마도 상태는 왼쪽 또는 오른쪽 shift 키가 눌려져 있어야하며, 각각에 대한 메이크 또는 브레이크는 상태 간의 전환입니다. 이 믹스 업은 left_pressed와 right_pressed가 현재 래치 인 이유 중 일부라고 생각합니다.

+0

감사합니다. 어디에 next_state <= current_state를 삽입합니까? 나는 다른 일을했지만, 나는 그 사람이 나를 망쳐 놓고 있다고 생각한다. 감사합니다 – CppLearner

+0

next_state를 업데이트하는 프로세스를 시작하십시오. 기본 사례이므로 다른 할당이 하나도 없으면 다음 상태를 정의해야합니다. –

2

귀하의 조합 프로세스가 left_pressedright_pressed을 구동합니다. 그러나 프로세스를 실행할 때마다 값을 지정하지 마십시오. 하드웨어에서는 래치가 생깁니다. 시뮬레이션에서는 초기 값 ('U')이 남습니다.

프로세스 초기에이 신호에 기본값을 지정하거나 레지스터를 작성하십시오.

+0

감사합니다. 나는 지금 그것을 고치려고 노력하고있다. – CppLearner

관련 문제