출력 코어 RTL은 현재 자세에서 화면 픽셀의 방향을 계산합니다. 그 방향이 가리키는 정이십면체의 면·타일·삼각 셀을 찾아 색을 읽고 HDMI 영상으로 내보냅니다.
픽셀의 색이 결정되는 경로
앱 창의 이미지는 PS가 변경 타일을 판정해 두 HW 투영코어에 보내고, 창별 결과를 캐시해 영향 타일만 합성합니다. 출력 코어는 그 프레임버퍼에서 현재 화면에 필요한 셀 색을 읽습니다. 따라서 앱 내용은 소프트웨어가 만들고, 현재 자세에서 어느 삼각 셀을 화면에 보여줄지는 RTL이 결정합니다. 시스템 구조에 전체 흐름이 있습니다.
자세 입력과 Q24 계수
센서 허브가 보내는 96비트 AXI4-Stream에는 yaw·pitch·roll이 각각 부호 있는 32비트 mrad 값으로 담깁니다. 센서 데이터는 Q24 투영 계수 자체가 아닙니다. FPGA가 센서 값으로 계수를 계산해 다음 영상 프레임 경계에서 적용합니다. 수동으로 자세를 설정할 때는 PYNQ 드라이버가 각도에서 Q24 계수를 만듭니다.
packet[31:0] = yaw_mrad
packet[63:32] = pitch_mrad
packet[95:64] = roll_mrad
센서 자세를 사용하는 모드의 기본 시야각은 가로 60°, 세로 45°입니다. 1280×720 출력 설정과 비트스트림의 상세 내용은 출력 코어 원본 코드에서 확인하세요.
장면 저장과 부분 갱신
20면의 타일 위치 정보와 셀 색은 RGB332 색상표를 사용합니다. 현재 BS25 코어는 셀 데이터를 DDR에 두고, 필요한 캐시 라인을 읽습니다. 팔레트와 타일 디렉터리는 BRAM에 둡니다. 창 내용의 일부가 바뀌면 Bosio 창 관리자가 현재 M=32 경로에서 BPT2 데이터를 만들고, 드라이버가 비활성 DDR 장면의 변경 타일만 수정합니다. 코어는 다음 프레임 경계에서 새 장면 주소로 전환합니다. 겹친 창도 캐시를 재사용해 영향 타일만 합성합니다. 첫 표시·형식 전환·복구 시에는 전체 snapshot을 사용합니다.
캐시 파라미터
| 파라미터 | 기본값 | 역할 |
|---|---|---|
CACHE_LINE_BYTES | 64 | DDR에서 한 번에 읽는 라인 크기 |
CACHE_BYTES | 16384 | 셀 데이터 캐시 용량: 16KiB |
CACHE_WAYS | 2 | 세트마다 저장할 수 있는 라인 수 |
이 값은 FPGA 합성 시 결정됩니다. 변경하면 비트스트림을 다시 빌드해야 합니다. M=32 타일의 1,024바이트 데이터는 64바이트 라인 16개에 해당합니다. 현재 BOSIO 연결은 AXI 32비트, 필요한 주소를 요청할 때 읽는 demand 방식이며, 타일 전체 선취는 아직 연결하지 않았습니다. DDR 저장으로 장면 용량의 BRAM 제약을 줄이지만, M=32의 합성 속도나 DDR 대역폭 문제까지 해결하는 것은 아닙니다.
드라이버 status()로 라인 크기·용량·way 수와 hit·miss·대기 클럭을 확인합니다. 새 식별값은 0x42533235입니다. BS25 캐시·레지스터 문서와 DDR 버퍼와 드라이버 사용법에 상세 내용을 정리했습니다.
출력과 설정
최신 M=32 통합 설계는 LUT 36,374개, FF 43,905개, BRAM36 50개, DSP 155개를 사용하며 100MHz 타이밍을 통과했습니다. 출력 코어 단독이 아닌 두 투영코어와 VDMA 등을 포함한 수치입니다. 자원·검증 조건을 참조하세요.
코어는 RGB24 AXI4-Stream 영상을 내보내고, HDMI 출력 타이밍은 연결된 비디오 출력 경로가 맡습니다. 출력 단계의 안티에일리어싱(AA)은 AXI-Lite 0x1c에서 켜고 임계값·강도를 설정합니다. 자세 방향은 0x20의 yaw·pitch·roll 비트로 각각 반전할 수 있습니다. 기본 AA 임계값은 24, 강도는 32입니다.
bosio_OutputCore에는 RTL, 시뮬레이션·빌드 자료, PYNQ 드라이버와 레지스터 문서가 있습니다. 통합 비트스트림과 센서 허브 연결은 bosio_SphericalWM과 FullStack에서 확인하세요.
HDMI 트리플 버퍼
HP3의 VDMA가 완성된 프레임을 교체하고 픽셀 생성이 늦으면 이전 화면을 반복합니다. 화면 버퍼는 총 8,294,400 bytes(7.91MiB)이며 PS는 초기 할당·설정을 맡습니다. 동작 중 CPU 화면 복사는 없습니다. 완료 프레임 버퍼링은 지연을 추가할 수 있고 앱 갱신 속도를 높이지는 않습니다. 생성 프레임 카운터와 HDMI native 프레임 카운터도 별개입니다.
이 구조는 픽셀 공급 지연에 대한 분리를 제공합니다. DDR 읽기 자체의 실패나 물리적 케이블·전원 문제까지 막는다는 의미는 아닙니다. scanout 설계와 정지 시험에 검증 범위가 있습니다.
화면 전체 방향
DTF1은 SW/IMU 계수를 공통으로 변환해 화면 회전·반전을 프레임 경계에 적용합니다. M=32와 두 투영코어의 캐시는 그대로이며 방향 변경에 추가 창 투영은 없습니다. API·레지스터·시야 범위를 참조하세요. 센서 yaw·pitch·roll의 부호 반전과 화면 좌우·상하 반전은 서로 다른 기능입니다.