프로젝트 & 경진대회

차세대반도체 경진대회 회고록

htaekjung 2024. 9. 8. 14:21

 

 

개요 및 목표

2024 여름방학에 위와 같은 경진대회에 참가하였습니다.

 

먼저 저희는 디지털 회로 분야에 진로를 고민하고 있을 만큼 디지털 회로 분야에 관심이 있었는데 작년에 학교 실험 과목에서 FPGA를 사용한 경험이 있어 이를 토대로 FPGA에서 이미지를 디스플레이에 출력해보는 프로젝트를 진행하게 되었습니다.

 

사실 이번 프로젝트의 궁극적인 목표 색상 변환되는 연산과정을 Verilog로 작성해  FPGA내에서 연산을 하여 SW0, SW1, SW2에 따라 다른 이미지들이 출력되게 하는 것이었습니다. 하지만, Verilog내에서 부동 소수점 연산을 하는데에 어려움을 겪어 위와 같은 과정을 Python으로 대체하게 되었습니다.

DE1-SoC FPGA 보드

과정

이미지파일을 MIF(Memory Initialization File)이라는 메모리 블록(RAM,ROM)의 초기 데이터들이 들어있는 파일로 바꾼 뒤, Quartus에서 사용할 Verilog 코드를 작성한 다음 FPGA 보드에 입력시켜 제대로 출력되는 지 보는 프로젝트였습니다.

 

여러 이미지 파일들을 사용하고자 원본 이미지 파일과 색상변환된 이미지 파일들을 Python에서 바꿔서 이를 FPGA 보드에 입력시켜 SW0, SW1, SW2 가 켜지고 꺼질 때마다 다른 이미지들이 출력될 수 있도록 하였습니다. 

 

Block Diagram

위는 Quartus에 작성한 Verilog module을 가지고서 만든 Block Diagram입니다.

먼저 Top module인 vga에서 SW0, SW1, SW2, clk, rst_n의 input 신호로 지정하고 그 안에 pll, vga_ctrl module이 있습니다.

FPGA의 input clock은 50MHz이고 VGA 포트의 clock은 25MHz이기 때문에 pll module을 통해 주파수를 25MHz로 바꿔줘야 합니다. 또한 locked 라는 변수를 사용해 주파수 변주를 한 후에 주파수를 고정시키는 역할을 합니다.

그렇게 VGA_ctrl 모듈에 SW0,1,2에 맞춰 rom address counter를 증가시키면서 각 rom에 있는 데이터를 읽은 후 data를 vga_rgb 값에 저장하고 디스플레이에 전달합니다.

vga_ctrl에서는 수평/수직 동기 신호의 타이밍을 제어하기 위한 카운터인 cnt_hs와 cnt_vs를 통해 vga_hs, vga_vs, vga_blank_n 신호를 출력하게 되고 vga_blank_n은 유효한 이미지 데이터 구간을 표시하는 신호입니다.

이러한 신호들로 인해 Display가 제대로 출력이 됩니다.

How sync works

위에서 설명한 sync 부분에 대한 추가 설명입니다. 디스플레이에는 화면에 horizon과 vertical 부분이 있는데, pixel이 쓰여질 때는 vertical clock이 한 번 움직이면, horizon clock이 한 줄 씩 여러번 움직이면서 화면 전체를 작성합니다. hoziton clk이 한번 움직일 때 가로줄 한 줄을 쓰게되고 다음 작성할 줄로 움직이는 retrace 동작을 합니다. vertical 신호는 horizon 신호와 다르게 다음 줄이 아닌 다음 화면을 작성하기 위한 retrace 동작을 합니다. 신호의 delay와 구동 시 발생할 수 있는 오차를 줄이기 위해 여유를 두고 신호를 입력하기 위해 back porch, front porch 구간이 존재합니다. 여기 back porch, front porch, sync 부분은 화면이 출력되지 않는 blank 부분입니다. 오직 display interval 구간만 pixel이 작성됩니다.

Timing Specification Spec

Manual에 있는 위의 사진을 통해 다음과 같은 parameter들을 지정했습니다.

 

 

결과

 

이러한 방식으로 sync를 맞춰 이미지들을 다음 시연 영상과 같이 출력할 수 있었습니다.

참고로, 스위치를 안올렸을 때 원본 이미지, SW0 올릴 때 적록색맹 모드, SW1을 올릴 때 흑백모드, SW2를 올릴 때 색상 반전모드된 이미지들이 출력되게 설정하였습니다. 

 

 

 

 

교수님들 피드백

발표를 했을 때 교수님들의 질의응답 시간에 받은 피드백은 총 3가지입니다.

 

첫째, 아까 궁극적인 목표에 대해 말했다시피 포기하지 않고 verilog에서 부동소수점 연산을 구현해 FPGA 내에서 연산을 했다면 정말 좋았을 것 같다

 - 학과에서 Verilog를 배우지 않은 상태에서, 일일이 reference를 찾아보고 본사에도 메일을 보내는 등 어려운 과정을 겪었지만, 결국 구현에 성공한 것에 큰 의의를 두고 있습니다. 나중에 기회가 된다면 부족한 부분을 보완하여 더욱 완성도 높은 프로젝트를 구현하고 싶습니다.

 

두번 째, 아까 썼다시피, pll 부분에서 locked라는 변수에 대한 설명이 틀린 것 같다

- 원래는 블록다이어그램을 먼저 만들고 그에 대해 Verilog 코딩을 하는 것이라 한다. 하지만 우리는 어쩌다보니 코딩을 먼저 하고 그에 대한 블록다이어그램을 그렸는데 이 과정에서 잘못된 해석을 한 것 같습니다.


세번 째는 이미지를 파일 변환할 때 처음 이미지 파일인 jpg파일은 손실압축 방식으로 이미 데이터 값들이 손상되어 있다. 따라서 처음부터 bmp파일을 사용하여 mif파일로 변환을 했으면 더 좋았을 것 같다

- 이에 대해서는 jpg가 손실압축형식을 사용한다는 것은 알고 있었지만, 어쩔 수 없다는 생각에 jpg to bmp to mif 파일로 변환을 했습니다. 조금만 더 생각을 했다면 바꿀 수 있었을 텐데라는 아쉬움이 있습니다.

 

총평

방학 동안 약 2개월에 걸쳐 자율적으로 주제를 선정하고, 보고서를 작성한 후 발표까지 완수했습니다. 첫 경진대회였기에 부족한 점도 많았지만, 처음부터 끝까지 스스로 해결하며 진행했다는 점에서 많은 것을 배울 수 있었습니다.

 

다만, 본사에서 제공한 reference code를 일부 참조하여 프로젝트를 진행했기 때문에 모든 것을 저희가 처음부터 끝까지 개발한 것은 아니어서 아쉬움이 남습니다. 하지만 이를 통해 다음 프로젝트를 위한 기반을 마련했다는 점에서 의의를 찾고자 합니다.