Study/FPGA

05 - 동기 Synchronous vs. 비동기 리셋 Reset

도엔 2025. 3. 3. 15:50
728x90

0. 리셋(Reset)

  • 디지털 회로에서 리셋(Reset)은 시스템을 초기 상태로 되돌리는 중요한 기능
  • FPGA에서 리셋을 적용하는 방식은 크게 동기 리셋비동기 리셋으로 나뉜다.


==========𝔼𝔼𝟚𝟚==========

 

1. 동기 리셋 (Synchronous Reset)

  1. 정의
    • 리셋 신호가 클럭(Clock)과 동기화되어 동작하는 방식
    • 클럭의 Positive Edge 또는 Negative Edge에서만 리셋이 적용됨
  2. 장점
    • 메타스테이블(Metastability) 문제 방지: 클럭 도메인과 동기화되어 동작하므로 안정적
    • FPGA 내부에서 최적화 가능: FPGA에서는 클럭 신호를 중심으로 최적화가 이루어지므로, 동기 리셋을 사용하면 논리 자원 활용이 효율적임
    • 타이밍 문제 최소화: 클럭과 함께 동작하므로 설정/유지 시간 위반(Setup/Hold Timing Violation) 문제를 줄일 수 있음
  3. 단점
    • 클럭이 없으면 리셋이 즉시 반영되지 않음: 전원이 켜질 때 클럭이 동작하기 전까지 리셋이 적용되지 않을 수 있음
  4. 예제 코드 (Verilog)
always @(posedge clk) begin
    if (reset) 
        data <= 0;  // 리셋 시 초기화
    else 
        data <= data + 1;
end

 


==========𝔼𝔼𝟚𝟚==========

 

 

2. 비동기 리셋 (Asynchronous Reset)

  1. 정의
    • 리셋 신호가 클럭과 무관하게 즉시 적용되는 방식
    • 리셋 신호가 High가 되는 순간, 즉시 레지스터가 초기화됨
  2. 장점
    • 클럭 없이도 즉시 초기화 가능: 시스템이 켜지자마자 동작해야 하는 경우 유리함
    • 전원 인가(Power-On Reset) 시 확실한 초기화 보장: FPGA 부팅 시 확실하게 초기화되는 것이 필요할 때 사용
  3. 단점
    • 메타스테이블 문제 발생 가능: 클럭과 리셋이 비동기적으로 동작하기 때문에, 클럭 도메인 내에서 리셋 해제 순간 타이밍 이슈가 발생할 수 있음
    • FPGA 내부에서 최적화가 어려움: FPGA에서는 주로 동기 신호를 중심으로 최적화가 이루어지므로, 비동기 리셋을 사용하면 일부 최적화가 제한될 수 있음
    • 클럭과 동기화되지 않으면 글리치(Glitch) 문제 발생 가능: 리셋 해제 시 순간적인 타이밍 문제로 인해 불안정한 동작이 발생할 위험이 있음
  4. 예제 코드 (Verilog)
always @(posedge clk or posedge reset) begin
    if (reset) 
        data <= 0;  // 리셋 시 초기화
    else 
        data <= data + 1;
end

 


==========𝔼𝔼𝟚𝟚==========

 

 

3. FPGA에서의 리셋 기준

  • 기본적으로 동기 리셋을 사용한다.
    • FPGA 내부의 최적화, 타이밍 안정성을 고려할 때 동기 리셋이 기본 선택지가 되어야 함
    • BRAM, DSP, AXI 인터페이스 등은 동기 리셋만 지원하는 경우가 많으므로, 동기 리셋을 사용하는 것이 안전함
  • 비동기 리셋이 필요한 경우
    • 전원 인가 시 즉시 리셋이 필요한 경우
    • FPGA에서 **Power-On Reset(POR)**과 같은 기능이 필요할 때
    • 다만, **비동기 리셋을 내부적으로 동기화(sync_reset 모듈 활용)**하여 타이밍 문제를 방지해야 함


==========𝔼𝔼𝟚𝟚==========

 

4. 설계 방법

  • 대부분의 FPGA 논리 회로동기 리셋 사용
  • 전원 인가 시 즉시 초기화가 필요한 경우비동기 리셋 + 동기화 처리
  • BRAM, DSP 블록을 사용할 경우동기 리셋 필수


==========𝔼𝔼𝟚𝟚==========

 

5. 동기화된 비동기 리셋 처리 방법

: 비동기 리셋을 사용할 때, 타이밍 문제를 방지하기 위해 내부적으로 동기화 과정을 거쳐야 함.

  • 예제 코드 (비동기 리셋 후 동기화)
reg reset_sync1, reset_sync2;
always @(posedge clk or posedge async_reset) begin
    if (async_reset)
        {reset_sync1, reset_sync2} <= 2'b11;  // 비동기 리셋 적용
    else
        {reset_sync1, reset_sync2} <= {1'b0, reset_sync1};  // 동기화 처리
end

always @(posedge clk) begin
    if (reset_sync2)
        data <= 0;  // 동기화된 리셋 신호로 초기화
    else 
        data <= data + 1;
end
  • async_reset이 들어오면 즉시 리셋 적용
  • 클럭이 동작하면서 reset_sync1, reset_sync2를 거쳐 동기화 처리
  • reset_sync2를 기준으로 최종 리셋 신호를 사용


==========𝔼𝔼𝟚𝟚==========

 

6. 결론

: FPGA에서는 기본적으로 "동기 리셋"을 사용하는 것이 좋다.

  • 메타스테이블 문제를 피할 수 있음
  • FPGA 내부에서 최적화가 가능함
  • BRAM, DSP, AXI 인터페이스 등은 동기 리셋만 지원하는 경우가 많음
  • 비동기 리셋을 사용해야 하는 경우, 반드시 동기화(sync_reset 모듈 활용)를 통해 타이밍 문제를 해결해야 함!
728x90
반응형