2017-11-04 1 views
0

방금 ​​VHDL로 시작했는데 정확히 어떻게 프로세스가 작동하는지 이해하는 데 문제가 있습니다. 다음은 간단한 발진기의 예이다VHDL의 단순 발진기

timer_1Hz: process(clk) is 
    variable timer : integer := 0; 
    constant period : integer := 50E6; 
begin 
--if rising_edge(clk) then 
    timer := (timer+1) rem period; 
    if (timer=0) then 
     led <= not led; 
    end if; 
--end if; 
end process timer_1Hz; 

CLK 50 MHz의 주파수를 가지는 입력 (클록) 신호이고, 50 %의 듀티 사이클. 나는 그것을 이해

은 이제 프로세스 timer_1Hz는 그 1에서 00에서 1로의 전환, 또는 여부에 관계없이 clk 신호의 변화에 ​​트리거됩니다.

테스트가 주석 처리되었으므로 위의 예에서 주파수가 0.5 Hz 인 LED를 플래싱 할 것으로 예상됩니다. 다른 말로하면, 신체가 상승 및 하강 에지에서 단일 클록주기에 두 번 트리거 될 것으로 예상했습니다. 그러나 이는 작동하지 않는 것처럼 보입니다. 즉, LED가 절대로 켜지지 않습니다.

rising_edge 테스트를 포함하면 예상했던대로 LED가 1Hz 주파수로 깜박입니다.

예기치 않은 경우에 누락 된 부분을 설명해 주실 수 있습니까?

+0

FPGA 레지스터는 모두 상승 및 하강 에지에 트리거 할 수 없습니다. 하나의 가장자리 만 사용해야합니다. – JHBonarius

답변

1

제거한 상승 부분이 없으면 코드가 작동하지 않습니다. 그것은 시뮬레이션에서 작동하지만 실제 FPGA 보드에서는 작동하지 않을 수 있습니다. 왜? 왜냐하면 민감도 목록은 (대부분) 시뮬레이션에 중요하고 (너무) 합성에 중요하지 않기 때문입니다.

합성 목적으로 구현할 하드웨어에 대해 항상 생각해야합니다. 실제적인 의미에서 프로세스는 특정 이벤트가 발생할 때 "실행"되지 않습니다.

당신이 정말로 0.5 Hz로 출력을 원하는 경우에, 다만 원래의 코드로 대신 50E6의 25E6을 사용 ..

+1

완료하려면이 프로젝트를 구현하는 데 사용되는 registres는 매우 자주 한 클럭 에지에만 민감합니다. 때로는 어느 것을 고를 수 있으며 때로는 고집해야합니다. – Staszek