740 likes | 929 Views
VLSI 시스템 설계 Project. Motion Estimator 설계. Motion Estimation (ME). 블ë¡ë³„ 움ì§ìž„ ì¶”ì • 기본 ë¸”ë¡ : 8 x 8 Block íƒìƒ‰ 윈ë„ìš° : 16 x 16 Block íƒìƒ‰ ì•Œê³ ë¦¬ì¦˜ : Full Search 최종 ì¶œë ¥ ë°ì´í„° 움ì§ìž„ 벡터 : MVx, MVy. Full search (1). íƒìƒ‰ 방법. -. Full search (2).
E N D
VLSI 시스템 설계 Project Motion Estimator 설계
Motion Estimation (ME) 블록별 움직임 추정 기본 블록 : 8 x 8 Block 탐색 윈도우 : 16 x 16 Block 탐색 알고리즘 : Full Search 최종 출력 데이터 움직임 벡터 : MVx, MVy
Full search (1) 탐색 방법 -
Full search (2) current block과 탐색 윈도우 내에 있는 모든 블록들 과의 SAD 값을 구하는 탐색 방법이다. 계산 구조 매 클럭 데이터를 처리 하기 위한 구조로 설계한다. 한 클럭에 처리 되는 데이터는 4x1 block 이다. 1 clk 1 clk 4 clk당 4x4 block 의 SAD 값 계산 1 clk 1 clk
Frame 정보 실습에 사용된 영상 32 x 32 Block 한 픽셀 정보 표시 비트 - 8 bit
Frame 정보 메모리에 저장된 방법 255 ● ● ● 12 11 10 ● ● ● 2 1 [7:0] 0 32 bit
실 습 과 제 Ⅰ Sum of Absolute Differences(SAD) UNIT
TOP Block Diagram (ME) MODULE Mem_cur module Mem_ref module AGU module SAD module CC module SIGNAL 8 bit : cur_addr, ref_addr 32 bit : cur_data, ref_data 1 bit : start_tran 64 bit : data_bus 1 bit : sig_sad_out 14 bit : sad_out 4 bit : mvx, mvy
TOP Block (ME) TOP module INPUT - Clock, Reset, Enable OUTPUT - mvx : Motion Vector X - mvy : Motion Vector Y Mem_cur module Mem_ref module INPUT - cur_addr : 현재 블록 주소 정보 OUTPUT - cur_data : 현재 블록 데이터 INPUT - ref_addr : 참조 블록 주소 정보 OUTPUT - ref_data : 참조 블록 데이터 AGU module INPUT - cur_data : 현재 블록 데이터 - ref_data : 참조 블록 데이터 OUTPUT - start_tran : 현재 블록 데이터 전달 신호 - data_bus : 현재 블록 데이터와 참조 블록 데이터 출력 - cur_addr : 현재 블록 주소 정보 - ref_addr : 참조 블록 주소 정보
TOP Block (ME) SAD module INPUT - start_tran : 현재 블록 데이터 전달 신호 - data_bus : 현재 블록 데이터와 참조 블록 데이터 OUTPUT - sig_sad_out : SAD 연산 결과 출력 신호 - sad_out : SAD 연산 결과 CC module INPUT - sig_sad_out : SAD 연산 결과 출력 신호 - sad_out : SAD 연산 결과 OUTPUT - mvx : Motion Vector X - mvy : Motion Vector Y AGU module
SAD Top Block Diagram SAD unit Block Diagram
Ripple Carry Adder n-비트 캐리 전파 덧셈기(RCA : Ripple Carry Adder)의 블록 다이어그램 n개의 full adder(FA)를 직렬로 연결하여 구성 각 carry-out의 지연시간으로 인하여 비트수가 증가함에 따라 계산지연시간이 선형적으로 증가
Carry LookaheadAdder (1) Carry Lookahead Adder (CLA) FA의 캐리를 미리 예측하여 계산 결과를 구하는 덧셈기(RCA의 단점 극복) i 번째 stage에서의 carry generate function(Pi), carry propagate function(Gi): Gi : i번째 stage에서의 carry-in에 관계없이 발생하는 주캐리(primary carry)의 유무를 나타내는 함수 Pi : i번째 stage에서의 carry-in이 carry-out으로 되는지 를 나타내는 함수
Carry Lookahead Adder (2) i 번째 stage에서의 덧셈합 i 번째 stage에서의 carry-out Pi와 Gi를 이용한 Si와 Ci의 재표현 Pi와 Gi는 동시 발생이 가능하므로 모든 stage의 carry-out은 stage간의 전달 지연 없이 구함
Carry Lookahead Adder (3) 16-비트 CLA의 설계 트리 CLA 블록에서 carry-in의 입력수가 통상 허용되는 fan-in을 초과하므로 4-비트 BCLU (Block CLU)와 8-비트 CLU로 나누어 모델링
Carry Lookahead Adder (4) 캐리 전달함수 및 발생함수 발생기(PGU) 각각 16비트의 P, G 신호 동시에 출력 module name : pgu_16bit Input (16bit) : a, b Output (16bit) : p, g
Carry Lookahead Adder (5) PGU Input a, b Output p, g a : 0011110110111011 b : 1010001110111101 p : 1001111000000110 g : 0010000110111001 a : 1100011000101011 b : 0011011110111110 p : 1111000110010101 g : 0000011000101010
Carry Lookahead Adder (6) 블록 캐리 예측기 (BCLU) 16-비트 CLU의 fan-in 문제를 고려, 4개의 4-비트 BCLU와 1개의 CLU를 이용, 2-레벨로 구성
Carry Lookahead Adder (7) BCLU module name : bclu_16bit Input (1bit) : cin Input (4bit) : p, g Output (3bit) : c Output (1bit) : ps, gs • BCLU unit은 4 비트씩의 P와 G, 그리고 1 비트의 • Cin을 입력으로 취하여 3비트의 캐리 (C)와 블록 전달 • 함수 (ps)와 블록 발생 함수 (gs)의 출력을 가진다. • cn = gn + pn·cn-1 • ps = p0 · p1 · p2 · p3 • gs = g3 + g2 · p3 + g1 · p3 · p2 + g0 · p3 · p2 · p3 Input cin = 1’b0, p, g Output c, ps, gs
Carry Lookahead Adder (8) 캐리 예측기 (CLU) • CLU unit은 전체 16 비트 덧셈기의 캐리인과 4개의 • BCLU로부터 출력 ps와 gs를 입력으로 하며 총 • 3비트의 캐리 신호를 출력시킨다. • c4k+3 = gsk + gsk-1·psk-1 + · · · + gs0·psk·psk-1· · ·ps1 • + cin · psk · · · ps0 module name : clu_16bit Input (1bit) : cin Input (4bit) : ps, gs Output (3bit) : c Input cin, ps, gs Output c
Carry Lookahead Adder (9) 덧셈 블록 (SU) module name : su_16bit Input (15bit) : c Input (1bit) : cin Input (16bit) : p Output (16bit) : s • SU unit은 16비트 p와 16비트 c의 입력을 받아 • 16비트 덧셈 합을 출력으로 한다. • s = p xor c Input cin, c, p Output s
Carry Lookahead Adder (10) CLA top block module name : cla_16bit Input (16bit) : a, b Input (1bit) : cin Output (16bit) : s • Top block은 16비트의 두 입력을 받아 16비트의 • 덧셈 결과를 출력한다. 전체 캐리 아웃은 고려하지 • 않았다. 전체 block diagram을 참고하여 각각의 • 모듈을 연결한다. Input a, b, cin Output s Carry out
Register File (1) • Register file module name : reg_file Input (1bit) : clk, reset, cur_start Input (64bit) : data_in Output (64bit) : cur_data, ref_data Output : cnt1, cnt2 • Register 모듈은 64비트의 데이터를 입력 받아서 • 8 클럭 동안 current block 데이터를 register에 저장 • 하고 이 후에는 current block 데이터와 reference • block 데이터를 출력으로 내보낸다.
Register File (2) • Register file 카운터의 출력 중 cnt, cnt0 두 개의 출력을 사용하여 cnt가 0~7까지 현재 블록의 정보를 current register 8개에 저장하고, cnt0가 8~16까지 현재 블록의 정보와 참조 블록의 정보를 출력으로 내보낸다. 이 때 register file에 들어오는 입력을 dat_in_tmp에 저장하여 한 클럭 후에 current register에 저장하고 register file의 출력으로 사용한다. count_16 input : clk, reset, load(cur_start) output : cnt_out(cnt), cnt_out0(cnt0), cnt_out1(cnt1), cnt_out2(cnt2) cnt0 값에 의해 register file의 출력 값이 정해지지 않을 경우에는 Hiz를 출력으로 내보낸다.
Register File (3) • Register file Input clk, reset, cur_start, data_in Output cur_data, ref_data Hiz output
2’s Complement 2’s complement module name : twos_com Input (8bit) : ref_data_8bit Output (16bit) : com_out • 입력으로 들어오는 8bit unsigned 참고 • DATA값을 16bit signed 값으로 전환하고 • 이 값의 보수 값을 구한다. Input ref_data_8bit 200 → -200 146 → -146 23 → -23 Output com_out
Absolute Block Absolute module name : abs_mode Input (10bit) : abs_in Output (10bit) : abs_out • 첫 번째 ADDER로부터 얻은 DATA 값 • (10비트 값만을 취함)의 절대값을 구한다. Input abs_in -118 → 118 -393 → 393 362 → 362 Output abs_out
SAD Top Block (1) SAD top Register file의 입·출력과 top block을 연결한 후, 이 값을 complement unit에 연결 한다. 전체 Adder에 대해서 캐리인은 ‘0’으로 정해주고 complement unit의 결과값을 첫 번째 Adder (8개)에 연결한다. 이 결과를 Absolute unit에 연결하여 절대 값을 구하고, 이 결과를 두 번째 Adder(4개)에 연결하여 덧셈 결과를 구한다. 이 값을 세 번째 Adder(2개)에 연결하고 이 결과를 네 번째 Adder(1개)에 연결하여 8 X 1의 결과를 얻는다. 이렇게 얻은 결과 (8 X 1의 결과 8개)를 더하여 8 X 8에 대한 SAD 값을 구하여 출력한다. 카운터로부터 얻은 두 개의 카운터 값(cnt1, cnt2)를 이용하여 최종 SAD 결과가 출력될 때마다 CC Block의 입력이 되는 enable (sig_sad_out) 신호를 생성한다. module name : top_sad_unit Input (1bit) : clk, reset, cur_start Input (64bit) : data_in Output (1bit) : sig_sad_out Output (14bit) : sad_out
SAD Top Block (2) SAD top Input clk, reset, cur_start, data_in Output sad_out, sig_sad_out Reference block data SAD Value Current block data
실 습 과 제 Ⅱ Motion Vector Generation
MV generation block MV generation clk count MV_gen reset Count [6:0] MV_X [3:0] en MV_Y [3:0] Compare SAD [13:0] exch • SAD의 입력을 받아서 Search Window 내에서 SAD 값이 가장 적은 부분의 MV 값을 생성.
용도 : Search Window 내에서의 MB의 이동 횟수를 셈 입력 신호 : clk, reset, en en : 전 단인 SAD를 구하는 블록에서 새로운 SAD가 유효할 때마다 전송됨, en 신호가 들어올 때마다 count 출력 신호 : count[6:0] Counter (1) clk Counter Count [6:0] reset en
Counter (2) 하나의 Search Window 내에서 MB가 이동 할 수 있는 횟수를 count 하나의 Search Window 내에서 총 81개의 MV가 나옴 MB가 Search Window 내에서 왼쪽 윗 부분부터 이동을 하기 때문에 이 부분의 count가 1이 되고 이동을 하면서 Search Window의 마지막 부분에 도달했을 때에는 count가 81이 됨 Current MB8x8 Count : 1 Search Window16x16 Count : 81
Counter (3) 1. 총 81개를 count하고 초기화 됨 2. Counter는 초기 상태 0을 유지 하고 있다가 en 신호가 들어올 때 count
Compare (1) 용도 : 현 MB가 Search Window에서 이동하면서 계산되어 나오는 SAD의 최소값을 구함 입력 신호 : clk, reset, en, SAD[13:0] en : 전 단인 SAD를 구하는 블록에서 새로운 SAD가 유효할 때마다 전송됨en 신호가 들어올 때마다 count SAD[13:0] : 전 단에서 들어오는 SAD 값, 출력 신호 : exch exch : 새로 들어온 SAD 값이 compare에서 가지고 있던 이전 블록의 최소값보다 작다면 exch 신호를 내보내서 mv 값을 변경시킴 clk Compare reset exch en SAD [13:0]
Compare (2) 입력으로 SAD값을 받음 Compare_old는 처음에 최대값을 가지고 있음 ->현 Search Window의 첫 SAD가 들어오면 compare_old에 SAD값을 넣기 위함 ->Search Window가 바뀌면 다시 최대값으로 변함 Compare block에서 새로 들어온 SAD와 compare_old를 서로 비교 SAD가 더 작으면 compare_old update, exch 신호 high SAD가 더 크면 compare_old 그대로 유지, exch 신호 low SAD SAD [13:0] compare exch compare old
Compare (3) 1. Compare는 초기에 최대값을 가지고 있음. 2. Compare는 Search Window가 바뀌기 전에 비교할 값을 최대값으로 바꿈. -> 다음 Search Window의 처음 SAD 값으로 비교값을 update 하기 위함
Compare (4) 3. 비교값보다 SAD 값이 크면 exch 값이 high, 비교값은 SAD 값으로 update. 4. 비교값보다 SAD 값이 크면 exch 값이 low, 비교값은 그대로 유지.
MV_generation (1) 용도 : 전 블록에서 count와 exch 입력을 받아 그에 맞는 MV를 생성. MB가 Search Window의 왼쪽 위부터 검색을 하므로 초기 값은 -4, -4를 가짐 입력 신호 : clk, reset, count[6:0], exch Count : count에 따라 MV 위치 변화 Exch : MV 교체 신호. 출력 신호 : MV_X[3:0], MV_Y[3:0] MV generation clk reset MV_X [3:0] Count [6:0] MV_Y [3:0] exch
Compare 블록에서 나온 exch 신호와 Counter 블록에서 나온 count 신호를 이용해 MV 값을 생성 Exch 신호는 SAD 값이 생성 될 때마다 high가 되며, 그 때 count로 현재 MB가 Search Window의 어디에 있는지를 알 수 있음 Search Window 내에서 갱신되는 MV 값을 가지고 있다가 카운트가 마지막에 도달하면 MV 값을 전송함 MV_generation (2) MV generation clk reset MV_X [3:0] Count [6:0] MV_Y [3:0] exch
MV_generation(3) MV값 생성 원리 exch 값이 high가 될 때마다 count의 값을 참조해서 MV값을 생성(case문 이용) 예) count가 1일 경우 (-4,-4), count가 9일 경우 (-4,4), count가 81일 경우 (4,4) SAD가 모든 블록에 대해서 동일하다면 MV값은 (0,0)이어야 함 Current MB8x8 Count : 1 Search Window16x16 Count : 81 -4,4, count9 -4,2, count7 -4,0, count5 -4,-4, count1
MV_generation (4) 1. 초기값(-4,-4), exch 신호가 high이면 그 때의 count 수에 따라서 MV 값 결정 2. Count가 81이 되면 하나의 Search Window가 끝났기 때문에 MV가 초기화 됨
실 습 과 제 Ⅲ Address Generation Unit(AGU)
Memory (1) 실습에 사용된 메모리 current frame mem_cur CLK SPO WE A D • CLK : 클럭 • WE : write enable (1 이면 쓰기, 0 이면 읽기) • A : 주소 • D : 메모리에 쓸 data • SPO : 메모리에서 읽어온 data
Memory (2) 실습에 사용된 메모리 reference frame mem_ref CLK SPO WE A D • CLK : 클럭 • WE : write enable (1 이면 쓰기, 0 이면 읽기) • A : 주소 • D : 메모리에 쓸 data • SPO : 메모리에서 읽어온 data
Address Generation Unit (AGU) (1) 메모리로부터 데이타를 읽기 위한 주소 생성 유닛 clk cur_addr AGU rst ref_addr enable data_bus cur_data start_tran ref_data • 주소를 생성해서 메모리의 데이타를 받고 필요한 데이타 값을 가공하여 다음 모듈로 • 넘기는 동작을 한다. • clk : posedge에 동기화하여 동작 • rst : set 경우 초기화 • enable : set 유지되는 동안 동작 • data_bus : 4 x 1 블록의 데이터 (64bit) 가 clk 당 전송 • start_tran : 현재 블록의 데이터가 전송 되는 동안 set
Address Generation Unit (AGU) (2) 메모리와의 연결 clk cur_addr AGU rst ref_addr enable mem_cur mem_ref data_bus CLK CLK SPO SPO cur_data start_tran WE WE ref_data A A D D
Address Generation Unit (AGU) (3) 출력 데이타 • data_bus : 4 x 1 블록 전송 • start_tran : 세 가지 의미 • 데이터가 전송 시작 알림 • set 되어있는 동안은 current block 데이터가 전송. • clear 되어있는 동안은 reference block 데이터가 전송. • 다음 모듈에서 전송된 데이타를 가지고 SAD 값을 생성한다.
AGU 구조 AGU 모듈의 두가지 기능 메모리 액세스를 위한 어드레스 생성. SAD 계산을 위한 data를 다음 단에 전송.
현재 프레임 주소 생성 (1) 실습 (I) 메모리로 부터 읽어올 타이밍을 발생 시키는 모듈 설계 clk ctrl_cur_addr_gen get_cur_row_block rst cur_block_cnt enable cnt_1block • get_cur_row_block : 어드레스 생성 타이밍. • cur_block_cnt : 처리중인 현재 블록 번호. • cnt_1block : current의 한 블록을 처리하는 동안의 카운트. • 모듈간의 동기화를 담당한다. 설계에서 만들어야 할 타이밍 시기