인프런 커뮤니티 질문&답변

권효원님의 프로필 이미지
권효원

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

f/f 동작원리에대해서 궁금증이 있습니다.

작성

·

87

1

안녕하세요

학습을하다가 궁금증이 생겨서 질문드립니다.

module d_ff_asyn_rst_en(
    input wire clk, d, rst_b, en,
    output reg q
    );

   always @(posedge clk or negedge rst_b or negedge en) 
   begin
      if (!rst_b)         
         q <= 0; 
      else if (!en)       
         q <= 0; 
      else                
         q <= d;          
   end

endmodule

이렇게 async rst, en F/F 설계를 했습니다.

 

여기서 궁금한게 있습니다.( rst_b로 말씀드리면)

여기서 rst_b가 negedge일때 always문이 동작하고 rst_b ==0 일떄 q <=0 이라고 했는데 negedege일때 rst_b의 값이 0인지 1인지 어떻게 판별을 하나요?

시뮬레이션상에서는 negedge rst_b 트리거가 발생하는 시점에서 rst_b의 값은 0으로판단하고 리셋시키는데 1에서 0으로 바뀌는순간은 기울기가 무한대라서 0인지 1인지 판별할 수 없다고 생각이듭니다...

 

 

답변 1

0

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요 🙂

실제 저희가 waveform 을 보고 있는대로, 1 -> 0 으로 변하는 순간 (edge) 의 기울기 무한대는 눈으로 확인가능합니다. 하지만 이 edge 의 기울기를 현재 저희가 사용하는 simulation tool 의 waveform 상에서는 불가능 한것으로 알고있습니다. 저희는 아날로그가 아닌, 디지털을 설계하고 있죠. 아날로그 설계라면 이런 기울기가 중요한 요소겠지만, 디지털은 edge 라는 표현으로 충분히 커버된다고 생각합니다.

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

Verilog 에서의 always 블록의 동작에 대해 이해하는 것이 중요합니다. 특히 @(posedge clk or negedge rst_b or negedge en) 구문은 세 가지 조건 중 하나가 발생할 때마다 항상 블록이 트리거된다는 것을 의미합니다. 이 세 가지 조건은 다음과 같습니다:

  1. clk의 상승 에지 (posedge)

  2. rst_b의 하강 에지 (negedge)

  3. en의 하강 에지 (negedge)

negedge rst_brst_b1에서 0으로 변하는 순간을 의미합니다. 이 순간에 항상 블록이 트리거되고, 블록 내부의 조건문이 실행됩니다.

if (!rst_b)
    q <= 0;

이 부분은 rst_b가 0일 때 q를 0으로 설정하라는 의미입니다. 즉, rst_b의 하강 에지가 발생( 1-> 0)하면 rst_b0이 되었음을 의미하므로 조건문이 참이 되고, q가 0으로 설정됩니다.

Verilog 시뮬레이션에서 negedge rst_brst_b1에서 0으로 변하는 순간을 정확히 인식하며, 이 순간 rst_b는 0으로 간주됩니다. 따라서, 에지가 발생한 후 조건문 if (!rst_b)rst_b가 0임을 정확히 판단하고, q를 0으로 설정합니다.

 

즐공하세요 🙂

 

 

권효원님의 프로필 이미지
권효원

작성한 질문수

질문하기