본문 바로가기
language/Verilog

[verilog] image 입/출력 설계

by 파란하늘코더 2021. 1. 23.
반응형

입력 받은 이미지를 verilog에서 영상 신호에 맞춰 뽑아주는 module을 설계해보려 합니다

1. image RGB channel

 

우선 우리가 알고 있는 이미지는 각 위치에 R, G, B값을 가지고 있으며 application 마다 다르겠지만

 

보통 8bit의 resolution을 가지고 있습니다.

 

rgb channel 이란


2. display signal

 

우리가 쓰는 PNL에서는 아래와 같은 신호를 사용하여 PNL을 구동시킵니다

 

 

sync concept

우선 하나하나 설명 해보자면 

 

- Vsync : 영상의 frame을 표현하는 파형

- Hsync : 영상의 세로를 표현하는 파형

 

설명이 약간 부족하지만 실제로는 위의 sync신호에 margin들을 더합니다

 

위의 그림으로 표현하면 X Resolution의 길이가 실제로 영상의 가로 길이만큼 구동에 필요 시간이지만

 

양옆으로 margin 같은게 붙어있는 것을 볼수가 있는데

 

수식으로 표현하면 

 

Hsync period = X resolution active + back porch + front porch + width

 

이렇게 표현이 가능합니다.

 

그리고 구글링좀 하면 아래와 같은 이미지를 찾아 볼수가 있습니다

 

display sync

그림에서 Hsync가 active low인지 active high인지에 따라서 다르지만 설명을 해보자면

 

위에 그림에서 Dataen의 경우 실제 우리가 쓰는 가로 해상도만큼 길이가 되고

 

Hsync가 low 인 구간에서 De가 실제로 동작하도록 양옆에 porch(margin)들이 있고

 

high인 구간이 width인 구간입니다

 

Vsync는 Hsync와 동일하게 적용이 가능합니다

 

그래서 이걸 어떻게 설계를 하느냐는 아래와 같은 block diagram을 설계해서 검증하려 합니다

block diagram

 

 

그래서 이걸 좀 코드화 시키면 아래와 같이 설계가 가능합니다

sync gen 일부

그냥 간단하게 count 기반으로 vsync와 hsync를 만들고 그걸 기반으로 de를 만들면 위와 같이 나오게 됩니다

 

그걸 simulation을 돌리면 

 

 

simulation 결과

이렇게 됩니다


3. image input/output

 

참고로 python을 이용해서 image를 hex로 변환하는 로직은 아래와 같이 설계를 했습니다

python hex gen

 

그래서 이걸 출력을 하면 아래와 같이 data가 출력이 되는데

hex result

이걸 verilog에서 받아주려면 아래와 같이 설계하고 

image read

이것이 제대로 들어갔는지 확인하는 block은 아래와 같이 설계하면 됩니다

image write


4. simulration 결과

그래서 출력을 하면 아래와 같이 나오는데

 

내가 simulation을 끝까지 돌리지 않아서 영상을 쓰고 있는중에 멈춰진 것이 그림에서 확인가능힙니다(빨간점)

 

(예전 블로그에서 정리했던 것들 다시 가다듬으면서 올리는 中)

 

댓글