[FPGA]

OSD 구현 방법-1

Neo Park 2014. 9. 25. 12:10

cyclone으로 osd를 구현하기에 대한 구상이 끝났다. 지금 작업하고 있는 고급형 3.0 보드는 fpga에 frame buffer역할을 해줄 sdram을 가지고 있지 않아서(4.0보드 에서는 프레임버퍼를 추가 하신다고 했다. 그러면 그래픽 기반의 osd가 가능해지고 fpga도 용량을 큰걸로 단다고 하셨으니, 더욱 흥미로워지겠다.) 그래픽 osd를 구현하기는 힘들다. 그래서 도스처럼 80*24칸의 문자 기반의 osd를 만들 생각이다. 화면이 740*240인데 여기에 가로세로 마진을 각각 50씩 주고 상하 마진을 12씩 주게되면 8*9 폰트로 80*24칸의 문자열 공간이 생긴다. cyclone에 메모리 비트가 약 8k정도가 있다. 이중에 폰트용으로 사용되는 것이 (8*9*256/8 = 2304) bytes 이고 그리고 화면 버퍼로 사용되는 것이 (80*24 = 1920) bytes이다. 그런데 요것만으로는 색상이나 깜빡임, 역상 같은 정보를 표현할 수가 없어서 attr buffer를 하나 더 만들 생각이다. 2비트는 역상과 깜빡임을 표현하고 나머지 6비트로 색상 정보를 저장하면 좋을듯 싶다.

fpga로 메모리를 구성하는 방법은 쿼터스II에 들어있는 메가펑션 위자드중 듀얼포트 램을 사용할것이다. 듀얼 포트가 먼고 하니 읽기 쓰기가 병렬로 이루질 수 있어서 fpga는 계속 읽어가면서 비디오 동기신호에 맞게 화면에 그림을 그리고 dsp인 블랙핀은 특정 주소를 fpga의 화면 버퍼에 맵핑을 해서 데이터를 써 넣어주면 되는 것이다.

아참.. 보드가 부팅되고나서 장비 초기활때 fpga로 폰트를 다운로드 해줘야 한다. 폰트는 인터넷에서 8*8 폰트를 받아다가 박스그릴때 사용하는 폰트만 8*9로 늘릴때 문제가 되니까 수정이 필요하다.

 

 

 

지난 10일간 달려온 fpga로 osd만들기를 정리해 보면

1) 비디오 신호 중 수직 & 수평 동기 신호를 분리하기
2) active 비디오 신호 영역 추출하기 - 비디오 신호가 스트림으로 흘러나오는데, 영상정보로 가득 찬것이 아니라 수직, 수평 blank 영역이 있음
3) YCbCr 컬러값 분리하기 - 사람눈은 밝기에 민감해서 밝기 정보를 중심으로 영상 정보를 표현. 영상정보에서 Y,Cb,Cr 정보의 타이밍 맞추는게 어려움.

4) 비디오 신호에서 2차원 픽셀 좌표 구하기 - ntsc의 경우에 1440*525로 구성되는데 여기서 필드와 블랭크를 구분해서 화면 x,y 픽셀 좌표를 구하는 것을 만듬
5) 점,선,면(박스) 그려보기, 프레임 cnt를 가지고 흘러가는 박스나 버튼 입력을 받아 박스를 스크롤 하게 하는 것을 예제로 만들어 봄

6) fpga의 내장 램을 사용해 폰트 다운로드 (dual port ram) - 만들어진 램에 mif란 형태의 파일로 초기값을 지정해 기본 폰트를 다운로드 시킴
7) 폰트 랜더링 엔진 만들기, 빠른 처리를 위해 동작 클럭을 높여 하는데 이때 fpga에 내장된 pll로 뻥튀기 해야함

8) 스크린 버퍼 만들기 (dual port ram)
9) 폰트와 스크린 버퍼 연동 ( row,col 단위의 좌표계 만들기)

10) 만들어진 폰트, 스크린 버퍼와 dsp간의 연결하기

지금 만든 보드는 frame buffer가 없어서 이 정도가 거의 마무리 인데, 다음 작업하는 보드는 프레임 버퍼로 16메가나 램이 달려있다.

우선 sdram 제어 신호를 내는 verilog 코드를 만들어야 하고 sdram을 여러놈이 접근을 하니 우선 순위 결정과 빠른 처리를 위해 영상처리 pipeline을 만들어야 할것 같다. opencores.org에서 CPU 구현 것을 분석해볼 참 이다. 그리고 이미 만들어진 도구를 가지고 영상처리 하는 알고리즘 시각화 & 검증을 해보야겠다.

여전히 verilog 타이밍 관련된 문제는 어렵다. 경험과 지식 모두 부족함. 겨울이 오기전에 더 깊게 파보자

 

참조 : http://www.ezdoum.com/stories.php?story=04/08/24/7064934