VHDL 프로그래밍 14. 고급영상회로설계 한동일 학습목표 영상포맷을이해한다. 파일입출력기능을이해한다. 원하는형태와포맷으로파일을입출력할수있다. 시뮬레이터의부가기능을활용할수있다. 영상회로의설계표현과논리합성결과의상관관계를이해한다. 게이트를최소화할수있는설계방법을파악한다. 다양한영상회로설계문제를 VHDL 설계문제로변환할수있다. 효과적인검증환경을이용하여완성도높은설계를할수있다. 2/55
영상파일의입출력 영상회로의일반적인검증환경 카메라 카메라동기신호생성부 파일입력문으로영상파일입력 디스플레이 디스플레이장치동기신호생성부 파일출력문으로영상생성 image viewer 를이용한각프레임별검증 영상처리부 일반적인고급디지털회로설계기법사용 FIFO, RAM, ROM, SDRAM 등의메모리인터페이스필요 3/55 영상파일의입출력 영상회로의일반적인검증환경 image image Sync sync Image Image Generator Read sync Processing sync Image Write Clock Reset Generator rst_n clk Input File Control Signals Output File 4/55
영상파일의입출력 클럭신호생성부의 VHDL 구현 library IEEE; use IEEE.STD_LOGIC_1164.all; entity clk_rst_gen is port ( reset_disp_n : out std_logic; dispclk : out std_logic); end; architecture clk_rst_gen of clk_rst_gen is constant HALF_PERIOD_25M : time := 20 ns ; reset_disp_n <= '0','1'after 60 ns ; dispclk_gen : process while (true) loop dispclk <='0' ; wait for HALF_PERIOD_25M ; dispclk <= '1' ; wait for HALF_PERIOD_25M ; end loop; end process; end; 5/55 영상파일의입출력 일반적인동기신호패턴 6/55
영상파일의입출력 동기신호패턴정보의 VHDL 구현 -- Galaxy S timing information constant HTOTAL_WIDTH : integer := 500 ; constant HSYNC_WIDTH : integer := 5; constant HSYNC_BACK_PORCH : integer := 14 ; constant HBP_PLUS_ACTIVE PLUS : integer := 494 ; constant VTOTAL_WIDTH : integer := 820 ; constant VSYNC_WIDTH : integer := 5; constant VSYNC_BACK_PORCH : integer := 8 ; constant VBP_PLUS_ACTIVE PLUS : integer := 808 ; 7/55 영상파일의입출력 수평동기신호생성 수평카운터신호생성 pcounter_gen: process (dispclk, reset_disp_n) if (reset_disp_n='0') then pcounter <= 0; elsif (dispclk='1' and dispclk'event) then end process; if (pcounter= HTOTAL_WIDTH-1) then pcounter <= 0; else pcounter <= pcounter + 1; 8/55
영상파일의입출력 수평동기신호생성 hsync_n_gen: process (dispclk, reset_disp_n) if (reset_disp_n='0') then s_hsync_n <= '0'; elsif (dispclk='1' and dispclk'event) then end process; if (pcounter < HSYNC_WIDTH) then s_hsync_n <= '0'; else s_hsync_n <= '1'; 9/55 영상파일의입출력 수평동기신호생성 수평유효구간생성 hactive_gen: process (dispclk, reset_disp_n) if (reset_disp_n='0') then s_hactive <= '0'; elsif (dispclk='1' and dispclk'event) then end process; if (pcounter=hsync_back_porch) then s_hactive <= '1'; elsif (pcounter=hbp_plus_active) then s_hactive <= '0'; 10/55
영상파일의입출력 수직동기신호생성 수직카운터신호생성 hcounter_gen: process (dispclk, reset_disp_n) if (reset_disp_n='0') then hcounter <= 0; elsif (dispclk='1' and dispclk'event) then if (pcounter = HTOTAL_ WIDTH-1) then if (hcounter= VTOTAL_WIDTH-1) then hcounter <= 0 ; else hcounter <= hcounter + 1; end process; 11/55 영상파일의입출력 수직동기신호생성 vsync_n_gen: process (dispclk, reset_disp_n) if (reset_disp_n='0') then s_vsync_n <= '0'; elsif (dispclk='1' and dispclk'event) then end process; if (hcounter < VSYNC_WIDTH) then s_vsync_n <= '0'; else s_vsync_n <= '1'; 12/55
영상파일의입출력 수직동기신호생성 수직유효구간생성 vactive_gen: process (dispclk, reset_disp_n) if (reset_disp_n='0') then s_vactive <= '0'; elsif (dispclk='1' and dispclk'event) then end process; if (hcounter = VSYNC_BACK_PORCH) then s_vactive <= '1'; elsif (hcounter= VBP_PLUS_ACTIVE) then s_vactive <= '0'; 13/55 영상파일의입출력 PNM(Portable Anymap Format) 영상포맷 무압축영상포맷 VHDL 시뮬레이션에최적 카메라입력영상모델링 디스플레이출력영상모델링 PNM 파일종류 PPM(Portable Pixmap Format) : 컬러영상표현 PGM(Portable Graymap Format) : 계조영상 (gray-level image) 표현 PBM(Portable Bitmap Format) : 이진영상 (binary image) 표현 PNM 파일내용 영상해더부 : 영상의포맷을정의 영상데이터부 : 무압축방식, 영상해더부에의해영상데이터구조결정 14/55
영상파일의입출력 PNM(Portable Anymap Format) 영상포맷 PNM 파일해더부양식 해더부내용 Magic number Image width Image height max 설명 PNM 파일의종류와영상데이터저장방식설명영상의가로폭정보를정수형태로표현영상의세로높이정보를정수형태로표현각영상채널내에존재하는컬러나흑백표현값의최대치 # 주석정보추가시사용 해더부는 ASCII 코드형태로표시 해더부내각각의정보는여백문자로분리 blanks, tabs, line feeds, carriage returns 15/55 영상파일의입출력 PNM(Portable Anymap Format) 영상포맷 PNM 파일해더부의 magic number 2 바이트를이용하여 PNM 파일의종류를구분 Format ASCII Raw Data PBM P1 P4 PGM P2 P5 PPM P3 P6 Magic Number P1 ~ P3 : 영상부분이 ASCII P4 ~ P6 : 영상부분이 raw data 16/55
영상파일의입출력 PNM 파일의 Raw Data 영상저장포맷 PBM pixel0 pixel1 pp pixel2 pixel3 pixel4 pp pixel5 pixel6 pixel7 pp pixel8 PGM Gray 0 Gray 1 Gray 2 Gray 3 PPM Red 0 Green 0 Blue 0 Red 1 17/55 영상파일의입출력 chessboard.pbm b 파일내용및결과영상 P1 # PBM Sample Image : Chessboard 88 8 0 1 0 1 0 1 0 1 10101010 1 0 1 0 1 0 0 1 0 1 0 1 0 1 10101010 1 0 1 0 1 0 0 1 0 1 0 1 0 1 10101010 1 0 1 0 1 0 0 1 0 1 0 1 0 1 10101010 1 0 1 0 1 0 18/55
영상파일의입출력 vhdl.pgm 파일내용 P2 # PGM Sample Image : VHDL 25 9 255 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 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 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 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 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 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 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 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 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 19/55 영상파일의입출력 vhdl.pgm 파일결과영상 20/55
영상파일의입출력 color.ppm 파일내용및결과영상 P3 3 3 255 0 0 0 128 128 128 255 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 0 255 255 255 0 21/55 영상파일의입출력 영상파일의입력 library ieee; use ieee.std_logic_1164.all i ll ; use ieee.std_logic_arith.all ; use ieee.std_logic_unsigned.all; use std.textio.all; architecture simulation of ppm_image_read is constant BLACK_INT : integer := 16 ; constant BV : std_logic_vector (7 downto 0) := "00001000"; process (dispclk, reset_disp_n) file INFILE_IMG : text open read_mode is "buildings.txt"; variable img_val : line; variable rvalue, gvalue, bvalue : integer range 0 to 255; -- 중략 22/55
영상파일의입출력 영상파일의입력 - 계속 if hactive='1' and vactive='1' then if not (endfile(infile_img)) then readline(infile_img, img_val); read(img_val, rvalue); read(img_val, gvalue); read(img_val, bvalue); pir_rimg rimg <= conv_std_logic_vector(rvalue,8); vector(rvalue pir_gimg <= conv_std_logic_vector (gvalue,8); pir_bimg <= conv_std_logic_vector (bvalue,8); else pir_rimg <= BV; pir_gimg <= BV; pir_bimg <= BV; 23/55 영상파일의입출력 영상파일의출력 architecture simulation of ppm_image_write is file OUT_IMG : text open write_mode is "buildings_negative.ppm"; constant H_WIHTH : integer := 480; constant V_HEIGHT : integer := 800; procedure writergb (file F: text; R, G, B: in integer) is variable L : line; write(l, R, RIGHT, 3); write(l, string'(" ")); write(l, G, RIGHT, 3); write(l, string'(" ")); write(l, B, RIGHT, 3); writeline(f, L); end writergb; 24/55
영상파일의입출력 영상파일의출력 - 계속 procedure writeheader (file F : text; Width, Height : in integer) is variable L : line; write(l, string'("p3"));-- magic number writeline(f, L); write(l, string'("# Creadted through VHDL simulation")); writeline(f, L); write(l, Width); write(l, string'("")); write(l, Height); writeline(f, L); write(l, string'("255")); writeline(f, L); end writeheader; 25/55 영상파일의입출력 영상파일의출력 - 계속 end ; write_output : process (dispclk) variable tmp_r, tmp_g, tmp_b: integer; variable time_zero : std_logic := '0'; if (time_zero = '0') then writeheader(out_img, H_WIHTH, V_HEIGHT); time_zero := '1'; elsif ( dispclk'event and dispclk = '1') then if ( hactive_ip = '1' and vactive_ip = '1') then end process write_output; tmp_ r := conv_ integer(unsigned(ip g ( p_ rimg)); tmp_g := conv_integer(unsigned(ip_gimg)); tmp_b := conv_integer(unsigned(ip_bimg)); writergb(out_img, tmp_r, tmp_g, tmp_b); 26/55
영상파일의입출력 입력및출력영상예 입력영상 27/55 출력영상 영상파일의입출력 영상파일입출력시뮬레이션파형예 28/55
패턴생성기의설계 대표적인테스트패턴예 일반영상 Full White Full Black Full Red Full Green Full Blue 29/55 패턴생성기의설계 대표적인테스트패턴예 Y Bars EIA Color Bars SMPTE Bars Cross Cross Hatch White Window 30/55
패턴생성기의설계 YB Bar 생성데이터 Linear RGB R 255 218 183 146 109 72 36 0 G 255 218 183 146 109 72 36 0 B 255 218 183 146 109 72 36 0 YCbCr Y 240 208 176 144 112 80 48 16 Cb 128 128 128 128 128 128 128 128 Cr 128 128 128 128 128 128 128 128 좌표 0~100 ~200 ~300 ~400 ~500 ~600 ~700 ~800 R 255 218 183 146 109 72 36 0 G 255 218 183 146 109 72 36 0 B 255 218 183 146 109 72 36 0 31/55 패턴생성기의설계 EIA Color Bar 생성데이터 white yellow cyan green magenta red blue black Linear RGB R 255 255 0 0 255 255 0 0 G 255 255 255 255 0 0 0 0 B 255 0 255 0 255 0 255 0 YCbCr Y 235 210 170 145 106 81 41 16 Cb 128 16 166 54 202 90 240 128 Cr 128 146 16 34 202 240 110 128 좌표 0~114 ~228 ~343 ~457 ~571 ~686 ~800 R 255 255 0 0 255 255 0 G 255 255 255 255 0 0 0 B 255 0 255 0 255 0 255 32/55
패턴생성기의설계 YB Bar 생성부 -- 중략 -- image signal interface image_gen gen : process(dispclk) if (dispclk='1' and dispclk'event) then if vactive_pir='1' then if hactive_fpulse ='1' then hcounter <= (hcounter + 1) mod 1024; else hcounter <= 0; 33/55 패턴생성기의설계 YB Bar 생성부 if hactive_pir='1' and vactive_pir='1' then if hcounter < GRAY7_POS then ip_rimg <= WHITE; ip_gimg <= WHITE; ip_bimg <= WHITE; elsif lifhcounter <GRAY6_POS POSthen ip_rimg <= GRAY6; ip_gimg <= GRAY6;ip_bimg <= GRAY6; -- 중략 elsif hcounter < GRAY1_POS then ip_rimg <= GRAY1; ip_gimg <= GRAY1; ip_bimg <= GRAY1; else ip_rimg <= BLACK; ip_gimg <= BLACK; ip_bimg <= BLACK; else -- can be deleted for internal use or simulation only. ip_rimg <= BLACK; ip_gimg <= BLACK;ip_bimg <= BLACK; end process; 34/55
색좌표변환기의설계 색좌표 (Color Space) 색의수학적인표현방법 RGB Color Space 컴퓨터그래픽및디스플레이용도 YIQ, YUV, YCbCr Color Space 영상의압축, 복원, 처리용도 CMYK Color Space 컬러출판에사용됨 HIS(Hue, Saturation, Intensity) Color Space 인간의컬러인지특성모델링에사용됨 35/55 색좌표변환기의설계 RGB 와 YCbCr 색좌표변환관계예 Y = 0.257R + 0.504G + 0.098B 098B + 16 Cb = -0.148R - 0.291G + 0.439B + 128 Cr = 0.439R - 0.368G - 0.071B 071B + 128 R = 1.164(Y-16) + 1.596(Cr-128) G = 1.164(Y-16) - 0.813(Cr-128) - 0.391(Cb-128) B = 1.164(Y-16) +2.018(Cb-128) 36/55
색좌표변환기의설계 색좌표변환기의전체구조도 image image image Image Read sync RGB to YCbCr Conversion sync YCbCr to RGB Conversion sync Image Write Input Image Output File Write Output File File 37/55 색좌표변환기의설계 YCbCr 색좌표변환식 Y = 0.257R + 0.504G + 0.098B + 16 Cb = -0.148R - 0.291G + 0.439B + 128 Cr = 0.439R - 0.368G - 0.071B + 128 YCbCr 색좌표변환식의구현예 compile error signal R : std_logic_vector (7 downto 0); signal lg : std_logic_vector (7downto 0); signal B : std_logic_vector (7 downto 0); signal Y : std_logic_vector (7 downto 0); signal Cb : std_logic_vector (7 downto 0); signal Cr : std_logic_vector (7 downto 0); -- 중략 Y <= 0.257*R + 0.504*G + 0.098*B + 16; Cb <= -0.148*R - 0.291*G + 0.439*B + 128; Cr <= 0.439*R - 0.368*G - 0.071*B + 128; 38/55
색좌표변환기의설계 YCbCr 색좌표변환식의구현예 논리합성불가 signal R : integer range 0 to 255; signal G : integer range 0 to 255; signal B : integer range 0 to 255; signal Y : integer range 0 to 255; signal Cb : integer range 0 to 255; signal Cr : integer range 0 to 255; -- 중략 Y <= 257*R/1000 + 504*G/1000 + 98*B/1000 + 16; Cb <= -148*R/1000-291*G/1000 + 439*B/1000 + 128; Cr <= 439*R/1000-368*G/1000-71*B/1000 + 128; 39/55 색좌표변환기의설계 YCbCr 색좌표변환식의구현예 논리합성가능 연산오차의누적발생 signal R : integer range 0 to 255; signal G : integer range 0 to 255; signal B : integer range 0 to 255; signal Y : integer range 0 to 255; signal Cb : integer range 0 to 255; signal Cr : integer range 0 to 255; -- 중략 Y <= 263*R/1024 + 516*G/1024 + 100*B/1024 + 16; Cb <= -152*R/1024-298*G/1024 + 450*B/1024 + 128; Cr <= 450*R/1024-377*G/1024-73*B/1024 + 128; 40/55
색좌표변환기의설계 YCbCr 색좌표변환식의구현예 연산오차의누적 입력영상데이터 역변환을통해얻은원영상데이터 41/55 색좌표변환기의설계 YCbCr 색좌표변환식의구현예 논리합성가능 C 와동일결과 signal R : integer range 0 to 255; signal G : integer range 0 to 255; signal B : integer range 0 to 255; signal Y : integer range 0 to 255; signal Cb : integer range 0 to 255; signal Cr : integer range 0 to 255; -- 중략 Y <= ( 1053*R/512 + 2064*G/512 + 401*B/512 + 128 + 4 ) / 8; Cb <= ( -606*R/512-1192*G/512 + 1798*B/512 + 1024 + 4 ) / 8 ; Cr <= ( 1798*R/512-1507*G/512-291*B/512 + 1024 + 4 ) / 8; 42/55
색좌표변환기의설계 YCbCr 색좌표변환식의구현예 C 와동일결과 입력영상데이터 역변환을통해얻은원영상데이터 43/55 색좌표변환기의설계 색좌표변환결과예 원영상 YCbCr 영상색변환결과영상 44/55
색좌표변환기의설계 색변환시뮬레이션파형예 45/55 MCT 변환기의설계 MCT(Modified d Census Transform) 변환 영상내의구조적인특징을추출하는방법 밝기변화나조명에의한영향을최소화하면서영상내의정보를추출하는기법 MCT 변환의정의 46/55
MCT 변환기의설계 MCT 변환예 W(X) 10 20 30 40 0 60 70 80 90 MCT 0 0 0 000001111 (=15) 0 0 1 1 1 1 Γ(X) - - - - 15 - - - - 0 40 20 70 90 80 MCT 0 0 0 1 1 1 000111100 (=60) - - - - 60-60 10 30 1 0 0 - - - 47/55 MCT 변환기의설계 MCT 계산슈도코드 기본알고리즘에 /9 사용 논리합성을위해서는근사화, 혹은최적화필요 data_mean = (m1+m2+m3+m4+m5+m6+m7+m8+m9)/9; -- 논리합성불가 if (m1 > data_mean) mct1 = 1; else mct1 = 0; if (m2 > data_ mean) mct2 = 1; else mct2 = 0; //... // 중략 MCT = (mct1 << 8) + (mct2 << 7) + (mct3 << 6) + (mct4 << 5) + (mct5 << 4) + (mct6 << 3) + (mct7 << 2) + (mct8 << 1) + (mct9); 48/55
MCT 변환기의설계 근사화방법 1/9 = 1 * (256/256) /9 = 1 * (256/9) / 256 28 / 256 -- 근사화이전 data_mean = (m1+m2+m3+m4+m5+m6+m7+m8+m9)/9; -- 논리합성불가 -- 근사화이후 data_mean = 28 * (m1+m2+m3+m4+m5+m6+m7+m8+m9) / 256; 최적해법 /9 대신이항해서 *9 사용 -- 근사화이전 data_mean = (m1+m2+m3+m4+m5+m6+m7+m8+m9)/9; -- 논리합성불가 -- 근사화이후 data_sum = 9 * data_mean = (m1+m2+m3+m4+m5+m6+m7+m8+m9); 49/55 MCT 변환기의설계 VHDL 설계를위한최적 MCT 계산슈도코드 data_sum = (m1+m2+m3+m4+m5+m6+m7+m8+m9); if (9 * m1 > data_ sum) mct1 = 1; else mct1 = 0; if (9 * m2 > data_sum) mct2 = 1; else mct2 = 0; //... // 중략 MCT = (mct1 << 8) + (mct2 << 7) + (mct3 << 6) + (mct4 << 5) + (mct5 << 4) + (mct6 << 3) + (mct7 << 2) + (mct8 << 1) + (mct9); 50/55
MCT 변환기의설계 MCT 변환예 51/55 MCT 변환기의설계 MCT 변환기의구조도 image Y image MCT image Image Read sync RGB to YCbCr Conversion sync MCT Generator sync Image Write Input Yi image Output Output File Write File File 52/55
MCT 변환기의설계 3x33 윈도우의구현 Y image F/F F/F Line Memory(480x8) F/F F/F MCT Calculator Line Memory(480x8) F/F F/F MCT Image Window Generator(3x3) 53/55 MCT 변환기의설계 MCT 변환결과예 원영상 Y 영상 MCT 결과영상 54/55
MCT 변환기의설계 MCT 변환시뮬레이션파형예 55/55