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