2016-06-01 12 views
1

누군가 플립 플롭 대신 래치가 유추되는 이유를 설명 할 수 있습니까?플립 플롭 및 래치 추론 딜레마

always_ff @ (posedge clk, negedge rst) 
begin 
    if (!rst) 
    a <= '0; 
end 

항상 블록이 신호 에지에 민감하여 플립 플롭을 추론하지 않아야합니다. 이 경우 리셋의 네거티브 에지가 트리거되면 a는 0을 얻습니다. 그렇지 않으면 이전 값을 유지합니다.

이 질문이 유래 질문에서 선택한 가장 좋은 대답에서 오는

:
System Verilog always_latch vs. always_ff

========================== ===================================

나는 지금까지 내가 발견 한 것을 여기서 공유 할 것이다. 플립 플롭 대신 래치로 합성하는 이유는 할당의 오른쪽에 상수가 있기 때문입니다. 이 경우 래치와 플립 플롭의 동작은 신호 에지 (플립 플롭)에서 입력 값을 포착하는지 또는 입력 래칭이 활성화 (래치)되어 있는지 여부와 상관 없기 때문에 등가 임 입력이 변경되지 않습니다. 따라서 합성 도구는 더 적은 자원, 즉 래치를 사용하는 요소를 선택합니다.

한편, 할당의 오른쪽에 VARIABLE이있는 경우, 합성은 플립 플롭을 추정해야합니다 (). 입력이 에지에서 샘플링되는지 (플립 플롭) 또는 입력 래칭이 활성화 (래치)되는 동안, 두 로직 요소가 같지 않음을 의미합니다..

다음은 예입니다. 처음 두개의 always 블록은 Quartus 14에서 래치로 합성 될 것입니다. 상수 때문에 상응합니다. 그러나 3. 블록과 4. 블록은 의도 한 동작이 아닌 래치로 합성되며 이러한 블록은 동일하지 않습니다. 3. 블록은 경고를 제공하지만 블록은 경고를 제공하지 않습니다. 저에

module ff_latch(
    input logic clk, 
    input logic nrst, 
    input logic a, 
    output logic t, x, y, z 
); 

    always_ff @(posedge clk, negedge nrst) 
     begin 
      if (!nrst) 
      t <= 0; 
     end 

    always_latch 
     begin 
      if (!nrst) 
      x <= 0; 
     end 

    always_ff @(posedge clk, negedge nrst) 
     begin 
      if (!nrst) 
      y <= a; 
     end 

    always_latch 
     begin 
      if (!nrst) 
      z <= a; 
     end 

endmodule: ff_latch 

이 동작은 I 구체적 I가 (에지 트리거)와 플립 플롭을 원하는 특징으로하는, 정확하지 않다. 그것은 코딩은 항상, 블록 3 모호하며 위의 시뮬레이션에서이 파형에서 볼 수있는 4.는 분명히 다르더라도 것이 아니다 :

enter image description here

은 블록 3 (tb_y)는 같은 동작

비동기 플립 플롭 및 블록 4 (tb_z)는 래치처럼 동작합니다. 그러나 합성 도구는 두 경우 모두 래치를 추론합니다.

코드 또는 파형에 대해 의견을 개진 할 수 있다면 많은 도움이 될 것입니다.

답변

4

이 코드 이 래치처럼 동작하므로 신시사이저가 래치를 유추합니다. 플립 플롭처럼 행동하지 않습니다. 그것만큼이나 간단합니다.

이 코드가 어떻게 작동하는지 생각해보십시오. 처음에는 a의 값이 'x이 될 것입니다. rst이 낮게 표명되면 a'0이됩니다. a은 영원히 '0에 남습니다. 따라서 a의 상태는 입력의 현재 상태뿐 아니라 과거 상태에도 영향을받습니다.따라서 순차 논리이 아니라 조합 논리이 아닙니다. 플립 플롭은 클럭 에지에서 상태를 변경합니다. a 않습니다. 항상 블록이 신호 에지에 민감하다는 사실은 부적합합니다. 이것은 코드 내부가 해당 신호 에지에서 실행된다는 것을 의미합니다. 즉, 양수 에지는 clk입니다. 그러나 이것이 발생하면 은 아무 것도 발생하지 않습니다.이므로이 코드는 래치처럼 동작합니다.

+0

확인을하지만, 그것은 또한 플립 플롭 (flip-flop)처럼 행동 할 수있는 날 것으로 보인다 :

같은 기능을 구현하는 플롭을 가지고 주장하는 경우에, 당신이 시도 할 수 있습니다. 네거티브 리셋에서는 플립 플롭을 클리어하고, 그렇지 않으면 clk의 포지티브 에지에서 이전 값을 유지합니다. 이것은 다음과 같습니다. [link] (http://imgur.com/htuPVsC) 또한 하드웨어에는 상태 x이 없어야합니다. 0, 1 또는 Z 일 수 있기 때문에 두 경우 모두 (래치 또는 플립 플롭) 전원이 켜지면 임의의 값으로 고정됩니다 (0 또는 1). 코드는 둘 다처럼 동작 할 수 있지만 합성 도구는 적은 리소스를 사용하는 코드를 선택합니다. – evilpascal

+0

@evilpascal 적은 리소스를 사용하는 회로를 선택하는 것은 신디사이저에 거의 빵과 버터입니다. –

1

시계의 위치에 어떤 일이 발생했는지 지정하지 않았기 때문에. 마치 aclk 또는 그 주장에 전혀 의존하지 않는 것입니다. 모든 설명에 따르면 a은 일 때 0으로 설정됩니다. 또한, a은 다른 모든 경우에 이전 값을 유지한다고 (암시 적으로) 말합니다. 이것은 래치에 의해 구현 될 수 있습니다.

@posedge가 clk 인 것만으로 그 블록 내의 모든 변수가 플롭으로 합성된다는 것을 의미하지는 않습니다. 블록이 posedge of clk에서 활성화 될 때 a으로 비 차단 할당이 필요합니다. here을 참조하십시오.

always_ff @ (posedge clk or negedge rst) 
begin 
    if (!rst) 
    a <= '0; 
    else 
    a <= a; //Here, we are specifying what happens @posedge of clk 
end 
+0

하지만 내 게시물의 첫 번째 코드는 리셋이 떨어지는 가장자리에서만 샘플링해야하므로 리셋이 해제 된 동안은 항상 비동기 리셋 및 래치가 아닌 플립 플롭처럼 동작해야합니다. 편집 된 질문에 대한 나의 분석을 참조하십시오. – evilpascal

+1

그 래치를 할 수있는 플롭은 clk의 가장자리에서 신호를 샘플링 할 수 없습니다. 다시 설정하면 출력 값이 상수 값으로 강제 설정됩니다. 이것은 래치 (latch)에 의해 구현 될 수 있는데, 이것은 래치 (latch)에 의해 구현 될 수 있는데, 이것은 래치에 의해 구현 될 수 있는데, 래치는 그 하부 영역 때문에 합성 툴에 의해 선호된다 당신의 예제에서'y' 신호는 플롭처럼 동작합니다. 왜냐하면'nrst'는 클럭 신호처럼 동작하고 그 가장자리에서 입력 값을 샘플링하기 때문입니다. 이는 단일 래치로 수행 할 수 없습니다. @negedge rst를 지정하더라도 출력은 상수에 할당되기 때문에 처음에는 가장자리에 민감하지 않아도됩니다. 레벨에 민감한 모듈이면 충분합니다. – Ari

+0

상수가 과제의 오른쪽에 있으면 래치와 플립 플롭의 동작이 동일합니다. 이것은 문제가되지 않습니다. 당신은'y' 시그널을 언급하는데, 그것은'y'와'z'가 모두 래치로서 합성되기 때문에 상황이 이상하게 생기는 곳입니다. 그리고 나는 이것이 사실 일 수 없다고 주장합니다. 과제의 오른쪽에 변수 (신호)가 있기 때문에 마지막 두 항상 블록 ('y'와 'z')의 기능은 동일하지 않습니다 (첨부 된 분석 및 파형 참조). – evilpascal