2017-04-19 7 views
3

모두 하락과 상승 에지를 사용하여 나는 다음과 같이 FPGA & VHDL 초보자가 ..FPGA : 동일한 프로세스

내 개발 환경입니다입니다.

FPGA : 스파르탄 6 XC6SLX9

컴파일러 :

ISE 14.04 시뮬레이터 : ISIM

나는 간단한 카운터를 만들고 있어요,하지만 난 이해할 수없는 몇 가지가 있습니다.

다음 코드는 내가 작성한 코드입니다. 내가 예상했던 것은 w_count가 클럭의 모든 하강 에지에서 증가되었고, w_count가 클럭의 상승 에지 동안 N_data에 도달하면 0으로 리셋되었다. 컴파일 프로세스에는 아무런 문제가 없었으며, 예상했던대로 시뮬레이션도 잘 작동합니다. 나는 두 ELSIF 문의 위치를 ​​변경하는 경우 그러나 ..

w_state_proc : process(r_clk, reset_n_clean) 
begin 
    if(reset_n_clean = '0') then 
     w_count <= 0; 
    elsif(r_clk'event and r_clk = '0') then 
     if(state = write_state and w_proc = '1') then 
      w_count <= w_count + 1; 
     end if; 
    elsif(r_clk'event and r_clk = '1') then 
     if(w_count = N_data) then 
      w_count <= 0; 
     end if; 
    end if; 
end process w_state_proc; 

실제의 FPGA에 적용 할 때, w_count 각 트리거 증가했지만, N_data에 도달 할 때 0으로 초기화되지 않은, w_count은 전혀 증가하지 않았다 ..

w_state_proc : process(r_clk, reset_n_clean) 
begin 
    if(reset_n_clean = '0') then 
     w_count <= 0; 
    elsif(r_clk'event and r_clk = '1') then 
     if(w_count = N_data) then 
      w_count <= 0; 
     end if; 
    elsif(r_clk'event and r_clk = '0') then 
     if(state = write_state and w_proc = '1') then 
      w_count <= w_count + 1; 
     end if; 
    end if; 
end process w_state_proc; 

나는이 문은 권장되지 않습니다 피드백을 많이 볼 수 있지만, 이러한 진술이 문제가 발생할 이유가 을 이해하지 못하는 ..

+0

w_proc에 입력이 가능하다고 생각하십니까? – Staszek

+0

예. 그것은 외부의 fpga에서 오는 방아쇠입니다. –

답변

3

귀하의 FPGA 듀얼 없습니다 데이터 범용 패브릭에서 DDR (Double-Rate) 플립 플롭을 사용하는 것은 권장되지 않는 이유입니다. "있는 그대로"원하는 기능을 구현할 수 없습니다.

또한 비동기식 재설정을 사용하고 있습니다. 가능하면 FPGA는 이미 동기 리셋 플립 플롭을 가지고 있으므로 ASIC과 달리 여분의 로직을 필요로하지 않으므로 리셋을하지 않아도 모든 신호에 대해 알려진 값을 얻을 수 있으므로 권장하지는 않습니다. 비동기 리셋은 타이밍 클로저를 달성하는 데 문제를 일으킬 수 있습니다.

예에서 DDR FF는 필요 없습니다. 그것은 당신이 가지고있는 행동을하는 이유는 w_count가 클럭 사이클 사이에서 클리어 될 수있어서 w_count가 증가 할 때 결코 N_data가되지 않는다는 것입니다. 가치가 작은 것을 비교해 보시지 않겠습니까?

또는, (매우 신중하게!) 변수를 사용할 수있는 매우 비슷한 동작 달성하기 위해 :

w_state_proc : process(r_clk) is 
    variable v_count : integer range 0 to N_data; 
    begin 
    if (rising_edge(r_clk)) then 
     v_count := w_count; 
     if(state = write_state and w_proc = '1') then 
     v_count := v_count + 1; 
     end if; 

     if(reset_n_clean = '0' or v_count = N_data) then 
     w_count <= 0; 
     else 
     w_count <= v_count; 
     end if; 

    end if; 
    end process w_state_proc; 

당신이 정말 반 클럭 사이클에 대한 N_data의 값을 가지도록 w_count을해야하는 경우 항상 클럭을 두 배 빠르게 만들 수 있으며 활성화 신호를 매 클럭주기마다 활성화하여 파이프 라인과 함께 활성화 신호를 전파 할 수 있습니다. 그것은 다른 (매우 교육적인) 문제의 전체 호스트에서 당신을 얻을 것이다,하지만 행할.

+0

감사합니다 !!!!!!!!! –