728x90
0. 리셋(Reset)
- 디지털 회로에서 리셋(Reset)은 시스템을 초기 상태로 되돌리는 중요한 기능
- FPGA에서 리셋을 적용하는 방식은 크게 동기 리셋과 비동기 리셋으로 나뉜다.
==========𝔼𝔼𝟚𝟚==========
1. 동기 리셋 (Synchronous Reset)
- 정의
- 리셋 신호가 클럭(Clock)과 동기화되어 동작하는 방식
- 클럭의 Positive Edge 또는 Negative Edge에서만 리셋이 적용됨
- 장점
- 메타스테이블(Metastability) 문제 방지: 클럭 도메인과 동기화되어 동작하므로 안정적
- FPGA 내부에서 최적화 가능: FPGA에서는 클럭 신호를 중심으로 최적화가 이루어지므로, 동기 리셋을 사용하면 논리 자원 활용이 효율적임
- 타이밍 문제 최소화: 클럭과 함께 동작하므로 설정/유지 시간 위반(Setup/Hold Timing Violation) 문제를 줄일 수 있음
- 단점
- 클럭이 없으면 리셋이 즉시 반영되지 않음: 전원이 켜질 때 클럭이 동작하기 전까지 리셋이 적용되지 않을 수 있음
- 예제 코드 (Verilog)
always @(posedge clk) begin
if (reset)
data <= 0; // 리셋 시 초기화
else
data <= data + 1;
end
==========𝔼𝔼𝟚𝟚==========
2. 비동기 리셋 (Asynchronous Reset)
- 정의
- 리셋 신호가 클럭과 무관하게 즉시 적용되는 방식
- 리셋 신호가 High가 되는 순간, 즉시 레지스터가 초기화됨
- 장점
- 클럭 없이도 즉시 초기화 가능: 시스템이 켜지자마자 동작해야 하는 경우 유리함
- 전원 인가(Power-On Reset) 시 확실한 초기화 보장: FPGA 부팅 시 확실하게 초기화되는 것이 필요할 때 사용
- 단점
- 메타스테이블 문제 발생 가능: 클럭과 리셋이 비동기적으로 동작하기 때문에, 클럭 도메인 내에서 리셋 해제 순간 타이밍 이슈가 발생할 수 있음
- FPGA 내부에서 최적화가 어려움: FPGA에서는 주로 동기 신호를 중심으로 최적화가 이루어지므로, 비동기 리셋을 사용하면 일부 최적화가 제한될 수 있음
- 클럭과 동기화되지 않으면 글리치(Glitch) 문제 발생 가능: 리셋 해제 시 순간적인 타이밍 문제로 인해 불안정한 동작이 발생할 위험이 있음
- 예제 코드 (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
반응형
'Study > FPGA' 카테고리의 다른 글
[FPGA] 07 - 파이프라인 Pipeline 개념과 예제 (0) | 2025.03.08 |
---|---|
06 - Verilog Module 모듈과 Instance 인스턴스화 개념 (0) | 2025.03.08 |
04 - FPGA 설계 흐름 (Design Flow) (0) | 2025.03.01 |
03 - HLS(High-Level Synthesis) 개념 및 툴 정리 (0) | 2025.03.01 |
02 - Clock 확인과 Vivado Verilog 실습 (0) | 2025.02.14 |