03.11.2014 Views

VHDL 프로그래밍

VHDL 프로그래밍

VHDL 프로그래밍

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>VHDL</strong> 프로그래밍<br />

14. 고급영상회로설계<br />

한동일<br />

학습 목표<br />

• 영상 포맷을 이해한다.<br />

• 파일 입출력 기능을 이해한다.<br />

• 원하는 형태와 포맷으로 파일을 입출력할 수 있다.<br />

• 시뮬레이터의 부가 기능을 활용할 수 있다.<br />

• 영상 회로의 설계 표현과 논리 합성 결과의 상관관<br />

계를 이해한다.<br />

• 게이트를 최소화 할 수 있는 설계 방법을 파악한다.<br />

• 다양한 영상 회로 설계 문제를 <strong>VHDL</strong> 설계 문제로<br />

변환할 수 있다.<br />

• 효과적인 검증 환경을 이용하여 완성도 높은 설계<br />

를 할 수 있다.<br />

2/55


영상 파일의 입출력<br />

• 영상 회로의 일반적인 검증 환경<br />

• 카메라<br />

• 카메라 동기 신호 생성부<br />

• 파일 입력문으로 영상 파일 입력<br />

• 디스플레이<br />

• 디스플레이 장치 동기 신호 생성부<br />

• 파일 출력문으로 영상 생성<br />

• image viewer를 이용한 각 프레임별 검증<br />

• 영상 처리부<br />

• 일반적인 고급 디지털 회로 설계 기법 사용<br />

• FIFO, RAM, ROM, SDRAM 등의 메모리 인터페이스 필요<br />

3/55<br />

영상 파일의 입출력<br />

• 영상 회로의 일반적인 검증 환경<br />

image<br />

image<br />

Sync sync Image<br />

Image<br />

Generator Read sync Processing sync<br />

Image<br />

Write<br />

Clock<br />

Reset<br />

Generator<br />

rst_n<br />

clk<br />

Input<br />

File<br />

Control<br />

Signals<br />

Output<br />

File<br />

4/55


영상 파일의 입출력<br />

• 클럭 신호 생성부의 <strong>VHDL</strong> 구현<br />

library IEEE;<br />

use IEEE.STD_LOGIC_1164.all;<br />

entity clk_rst_gen is<br />

port ( reset_disp_n : out std_logic;<br />

dispclk : out std_logic);<br />

end;<br />

architecture clk_rst_gen of clk_rst_gen is<br />

constant HALF_PERIOD_25M : time := 20 ns ;<br />

begin<br />

reset_disp_n


영상 파일의 입출력<br />

• 동기 신호 패턴 정보의 <strong>VHDL</strong> 구현<br />

-- Galaxy S timing information<br />

constant HTOTAL_WIDTH : integer := 500 ;<br />

constant HSYNC_WIDTH : integer := 5;<br />

constant HSYNC_BACK_PORCH : integer := 14 ;<br />

constant HBP_PLUS_ACTIVE PLUS : integer := 494 ;<br />

constant VTOTAL_WIDTH : integer := 820 ;<br />

constant VSYNC_WIDTH : integer := 5;<br />

constant VSYNC_BACK_PORCH : integer := 8 ;<br />

constant VBP_PLUS_ACTIVE PLUS : integer := 808 ;<br />

7/55<br />

영상 파일의 입출력<br />

• 수평 동기 신호 생성 – 수평 카운터 신호 생성<br />

pcounter_gen: process (dispclk, reset_disp_n)<br />

begin<br />

if (reset_disp_n='0') then<br />

pcounter


영상 파일의 입출력<br />

• 수평 동기 신호 생성<br />

hsync_n_gen: process (dispclk, reset_disp_n)<br />

begin<br />

if (reset_disp_n='0') then<br />

s_hsync_n


영상 파일의 입출력<br />

• 수직 동기 신호 생성 – 수직 카운터 신호 생성<br />

hcounter_gen: process (dispclk, reset_disp_n)<br />

begin<br />

if (reset_disp_n='0') then<br />

hcounter


영상 파일의 입출력<br />

• 수직 동기 신호 생성 – 수직 유효 구간 생성<br />

vactive_gen: process (dispclk, reset_disp_n)<br />

begin<br />

if (reset_disp_n='0') then<br />

s_vactive


영상 파일의 입출력<br />

• PNM(Portable Anymap Format) 영상 포맷<br />

• PNM 파일 해더부 양식<br />

해더부 내용<br />

Magic number<br />

Image width<br />

Image height<br />

max<br />

설명<br />

PNM 파일의 종류와 영상 데이터 저장 방식 설명<br />

영상의 가로 폭 정보를 정수 형태로 표현<br />

영상의 세로 높이 정보를 정수 형태로 표현<br />

각 영상 채널 내에 존재하는 컬러나 흑백 표현값의 최대치<br />

# 주석 정보 추가 시 사용<br />

• 해더부는 ASCII 코드 형태로 표시<br />

• 해더부 내 각각의 정보는 여백 문자로 분리<br />

• blanks, tabs, line feeds, carriage returns<br />

15/55<br />

영상 파일의 입출력<br />

• PNM(Portable Anymap Format) 영상 포맷<br />

• PNM 파일 해더부의 magic number<br />

• 2바이트를 이용하여 PNM 파일의 종류를 구분<br />

Format ASCII Raw Data<br />

PBM P1 P4<br />

PGM P2 P5<br />

PPM P3 P6<br />

• Magic Number<br />

• P1 ~ P3 : 영상 부분이 ASCII<br />

• P4 ~ P6 : 영상 부분이 raw data<br />

16/55


영상 파일의 입출력<br />

• PNM 파일의 Raw Data 영상 저장 포맷<br />

PBM<br />

pixel0<br />

pixel1 pppppppp<br />

pixel2<br />

pixel3<br />

pixel4<br />

pixel5<br />

pixel6<br />

pixel7<br />

pixel8<br />

…<br />

…<br />

PGM<br />

Gray 0 Gray 1 Gray 2 Gray 3<br />

…<br />

PPM<br />

Red 0 Green 0 Blue 0 Red 1<br />

…<br />

17/55<br />

영상 파일의 입출력<br />

• chessboard.pbm b 파일 내용 및 결과 영상<br />

P1<br />

# PBM Sample Image : Chessboard<br />

88<br />

8<br />

0 1 0 1 0 1 0 1<br />

10101010<br />

1 0 1 0 1 0<br />

0 1 0 1 0 1 0 1<br />

10101010<br />

1 0 1 0 1 0<br />

0 1 0 1 0 1 0 1<br />

10101010<br />

1 0 1 0 1 0<br />

0 1 0 1 0 1 0 1<br />

10101010<br />

1 0 1 0 1 0<br />

18/55


영상 파일의 입출력<br />

• vhdl.pgm 파일 내용<br />

P2<br />

# PGM Sample Image : <strong>VHDL</strong><br />

25 9<br />

255<br />

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />

0 32 0 0 0 32 0 64 0 0 0 64 0 128 128 128 128 0 0 255 0 0 0 0 0<br />

0 32 0 0 0 32 0 64 0 0 0 64 0 0 128 0 0 128 0 255 0 0 0 0 0<br />

0 32 0 0 0 32 0 64 0 0 0 64 0 0 128 0 0 128 0 255 0 0 0 0 0<br />

0 32 0 0 0 32 0 64 64 64 64 64 0 0 128 0 0 128 0 255 0 0 0 0 0<br />

0 32 0 0 0 32 0 64 0 0 0 64 0 0 128 0 0 128 0 255 0 0 0 0 0<br />

0 0 32 0 32 0 0 64 0 0 0 64 0 0 128 0 0 128 0 255 0 0 0 0 0<br />

0 0 0 32 0 0 0 64 0 0 0 64 0 128 128 128 128 0 0 255 255 255 255 255 0<br />

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />

19/55<br />

영상 파일의 입출력<br />

• vhdl.pgm 파일 결과 영상<br />

20/55


영상 파일의 입출력<br />

• color.ppm 파일 내용 및 결과 영상<br />

P3<br />

3 3<br />

255<br />

0 0 0<br />

128 128 128<br />

255 255 255<br />

255 0 0<br />

0 255 0<br />

0 0 255<br />

0 255 255<br />

255 0 255<br />

255 255 0<br />

21/55<br />

영상 파일의 입출력<br />

• 영상 파일의 입력<br />

library ieee;<br />

use ieee.std_logic_1164.all i ll ;<br />

use ieee.std_logic_arith.all ;<br />

use ieee.std_logic_unsigned.all;<br />

use std.textio.all;<br />

architecture simulation of ppm_image_read is<br />

constant BLACK_INT : integer := 16 ;<br />

constant BV : std_logic_vector (7 downto 0) := "00001000";<br />

begin<br />

process (dispclk, reset_disp_n)<br />

file INFILE_IMG : text open read_mode is "buildings.txt";<br />

variable img_val : line;<br />

variable rvalue, gvalue, bvalue : integer range 0 to 255;<br />

begin<br />

-- 중략<br />

22/55


영상 파일의 입출력<br />

• 영상 파일의 입력 - 계속<br />

if hactive='1' and vactive='1' then<br />

if not (endfile(INFILE_IMG)) then<br />

readline(INFILE_IMG, img_val);<br />

read(img_val, rvalue);<br />

read(img_val, gvalue);<br />

read(img_val, bvalue);<br />

end if;<br />

pir_rimg rimg


영상 파일의 입출력<br />

• 영상 파일의 출력 - 계속<br />

begin<br />

procedure writeHeader (file F : text; Width, Height : in integer) is<br />

variable L : line;<br />

begin<br />

write(L, string'("P3"));-- magic number<br />

writeline(F, L);<br />

write(L, string'("# Creadted through <strong>VHDL</strong> simulation"));<br />

writeline(F, L);<br />

write(L, Width);<br />

write(L, string'(""));<br />

write(L, Height);<br />

writeline(F, L);<br />

write(L, string'("255"));<br />

writeline(F, L);<br />

end writeHeader;<br />

25/55<br />

영상 파일의 입출력<br />

• 영상 파일의 출력 - 계속<br />

end ;<br />

write_output : process (dispclk)<br />

variable tmp_r, tmp_g, tmp_b: integer;<br />

variable time_zero : std_logic := '0';<br />

begin<br />

if (time_zero = '0') then<br />

writeHeader(OUT_IMG, H_WIHTH, V_HEIGHT);<br />

time_zero := '1';<br />

elsif ( dispclk'event and dispclk = '1') then<br />

if ( hactive_ip = '1' and vactive_ip = '1') then<br />

end if;<br />

end if;<br />

end process write_output;<br />

tmp_ r := conv_ integer(unsigned(ip g ( p_ rimg));<br />

tmp_g := conv_integer(unsigned(ip_gimg));<br />

tmp_b := conv_integer(unsigned(ip_bimg));<br />

writeRGB(OUT_IMG, tmp_r, tmp_g, tmp_b);<br />

26/55


영상 파일의 입출력<br />

• 입력 및 출력 영상 예<br />

입력 영상<br />

27/55<br />

출력 영상<br />

영상 파일의 입출력<br />

• 영상 파일 입출력 시뮬레이션 파형 예<br />

28/55


패턴 생성기의 설계<br />

• 대표적인 테스트 패턴 예<br />

일반 영상 Full White Full Black<br />

Full Red Full Green Full Blue<br />

29/55<br />

패턴 생성기의 설계<br />

• 대표적인 테스트 패턴 예<br />

YB Bars EIA Color Bars SMPTE Bars<br />

Cross Cross Hatch White Window<br />

30/55


패턴 생성기의 설계<br />

• YB<br />

Bar 생성 데이터<br />

Linear RGB<br />

R 255 218 183 146 109 72 36 0<br />

G 255 218 183 146 109 72 36 0<br />

B 255 218 183 146 109 72 36 0<br />

YCbCr<br />

Y 240 208 176 144 112 80 48 16<br />

Cb 128 128 128 128 128 128 128 128<br />

Cr 128 128 128 128 128 128 128 128<br />

좌표 0~100 ~200 ~300 ~400 ~500 ~600 ~700 ~800<br />

R 255 218 183 146 109 72 36 0<br />

G 255 218 183 146 109 72 36 0<br />

B 255 218 183 146 109 72 36 0<br />

31/55<br />

패턴 생성기의 설계<br />

• EIA Color Bar 생성 데이터<br />

white yellow cyan green magenta red blue black<br />

Linear RGB<br />

R 255 255 0 0 255 255 0 0<br />

G 255 255 255 255 0 0 0 0<br />

B 255 0 255 0 255 0 255 0<br />

YCbCr<br />

Y 235 210 170 145 106 81 41 16<br />

Cb 128 16 166 54 202 90 240 128<br />

Cr 128 146 16 34 202 240 110 128<br />

좌표 0~114 ~228 ~343 ~457 ~571 ~686 ~800<br />

R 255 255 0 0 255 255 0<br />

G 255 255 255 255 0 0 0<br />

B 255 0 255 0 255 0 255<br />

32/55


패턴 생성기의 설계<br />

• YB<br />

Bar 생성부<br />

-- 중략<br />

-- image signal interface<br />

image_gen gen :<br />

process(dispclk)<br />

begin<br />

if (dispclk='1' and dispclk'event) then<br />

if vactive_pir='1' then<br />

if hactive_fpulse<br />

='1' then<br />

hcounter


색좌표 변환기의 설계<br />

• 색좌표(Color Space)<br />

• 색의 수학적인 표현 방법<br />

• RGB Color Space<br />

• 컴퓨터 그래픽 및 디스플레이 용도<br />

• YIQ, YUV, YCbCr Color Space<br />

• 영상의 압축, 복원, 처리 용도<br />

• CMYK Color Space<br />

• 컬러 출판에 사용됨<br />

• HIS(Hue, Saturation, Intensity) Color Space<br />

• 인간의 컬러 인지 특성 모델링에 사용됨<br />

35/55<br />

색좌표 변환기의 설계<br />

• RGB와 YCbCr 색좌표 변환 관계 예<br />

Y = 0.257R + 0.504G + 0.098B 098B + 16<br />

Cb = -0.148R - 0.291G + 0.439B + 128<br />

Cr = 0.439R - 0.368G - 0.071B 071B + 128<br />

R = 1.164(Y-16) + 1.596(Cr-128)<br />

G = 1.164(Y-16) - 0.813(Cr-128) - 0.391(Cb-128)<br />

B = 1.164(Y-16) +2.018(Cb-128)<br />

36/55


색좌표 변환기의 설계<br />

• 색좌표 변환기의 전체 구조도<br />

image<br />

image<br />

image<br />

Image<br />

Read<br />

sync<br />

RGB to<br />

YCbCr<br />

Conversion<br />

sync<br />

YCbCr to<br />

RGB<br />

Conversion<br />

sync<br />

Image<br />

Write<br />

Input Image Output<br />

File<br />

Write<br />

Output<br />

File<br />

File<br />

37/55<br />

색좌표 변환기의 설계<br />

• YCbCr 색좌표 변환식<br />

Y = 0.257R + 0.504G + 0.098B + 16<br />

Cb = -0.148R - 0.291G + 0.439B + 128<br />

Cr = 0.439R - 0.368G - 0.071B + 128<br />

• YCbCr 색좌표 변환식의 구현 예 – compile error<br />

signal R : std_logic_vector (7 downto 0);<br />

signal lG : std_logic_vector (7downto 0);<br />

signal B : std_logic_vector (7 downto 0);<br />

signal Y : std_logic_vector (7 downto 0);<br />

signal Cb : std_logic_vector (7 downto 0);<br />

signal Cr : std_logic_vector (7 downto 0);<br />

-- 중략<br />

Y


색좌표 변환기의 설계<br />

• YCbCr 색좌표 변환식의 구현 예<br />

• 논리 합성 불가<br />

signal R : integer range 0 to 255;<br />

signal G : integer range 0 to 255;<br />

signal B : integer range 0 to 255;<br />

signal Y : integer range 0 to 255;<br />

signal Cb : integer range 0 to 255;<br />

signal Cr : integer range 0 to 255;<br />

-- 중략<br />

Y


색좌표 변환기의 설계<br />

• YCbCr 색좌표 변환식의 구현 예 – 연산 오차의 누적<br />

입력 영상 데이터<br />

역변환을 통해 얻은 원영상 데이터<br />

41/55<br />

색좌표 변환기의 설계<br />

• YCbCr 색좌표 변환식의 구현 예<br />

• 논리 합성 가능<br />

• C와 동일 결과<br />

signal R : integer range 0 to 255;<br />

signal G : integer range 0 to 255;<br />

signal B : integer range 0 to 255;<br />

signal Y : integer range 0 to 255;<br />

signal Cb : integer range 0 to 255;<br />

signal Cr : integer range 0 to 255;<br />

-- 중략<br />

Y


색좌표 변환기의 설계<br />

• YCbCr 색좌표 변환식의 구현 예 – C와 동일 결과<br />

입력 영상 데이터<br />

역변환을 통해 얻은 원영상 데이터<br />

43/55<br />

색좌표 변환기의 설계<br />

• 색좌표 변환 결과 예<br />

원영상 YCbCr 영상 색변환 결과 영상<br />

44/55


색좌표 변환기의 설계<br />

• 색변환 시뮬레이션 파형 예<br />

45/55<br />

MCT 변환기의 설계<br />

• MCT(Modified d Census Transform) 변환<br />

• 영상 내의 구조적인 특징을 추출하는 방법<br />

• 밝기 변화나 조명에 의한 영향을 최소화하면서 영상 내<br />

의 정보를 추출하는 기법<br />

• MCT 변환의 정의<br />

46/55


MCT 변환기의 설계<br />

• MCT 변환 예<br />

W(X)<br />

10 20 30<br />

40 0 60<br />

70 80 90<br />

MCT<br />

0 0 0 000001111<br />

(=15)<br />

0 0 1<br />

1 1 1<br />

Γ(X)<br />

- - -<br />

- 15 -<br />

- - -<br />

0 40 20<br />

70 90 80<br />

MCT<br />

0 0 0<br />

1 1 1<br />

000111100<br />

(=60)<br />

- - -<br />

- 60 -<br />

60 10 30 1 0 0<br />

- - -<br />

47/55<br />

MCT 변환기의 설계<br />

• MCT 계산 슈도 코드<br />

• 기본 알고리즘에 /9 사용<br />

• 논리 합성을 위해서는 근사화, 혹은 최적화 필요<br />

data_mean = (m1+m2+m3+m4+m5+m6+m7+m8+m9)/9; -- 논리 합성 불가<br />

if (m1 > data_mean) mct1 = 1;<br />

else mct1 = 0;<br />

if (m2 > data_ mean) mct2 = 1;<br />

else mct2 = 0;<br />

// ...<br />

// 중략<br />

MCT = (mct1


MCT 변환기의 설계<br />

• 근사화 방법<br />

• 1/9 = 1 * (256/256) /9 = 1 * (256/9) / 256 ≈ 28 / 256<br />

-- 근사화 이전<br />

data_mean = (m1+m2+m3+m4+m5+m6+m7+m8+m9)/9; -- 논리 합성 불가<br />

-- 근사화 이후<br />

data_mean = 28 * (m1+m2+m3+m4+m5+m6+m7+m8+m9) / 256;<br />

• 최적 해법<br />

• /9 대신 이항해서 *9 사용<br />

-- 근사화 이전<br />

data_mean = (m1+m2+m3+m4+m5+m6+m7+m8+m9)/9; -- 논리 합성 불가<br />

-- 근사화 이후<br />

data_sum = 9 * data_mean = (m1+m2+m3+m4+m5+m6+m7+m8+m9);<br />

49/55<br />

MCT 변환기의 설계<br />

• <strong>VHDL</strong> 설계를 위한 최적 MCT 계산 슈도 코드<br />

data_sum = (m1+m2+m3+m4+m5+m6+m7+m8+m9);<br />

if (9 * m1 > data_ sum) mct1 = 1;<br />

else mct1 = 0;<br />

if (9 * m2 > data_sum) mct2 = 1;<br />

else mct2 = 0;<br />

// ...<br />

// 중략<br />

MCT = (mct1


MCT 변환기의 설계<br />

• MCT 변환 예<br />

51/55<br />

MCT 변환기의 설계<br />

• MCT 변환기의 구조도<br />

image<br />

Y image<br />

MCT<br />

image<br />

Image<br />

Read<br />

sync<br />

RGB to<br />

YCbCr<br />

Conversion<br />

sync<br />

MCT<br />

Generator<br />

sync<br />

Image<br />

Write<br />

Input<br />

Yi image Output<br />

Output<br />

File<br />

Write<br />

File<br />

File<br />

52/55


MCT 변환기의 설계<br />

• 33윈도우의 3x3 구현<br />

Y<br />

image<br />

F/F F/F<br />

Line Memory(480x8) F/F F/F MCT<br />

Calculator<br />

Line Memory(480x8) F/F F/F<br />

MCT<br />

Image<br />

Window Generator(3x3)<br />

53/55<br />

MCT 변환기의 설계<br />

• MCT 변환 결과 예<br />

원영상 Y 영상 MCT 결과 영상<br />

54/55


MCT 변환기의 설계<br />

• MCT 변환 시뮬레이션 파형 예<br />

55/55

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!