8-bit 데이터를 최대 1024개 저장하는 FIFO는 Vivado FIFO Generator에서 write/read 폭을 8bit, depth를 1024로 설정하면 된다. 총 저장 용량은 8192bit, 즉 1024byte(1KiB)다.
먼저 정할 값
IP를 만들기 전에 FIFO의 연결 방식과 필요한 상태 신호를 정한다.
| 설정 | 이 예의 값 | 확인할 점 |
|---|---|---|
| Interface | Native | 사용자 RTL에서 FIFO 포트를 직접 제어할 때 사용 |
| Clocking | Common clock | write와 read가 같은 clock domain일 때만 사용 |
| Write data width | 8 | 한 번에 넣는 데이터 폭 |
| Read data width | 8 | 한 번에 꺼내는 데이터 폭 |
| FIFO depth | 1024 | 저장 가능한 entry 수 |
| Reset | 동기 reset | reset polarity와 활성 조건을 RTL에서 일치시킴 |
write와 read가 서로 다른 clock domain이면 common-clock FIFO를 쓰지 않는다. FIFO Generator의 independent-clock 구성이나 사용 FPGA에 맞는 asynchronous FIFO를 선택한다.
FIFO Generator 설정
Vivado IP Catalog에서 FIFO Generator를 추가하고, 사용할 프로젝트와 FPGA part가 맞는지 확인한다. IP 버전에 따라 화면의 탭과 옵션 이름이 다를 수 있으므로 생성된 IP의 customization 화면과 product guide를 기준으로 설정한다.
- Native interface를 선택한다.
- write data width를
8, FIFO depth를1024로 설정한다. - 별도 변환이 필요 없다면 read data width도
8로 둔다. - 실제 reset 회로에 맞는 reset type과 polarity를 지정한다.
- RTL에서 사용할
full,empty,data_count또는valid신호만 활성화한다. - Summary에서 폭, 깊이, clocking mode, reset 설정을 확인한 뒤 IP output products를 생성한다.
data_count의 폭과 단위는 선택한 IP 설정에 따라 달라질 수 있다. 특히 폭이 다른 FIFO에서는 count가 byte 수가 아니라 entry 수로 표현될 수 있으므로 product guide와 생성된 포트 설명을 확인한다.
RTL에서 지킬 순서
write 요청은 FIFO가 full이 아닐 때만 받아들인다. read 요청은 empty가 아닐 때만 보낸다. FIFO가 제공하는 handshake/status 신호의 정확한 타이밍은 standard/FWFT 모드와 출력 레지스터 설정에 따라 다르다.
write: write request && !full
read: read request && !empty
위 식은 요청을 허용할 조건을 나타낸다. 실제 포트 이름과 valid, ready, rd_en, wr_en 사이의 관계는 생성한 IP의 interface 문서를 따른다.
생성 뒤 확인할 것
- Synthesis 결과에서 FIFO가 의도한 memory resource로 구현됐는지 확인한다.
- Simulation에서 reset 직후
empty상태와 첫 write/read 순서를 확인한다. - 연속 write로
full에 도달하는지, full 상태에서 추가 write가 차단되는지 검사한다. - 연속 read로
empty에 도달하는지, empty 상태에서 읽을 때의 동작을 확인한다. - read latency와 data-count의 단위를 테스트벤치 기대값과 비교한다.
IP 설정을 바꾼 뒤에는 output products를 다시 생성하고 기존 simulation/synthesis 결과를 재사용하지 않는다.
공식 자료
원문 기록
한 줄 요약
8-bit × 1024-entry FIFO는 1KiB 용량이며, 폭과 깊이뿐 아니라 clock domain, reset, full/empty 처리와 read latency까지 함께 검증해야 한다.