while(1) work();
반응형
본 게시글은 KUEE 정보공개 프로젝트에 포함된 글입니다.
https://blog.youhogeon.com/65

본 자료의 저작권은 모두 저에게 있으며
학업에 참고 자료로만 사용하시길 바랍니다.
부득이하게 인용해야 하는 경우 반드시 출처(KUEE 정보공개 프로젝트)와 링크를 남겨주시길 바랍니다.

p2.pdf
4.73MB
src.zip
5.44MB

 

VLSI 설계 및 실험보고서 Project 2 2D DCT Design in JPEG Image Compression - 1 - # Overview 1. JPEG Codec JPEG Codec은 이미지를 저장하기 위해 만들어진 손실 압축 표준(ISO/IEC 10918)이다. JPEG Codec은 위와 같은 구조를 가진다. 각 픽셀에 대한 모든 데이터를 가지고 있는 원본 데이터에 대해 색공간 변환(RGB 데이터를 YCbCr 데이터로 변환) - 서브샘플링(YCbCr 데이터 비트 조절) - 이산 코사인 변환(DCT) - 양자화(주파수 각 성분을 상수로 나누고 몫만을 취함) - 엔트로피 부호화 과정을 거쳐 압축된(그리고 손실이 발생한) JPEG 데이터가 만들어진다. JPEG Codec으로 저장된 데이터를 열 때는 위의 과정을 역으로 수행하여 (원본과 유사하지만 손실된) 이미지 데이터를 만들어낸다. JPEG 이미지는 손실 이미지 포맷이기 때문에, 손실 정도를 가늠할 수 있는 factor가 필요하다. 대표적인 factor로 최대 신호 대 잡음비(PSNR)가 있다. PSNR은 신호가 가질 수 있는 최대 전력에 대한 잡음의 전력을 나타낸 것으로, 평균 제곱 오차(MSE)를 이용해 아래와 같은 수식을 통해 계산할 수 있다.   log log, ( 는 신호의 최댓값) 2. Discrete Cosine Transform N개의 point를 가지는 데이터에 대해 이산 코사인 변환은 위 식과 같이 정의된다. 또한, N이 8이라고 가정한다면(8-point DCT) 위 수식을 전개하여 그림과 같이 행렬을 이용해 표현할 수도 있다. - 2 - 코사인 함수는 주기성을 가지고, 우함수라는 특징이 있다. 이러한 특징을 이용해 앞서 보았던 행렬식을 위의 식처럼 간소화시킬 수 있다. 이산 코사인 변환을 수행하면 각 데이터들의 주파수 성분을 얻을 수 있다. 이산 코사인 변환의 출력을    이라고 하면 은 입력 신호의 DC성분(변화하지 않는 성분)을 의미하고, 쪽으로 갈수록 고주파 성분(급변하는 성분)을 의미한다. JPEG Codec에서는 이미지를 8px x 8px 크기로 분할한 뒤 각각의 분할된 이미지에 대해 이산 코사인 변환을 두 번(가로로 적용 후 다시 세로로 적용) 행한다. 그러면 2D 데이터에 대한 주파수 성분을 얻을 수 있다. 이렇게 얻은 주파수 성분에 대해 다시 양자화(quantization) 등을 거쳐 이미지를 적절히 손실시켜 압축·저장한다. 3. Transpose 메모리 Transpose 메모리는 입력이 들어오면 저장해두었다가, transpose된 입력을 출력으로 내보내는 메모리 구조이다. 그림에서, 입력으로      부터    까지의 여덟쌍의 데이터가 들어가면, 출력으로는    부터     까지의 데이터(output = transposed input)가 나옴을 확인할 수 있다. JPEG Codec은 이미지를 8px x 8px 크기의 작은 이미지들로 분할해 각각 이차원 이산 코사인 변환을 행한다. 분할된 이미지 블록에 대해 이산 코사인 변환을 두 번 하기 위해, (8, 8) 크기의 transpose 메모리를 이용할 수 있다. 다시 말해 8px x 8px의 원본 이미지 데이터에 이산 코사인 변환을 한 뒤 transpose 메모리에 넣고, 다시 transpose 메모리의 출력에 대해 이산 코사인 변환을 한 다음, transpose 하면 이차원 이산 코사인 변환된 데이터를 얻을 수 있다. - 3 - 4. Project Introduction 본 프로젝트에서는 JPEG compression 과정 중 2D DCT 과정을 회로로 구현할 것이다. 원본 이미지는 512px x 512px의 흑백 이미지(grayscale)로, 각 픽셀마다 8bit(0~255)의 명암 데이터를 가진다. 더불어, 본 프로젝트에서는 이러한 데이터가 이미 INPUT 메모리 BUFFER에 저장되어있다고 간주한다. 즉 데이터를 수신해 입력으로 받는 과정은 고려하지 않고, 이미 데이터가 저장된 메모리를 사용한다. 앞서 설명한 DCT의 계산식과 transpose 메모리를 이용하여 위 그림과 같은 아키텍쳐를 구현하면 본 프로젝트에서 구현하고자 하는 2D DCT 모듈을 구현할 수 있다. Verilog를 이용해 회로를 구현하기 전에, 먼저 JAVA를 이용해 2D DCT 코드를 작성하였다. 이미지의 품질(PSNR)이 적정선(29dB)를 유지하는 선에서 동작하는 최적의(특히 더 적은 면적을 가지는) 회로를 만들기 위해, JAVA 코드상에서 후술할 여러 가지 시도들을 하면서 2D DCT의 결과를 테스트하였다. 다음으로 Verilog를 이용해 위 그림과 같은 회로를 구현하였고, 마지막으로 JAVA 테스트를 통해 검증한 최적화 방법과 회로 최적화 기법들을 적용해 회로를 개선하였다. - 4 - # Pre-Implementation using JAVA 1. 개요 [#Overview ­ 4.]에서 설명한 바와 같이, 먼저 JAVA를 이용해 2D DCT코드를 작성하였다. 위와 같이 Coefficient(cosine 값)들의 정밀도를 높게 설정하여 PSNR의 기준값을 찾아보았다. 2. 실행 결과 이미지 # 1 2 3 4 5 6 7 8 PSNR 31.9769 36.1105 38.3295 34.8956 30.5882 39.2281 32.4549 40.6120 평균 35.5245 표준편차 3.4384 PSNR이 29이상일 확률 (정규분포) 97.11% 2D DCT를 수행한 뒤 해당 결과를 가지고 (사전에 주어진 코드를 통해) JPEG compression을 통해 JPEG 이미지를 생성하였다. 생성된 JPEG 이미지를 원본 이미지와 비교했을 때 각 이미지 들의 PSNR 값 - 5 - 은 위와 같았다. Coefficient의 정밀도를 높게 설정하였고, 모든 계산 과정에서 double 데이터 타입을 사용하였기 때문에 계산 과정에서 truncate되는 데이터는 (유의미한 자릿수 내에서) 없었다. 따라서 위에서 산출한 PSNR값을 [#Pre-Implementation using JAVA]에서의 기준 PSNR값으로 사용하였다. 3. High Frequency 성분 제거 및 실행 결과 위 코드와 같이 두 번의 1D DCT과정에서 고주파 성분 두 개( )를 계산하지 않고 0으로 간주하였다. 이미지 # 1 2 3 4 5 6 7 8 PSNR 31.1836 35.9956 38.3269 34.8277 29.8651 39.2140 32.2551 40.5305 평균 35.2748 최댓값 대비 평균 PSNR 감소율 0.70% 표준편차 3.6793 PSNR이 29이상일 확률 (정규분포) 95.59% 2D DCT를 통해 생성한 JPEG 이미지와, 원본 이미지와 비교해 계산한 각 이미지 들의 PSNR 값은 위와 같았다. 64개의 2D 주파수 성분 중 28개의 주파수(고주파수) 성분이 제거되었음에도, 그렇지 않은 경우에 비해 PSNR이 0.70%밖에 감소하지 않았음을 확인할 수 있었다. - 6 - 이미지 # 1 2 3 4 5 6 7 8 PSNR 29.212 35.7258 38.2496 34.5039 28.6024 38.9488 31.7604 40.2505 평균 34.6567 최댓값 대비 평균 PSNR 감소율 2.44% 표준편차 4.1605 PSNR이 29이상일 확률 (정규분포) 91.30% 마찬가지로 두 번의 1D DCT과정에서 고주파 성분 세 개(  )를 계산하지 않고 0으로 간주한 상태에서 2D DCT를 수행한 뒤 JPEG 이미지를 생성하였다. 생성한 JPEG 이미지와, 원본 이미지와 비교해 계산한 각 이미지 들의 PSNR 값은 위와 같았다. 64개의 2D 주파수 성분 중 42개의 주파수(중~고주파수) 성분이 제거되었기 때문에, 최댓값 대비 평균 PSNR이 2.44%의 감소하였다. 더불어, 5번 이미지의 PSNR이 29 미만으로 나타났다. 따라서 고주파 성분을 세 개 제거하면 양호한 품질의 이미지를 얻기 어려웠다. 또한 표준편차가 4.16dB로 크게 나왔는데, 이는 고주파 성분이 많은 이미지는 품질이 떨어지고 저주파 성분이 많은 이미지는 품질이 어느정도는 유지되기 때문에 각 이미지들의 PSNR 편차가 커졌기 때문으로 분석할 수 있다. 4. Coefficient 변경 및 실행 결과 Coefficient의 정밀도가 높은 경우 계산 과정에서 더 많은 digit를 처리해야 하기 때문에 회로의 면적이 증가한다. 따라서 이미지 품질을 해치지 않는 선에서 coefficient를 줄이는 것은 중요하다. 위에서와 마찬가지로 1D DCT 과정에서 고주파 성분 두 개를 제거한 상태에서 coefficient의 정밀도를 낮추어가며 테스트를 진행하였다. 테스트에 사용한 coefficient는 아래와 같다. (Coefficient의 소숫점 자릿수를 맞추기 위한 코드가 있으나, 본 문서에는 첨부하지 않았다.) - 7 - 이미지 # 1 2 3 4 5 6 7 8 PSNR 31.1821 35.9953 38.3260 34.8275 29.8649 39.2132 32.2553 40.5253 평균 35.2737 최댓값 대비 평균 PSNR 감소율 0.71% 표준편차 3.6784 PSNR이 29이상일 확률 (정규분포) 95.60% 먼저, 16bit coefficient(부호포함)를 사용해 DCT를 계산하였을 때, 생성된 JPEG 이미지와, 원본 이미지에 대해 계산한 각 이미지 들의 PSNR 값은 위와 같았다. 정말한 coefficient를 사용했을 때의 평균 PSNR(35.2748)과 거의 차이가 없음을 확인할 수 있었다. 이는 최종적으로 2D DCT의 결과를 12bit로 truncate 하기 때문에, 12bit 이상의 coefficient를 사용하더라도 결과값에 큰 영향을 주지 못하기 때문이다. (이미지 품질에 큰 차이가 없다.) 이미지 # 1 2 3 4 5 6 7 8 PSNR 31.0596 35.3888 37.4978 34.3680 29.6936 38.4142 32.0067 39.2045 평균 34.7042 최댓값 대비 평균 PSNR 감소율 2.31% 표준편차 3.3179 PSNR이 29이상일 확률 (정규분포) 95.72% - 8 - 마찬가지로, 8bit coefficient(부호포함)를 사용해 DCT를 계산하였고, 그에 따라 생성된 JPEG 이미지와, 원본 이미지와 비교해 계산한 각 이미지 들의 PSNR 값은 위와 같았다. Coefficient를 8bit로 줄이더라도 이미지의 품질은 소폭 감소하는데 그치는 것을 확인할 수 있었다. 따라서 coefficient의 정밀도를 8bit보다 더 줄이기 위한 방법을 찾았다. 14bit coefficient 14bit 등가 coefficient 근사화한 7bit coefficient 오차HEX BIN BIN HEX  3EC5 0.0111_1101_1000_101 0.1000_0201_1000_101 0.1000_000 40 -1.96% 3B21 0.0111_0110_0100_001 0.1000_2020_0100_001 0.1000_200 3C -1.47% 3537 0.0110_1010_0110_111 0.0110_1010_0110_111 0.0110_100 34 2.28% 2D41 0.0101_1010_1000_001 0.0101_1010_1000_001 0.0101_101 2D 0.56% 238E 0.0100_0111_0001_110 0.0100_1002_0001_110 0.0100_100 24 -1.25% 187E 0.0011_0000_1110_010 0.0011_0000_1110_010 0.0011_000 18 2.01% 0C7C 0.0001_1000_1111_100 0.0001_1000_1111_100 0.0001_100 0C 3.90%위의 표는 coefficient(~ )를 나타낸 것이다. 비트 수는 소숫점 아래 자리만 계산하였으며 부호는 고려하지 않았다. 또한 2로 표시한 비트는 ­1을 의미한다. 이진수로 0011111이 0100002와 같다는 것을 이용하여 등가 coefficient를 계산하였고, 등가 coefficient의 앞 7bit를 제외하고 truncate시켜 근사화한 7bit coefficient를 만들었다. 등가 coefficient를 계산하지 않고 truncate만을 통해 7bit coefficient를 만드는 경우, 그렇지 않은 경우보다 오차가 커진다. 또한 등가 coefficient를 계산할 때 추후 multiplier를 shift adder tree로 교체하기 편하도록 비트 값이 1인 경우를 최대한 줄이는 방향으로 계산하였다. 이렇게 계산된 근사화된 7bit coefficient의 평균 제곱 오차는 2.15%였다. 또한 [#Overview ­ 2.] 의 DCT 식에서  를 계산할 때 가 각각 네 번씩이나 사용되기 때문에 의 경우에는 값이 1인 비트 수가 많아지더라도 작은 오차를 가지도록 설계하였다. - 9 - 이미지 # 1 2 3 4 5 6 7 8 PSNR 31.0633 35.3904 37.5054 34.3705 29.6939 38.4182 32.0334 39.2096 평균 34.7106 최댓값 대비 평균 PSNR 감소율 2.29% 표준편차 3.3169 PSNR이 29이상일 확률 (정규분포) 95.74% 근사화된 7bit coefficient를 사용해 DCT를 계산하였을 때, 생성된 JPEG 이미지와, 원본 이미지에 대해 계산한 각 이미지 들의 PSNR 값은 위와 같았다. Coefficient를 근사화시키고 7bit로 줄이더라도 이미지의 품질에는 큰 영향을 끼치지 않는 것을 확인할 수 있었다. 따라서 위에서 구한 coefficient들을 사용하는 것으로 결정하였다. 5. Glitching blocks 제거 입력의 범위가 0 ~ 255이고, coefficient의 범위가 0 ~ 0.5이기 때문에, 2D DCT를 계산한 결과의 범위를 계산할 수 있다. DC 성분의 경우 정수부의 bit가 부호를 포함해 12bit가 되며, AC 성분의 경우 일반적으로 정수부의 bit가 부호를 포함해 10bit가 된다. JPEG codec은 각 성분을 12bit로 표현할 것을 요구한다. 이 중 DC 성분은 정수부분 12bit를, AC 성분은 정수부분 10bit와 소수부분 2bit의 데이터를 담아야 한다. 그러나 AC 성분 중 두 개의 저주파 성분( )은 종종 signed 10bit 범위(-512 ~ 512)를 초과(overflow)한다. 이러한 경우 overflow가 발생한 8px x 8px 이미지의 색상은 반전된 모습처럼 보이며, 이를 glitching block 이라고 한다. 오른쪽의 그림은 glitching block이 존재하는 이미지들의 예시이다. JPEG codec에 맞추어(정수부 10bit, 소수부 2bit) 값을 넣으면서 overflow를 해결하기 위해서는 overflow 발생 시 해당 성분의 값을 최댓값(511.75) 또는 최솟값(-512)로 보정해주는 로직이 필요하다. 따라서 아래와 같은 로직을 JAVA 코드에 추가하였다. - 10 - 이미지 # 1 2 3 4 5 6 7 8 PSNR 31.8310 35.4897 37.5075 35.2434 30.3822 38.4294 34.4715 39.2697 평균 35.3281 최댓값 대비 평균 PSNR 감소율 0.55% 표준편차 2.9018 PSNR이 29이상일 확률 (정규분포) 98.54% High frequency 성분을 제거하면서 근사화된 7bit coefficient를 사용한 코드에, overflow를 보정해주는 코드를 추가한 뒤 DCT를 계산하였다. 생성된 JPEG 이미지와, 원본 이미지에 대해 계산한 각 이미지 들의 PSNR 값은 위와 같았다. 위에서 존재해왔던 glitching block이 사라진 것을 확인할 수 있었으며, 평균 PSNR도 기준 PSNR 값에 근접하게 올라온 것을 확인할 수 있었다. 6. 결론 JAVA code 테스트를 통해 High frequency 성분을 제거하고 근사화된 7bit coefficient를 사용하더라도 이미지 품질에 큰 영향을 끼치지 않는다는 사실을 확인하였다. 이제 여기서 구한 coefficient와 high frequency를 제거한 DCT 식을 가지고 verilog로 회로를 구현한다. - 11 - # Implementation 1. Wires & Registers 이름 구분 크기 목적 mem_out wire 64b INPUT 메모리의 DO에 연결 in mem_out이 입력인 flip-flop의 출력 result 96b RESULT_MAKER112 모듈의 출력 out result가 입력인 flip-flop의 출력 dct_out[2:0] 112b [0] : DCT1 모듈의 출력 [1] : DCT2모듈의 출력 [2] : DCT2 모듈의 출력이 입력인 flip-flop의 출력tp_out[4:0] [0] : TP 메모리1의 출력 [1] : TP 메모리2의 출력 [2] : tp_out[0] | tp_out[1]이 입력인 flip-flop 출력[3] : TP 메모리3의 출력 [4] : TP 메모리4의 출력 clk, reset 1b 클럭 및 리셋 신호 dummy 100b SRAM, TP 메모리의 포트 중 사용하지 않는 포트와 연결 addr reg 16b INPUT 메모리의 address addr_out OUTPUT 메모리의 address tp_sel 4b [0] : TP1, TP2 중 활성화 된 TP 정보 [1] : TP1, TP2의 reset 신호 [2] : TP3, TP4 중 활성화 된 TP 정보 [3] : TP3, TP4의 reset 신호 본 프로젝트에서 구현한 top 모듈의 wire와 register는 위와 같다. 2. Modules 이름 포트명 구분 크기 목적 DCT8 out out 112b DCT연산을 수행. Unsigned 8bit x 8을 입력받고, in in 64b 1D DCT 결과를 signed 14bit x 8로 출력 DCT14 out out 112b DCT연산을 수행. signed 14bit x 8을 입력받고, 1D in in 112b DCT 결과를 signed 14bit x 8로 출력 DIVIDER64S out0, ... out7 out 각 9b 64bit의 입력을 8bit 8개로 나눈 뒤 sign bit 0을 붙in in 64b 여서 9bit 8개의 값을 출력 DIVIDER112 out0, ... out7 out 각 14b 112bit의 입력을 14bit 8개로 나눈 뒤 출력 in in 112b RESULT_MAKER out out 96b 14bit x 8의 입력을 받은 뒤 JPEG codec에 맞게 12bit x 8로 변환 및 overflow검사 수행. DC성분, AC성분에 따라 (12,0) 또는 (12,2)의 값 8개를 출력in in 112b isDC in 1b D_FF## q, d, clk, reset ##b 다중 bit 플립플롭 본 프로젝트의 top 모듈에서 사용한 하위 모듈은 위와 같다. - 12 - 3. Expected Block Diagram 구현한 verilog 코드를 통해 top 모듈을 합성한 결과는 위와 같은 block diagram이 될 것으로 예측할 수 있다. 중간에 De-multipliexer를 통해 DCT 연산의 결과를 두 TP 메모리에 분산(각 TP 메모리는 8 cycle씩 쓰고, 다시 8 cycle씩 읽고를 반복함)하였다. DCT1 모듈의 block diagram은 위와 같다. 구현한 코드에 의하면 56개의 adder(혹은 subtracter) 와 22개의 multiplier가 본 모듈에 포함되어있기 때문에 전체 회로를 표현할 수 없어서, 일부 회로(out0을 구하는 회로)만을 나타내었다. Input이 8개의 signed 9bit으로 나누어지고 각각 소숫점 자릿수가 15자리인 coefficient(0 ~ 0.5)와 곱해진 후 더해진다. 따라서 out의 범위는 ­1024 ~ 1023이 될 것이며, (26, 15)의 digit을 가진다. 이 중 소수 12자리를 truncation 하여 [25:11] 범위(sign bit 포함 정수 11자리, 소수 3자리)의 데이터를 출력한다. (BW = 14) DCT2 모듈도 입출력 비트를 제외하고는 DCT1 모듈과 동일하게 동작한다. DCT2 모듈에는 (14, 3) 의 digit을 가지는 8개의 입력이 들어온다. 마찬가지로 소숫점 자릿수가 15자리인 coefficient와 연산을 마치면 (28, 18)의 digit을 가지는 값이 나오며, 이 중 소수 16자리를 truncation 하여 [29:16] 범위(sign bit 포함 정수 12자리, 소수 2자리)의 데이터를 출력한다. (Bitwidth = 14) 4. Expected Timing Diagram 회로에 플립플롭이 없다고 가정하면 예상되는 timing diagram은 위와 같다. D는 원본 데이터를, *는 DCT 연산되었음을, T는 transpose 되었음을 의미한다. 가령 D*T*는 원본 데이터가 DCT를 거친 뒤 transpose 되었고, 다시 DCT되었음을 의미한다. - 13 - 5. Result ­ Timing Diagram 구현한 프로젝트의 동작을 테스트하기 위해 테스트벤치 코드를 이용해 파형을 확인하였다. 위에서 예상한 timing diagram과 파형이 일치함을 확인할 수 있었다. 더불어, RESULT_MAKER의 출력이 flip-flop을 거쳐 OUTPUT 메모리에 순차적으로 잘 저장됨을 확인할 수 있었다. 테스트벤치 코드에는 OUTPUT 메모리의 값을 텍스트 파일로 추출하는 코드가 포함되어있다. 추출된 2D DCT값(OUTPUT 메모리에 저장된 값)을 주어진 matlab 코드(2D DCT 값을 입력하면 해당 값을 가지고 JPEG compression을 하는 코드)에 넣고 실행해 JPEG 이미지를 생성하고 PSNR값을 계산하였다. 6. Result ­ JPEG & PSNR 이미지 # 1 2 3 4 5 6 7 8 PSNR 31.9741 36.1074 38.3248 35.7862 30.5870 39.2211 34.8505 40.6032 평균 35.9318 표준편차 3.2369 PSNR이 29이상일 확률 (정규분포) 98.39% 구현한 모듈을 통해 출력된 2D DCT결과를 가지고 JPEG 이미지를 생성하였다. 생성한 JPEG 이미지와, 각 이미지 들의 PSNR 값은 위와 같았다. 소숫점 15자리의 정밀한 coefficient를 사용하였고, high frequency를 제거하지 않았으며 glitching - 14 - block이 나타나지 않도록 overflow를 보정하였기 때문에 높은 PSNR이 나왔음을 확인할 수 있었다. 이는 [#Pre-Implementation using JAVA]에서 사용한 기준값(정밀한 coefficient, high frequency 포함, 그러나 glitching block 존재) 보다 높은 수치이다. 7. Result ­ Synthesize & Critical Path 합성 후 top 모듈의 block diagram은 위와 같았다. 앞서 예상한 block diagram과 일치하는 결과가 나왔음을 확인할 수 있었다. 두 개의 TP 메모리의 출력을 OR연산하는 회로가 두 쌍 포함되어있기 때문에 OR gate가 다수 포함되어있음을 확인할 수 있었다. 더불어, FF_BUF로부터 나와 DCT2를 통과해 TP3, TP4로 들어가는 경로가 본 회로의 critical path임을 확인할 수 있었다. DCT2에는 매우 많은 수의 adder와 multiplier가 존재하고, DCT1에 비해 더 큰(비트 수가 많은) 피연산자를 사용하기 때문에 계산에 오랜 시간이 걸리기 때문으로 분석할 수 있다. 좌측 그림은 DCT1 모듈의 block diagram이다. 예상한 바와 같이 수많은 gate와 adder, multiplier 로 이루어져 있음을 확인할 수 있었다. 우측 그림은 TP 메모리의 block diagram 중 일부(입력단 주위) 만을 나타낸 것이다. 입력단 부근에는 메모리를 제어하기 위한 회로(counter 등)가 존재했으며, 수많은 레지스터들이 규칙적으로 길게 배열되어있음을 확인할 수 있었다. - 15 - 8. Result ­ Timing Report 주어진 조건에 따라 본 회로는 100MHz에서 동작하여야 하므로, 클럭 주기를 10ns로 설정 후 timing report를 확인하였다. 100MHz의 클럭에서 본 회로는 MET state임을 확인하였다. 본 회로의 critical path는 - - - 임을 확인할 수 있었다. 이는 [7. Result - Synthesize Result & Critical Path]에서 확인한 바와 같았다. 9. Result ­ Area & Power Report 메모리를 제외한 본 회로의 total cell area는 2,299,358.75μm², total dynamic power는 45.7141mW임을 알 수 있었다. - 16 - [μm²] Total Area 비율 [%] Combinational Non-Combinational top_dct 2299532.25 100 13262.7744 5872.4453 DCT1 453895.5938 19.7 21424.4277 0 DCT2 737962.9375 32.1 13586.2422 0 TP 메모리 1015920.6407 44.2 224312.5078 791612.6248 회로의 면적을 계층 구조로 나타냈을 때 위의 그림과 같았다. 주요 모듈의 면적은 표의 값과 같다. 전체 회로에서 non-combinational area가 863398μm²로 많은 비중(약 38%)을 차지했고, 그 중 대부분을 TP 메모리가 차지함을 확인할 수 있었다. 또, 두 DCT 모듈이 전체 회로의 51.7%의 면적을 차지함을 확인할 수 있었다. 이는 DCT 모듈에는 수많은 adder와 multiplier가 있고, adder와 multiplier 의 면적이 크기 때문이다. Report_area에 따르면 adder는 개당 대략 3000μm² ~ 15000μm²의 면적을 차지했고, multiplier는 개당 대략 8000μm² ~ 28000μm²의 면적을 차지했다. - 17 - # Improvement 1. 개요 [#Implementation]에서 구현한 회로는 [#Pre-Implementation using JAVA]에서 확인했던 최적화 요소들을 포함하고 있지 않다. 이제 [#Implementation]에서 구현한 회로에 최적화 요소들을 더해가면서 area의 감소를 확인할 것이다. [#Pre -Implementation using JAVA]에서 확인한 최적화 요소들과, 그 외에 추가적으로 개선 가능한 요소들은 아래와 같다. 최적화 요소는 손실이 발생하는 요소와 손실이 없는 요소로 나누어볼 수 있기 때문에 구분하여 나타내었다. 손실 발생 요소 손실이 없는 요소 High frequency 제거 Coefficient 근사화 Bitwidth 축소 Transpose 메모리 개선 Multiplier를 Adder(shift adder tree)로 교체중간 계산값 저장을 통해 adder 개수 줄이기 Transpose 메모리 개수 줄이기 이제 각 요소들을 단계별로 적용하면서 회로 면적(area)의 변화와 PSNR 변화(손실 발생 요소의 경우)를 확인한다. 먼저 [#Pre-Implementation using JAVA]에서 확인한 손실 발생 요소를 적용하였고(version 2), 이후 손실이 없는 요소들을 적용해 회로를 최적화 한 다음 PSNR이 29에 근접할 때 까지 bitwidth를 축소하며 회로를 개선하였다. 2. [VERSION 2] DCT 모듈 개선 (손실 有) Top 모듈의 구조를 그대로 유지하면서, DCT 모듈에 [#Pre-Implementation using JAVA]에서 구했던 근사화된 coefficient를 반영하고, high frequency를 계산하지 않도록 회로를 수정하였다. 더불어 값이 1인 비트 개수가 최소화되도록 coefficient를 설계하였기 때문에 multiplier를 adder(shift adder tree)로 교체하여 multiplier로 인해 낭비되는 면적을 줄였다. 위의 코드는 변경 전 코드이고, 아래 코드는 변경 후 코드이다. 변경 후에도 여전히 많은 adder를 포함하고 있기 때문에 block diagram을 그리는 대신 코드를 첨부하였다. - 18 - 합성 후 DCT모듈에는 multiplier가 사라진 대신 중간 계산값들을 저장하기 위한 wire들과 shift를 위한 wire들이 추가된 것을 확인할 수 있었다. 이미지 # 1 2 3 4 5 6 7 8 PSNR 31.0588 35.3745 37.4838 35.1582 29.6890 38.3930 34.1591 39.1670 평균 35.0604 개선 전 대비 평균 PSNR 감소율 1.31% 표준편차 3.1549 PSNR이 29이상일 확률 (정규분포) 97.26% 개선한 모듈을 통해 출력된 2D DCT결과를 가지고 JPEG 이미지를 생성하였다. 생성한 JPEG 이미지와, 각 이미지 들의 PSNR 값은 위와 같았다. 여전히 모든 이미지의 PSNR이 29를 초과하였으며, 많은 비트 손실이 발생했음에도 불구하고 개선 전 대비 평균 PSNR 감소율이 1.31%로 낮게 나타났다. 따라서 본 회로(VERSION 2)는 유효하다고 볼 수 있기 때문에, 본 회로를 기준으로 하여 남은 개선 작업들(손실이 없는 개선들)을 진행하였다. - 19 - 개선 전 [μm²] Total Area 비율 [%] Combinational Non-Combinational top_dct 2299532.25 100 13262.7744 5872.4453 DCT1 453895.5938 19.7 21424.4277 0 DCT2 737962.9375 32.1 13586.2422 0 TP 메모리 1015920.6407 44.2 224312.5078 791612.6248 VER.2 [μm²] Total Area 비율 [%] 감소율 [%] Combinational Non-Combinational top_dct 1611964.2500 100.0 29.90 13262.7754 5872.4453 DCT1 196576.4219 12.2 56.69 72285.6094 0 DCT2 351554.1250 21.8 52.36 82678.4531 0 TP 메모리 991951.5312 61.6 2.36 200342.8946 791612.4686 회로의 면적을 계층 구조로 나타냈을 때 위의 그림과 같았다. 주요 모듈의 면적은 표의 값과 같다. 전체 회로의 면적은 개선 전에 비해 29.90% 감소하였다. 특히 개선이 중점적으로 이루어진 DCT 모듈의 경우 각각 56.69%, 52.36%로 면적이 절반 이상 감소하였다. 개선전에 비해 adder를 더 많이 사용하긴 하지만 multiplier를 완전히 제거함으로써 오는 면적 이득이 더 크다는 것을 알 수 있었다. - 20 - 개선한 회로의 power report와 timing report는 위와 같았다. Power report에서 회로의 total dynamic power가 44.5605mW(2.52% 감소)이고, timing repeport에서 회로가 100MHZ의 클럭에서 MET state임을 확인할 수 있었다. 4. [VERSION 3] Transpose 메모리 개선 [VERSION 2]에서 high frequency성분을 제거함으로써, DCT 모듈의 high frequency 출력은 항상 0으로 고정된다. 따라서 TP 메모리에는 항상 0이 저장되는 플립플롭이 존재하며, 이렇게 낭비되는 요소들을 줄임으로써 non-combinational area를 줄일 수 있다. DCT1 모듈의 출력 84bit 중 하위 28bit는 high frequency 성분이므로 항상 0(28‘h0000000)이다. 따라서 처음 두 개의 TP 메모리(TP1, TP2)는 8 x 8 size가 아닌 8 x 6 size로 개선할 수 있다. 마찬가지로 DCT2 모듈의 출력은 왼쪽 그림과 같이 high frequency를 일부(하위 28bit) 포함하는 6개의 84bit와, high frequency만 존재하는 0으로 이루어진 84bit(84’b00...00) 두개가 반복되어 나타난다. 따라서 마지막 두 개의 TP 메모리(TP3, TP4)는 8 x 8 size가 아닌 6 x 6 size로 개선할 수 있다. Top 모듈의 구조 변경 없이(wire들의 비트수 변경 제외) TP 메모리를 수정함과 더불어, 각 DCT모듈 - 21 - 의 출력 비트도 112bit에서 84bit로 변경해, high frequency는 출력되지 않도록 하였다. 위 그림은 각각 8 x 8 TP 메모리, 8 x 6 TP 메모리, 6 x 6 TP 메모리의 block diagram이다. TP 메모리의 크기가 작아질수록 값을 저장하는 레지스터의 개수나 wire의 수가 줄어듦을 확인할 수 있었다. 이미지 # 1 2 3 4 5 6 7 8 PSNR 31.0588 35.3745 37.4838 35.1582 29.6890 38.3930 34.1591 39.1670 평균 35.0604 개선 전 대비 평균 PSNR 감소율 1.31% 표준편차 3.1549 PSNR이 29이상일 확률 (정규분포) 97.26% 손실이 발생하지 않는 개선 요소이기 때문에, 각 이미지들의 PSNR값은 [VERSION 2]와 같았다. VER.3 [μm²] Total Area 비율 [%] 감소율 [%] Combinational Non-Combinational top_dct 1290207.6250 100.0 43.89 11869.3105 5872.4453 DCT0 196327.3906 15.2 56.75 72882.8516 0 DCT1 355303.5312 27.5 51.85 84088.5938 0 TP 메모리 668207.9533 51.8 34.23 134320.0313 533891.6876 회로의 면적을 계층 구조로 나타냈을 때 위의 그림과 같았다. 주요 모듈의 면적은 표의 값과 같다. - 22 - 전체 회로의 면적은 개선 전에 비해 43.49% 감소하였다. 특히 개선이 중점적으로 이루어진 TP 메모리 모듈의 경우 면적이 개선 전에 비해 34.23% 감소하였다. 개선 전에는 8 x 8 크기의 데이터를 저장하는 TP 메모리가 4개로, 3584bit를 저장(4 * 8row * 8col * 14bit/row·col)하였지만, 개선 후에는 8 x 6 크기의 TP 메모리 2개, 6 x 6 크기의 TP 메모리 2개를 사용하게 되어, 2352bit를 저장(2 * 8row * 6col * 14bit/row·col + 2 * 6row * 6col * 14bit/row·col)하게 된다. 저장하는 데이터의 양이 34.4% 감소하였기 때문에 면적도 이에 거의 비례하여 감소한 것으로 분석할 수 있다. 개선한 회로의 power report와 timing report는 위와 같았다. Power report에서 회로의 total dynamic power가 31.1456mW(30.10% 감소)이고, timing repeport에서 회로가 100MHZ의 클럭에서 MET state임을 확인할 수 있었다. 4. [VERSION 4] DCT 모듈 개선 (손실 無) [VERSION 2]에서 multiplier를 adder로 변경하였지만, 여전히 중복된 계산을 수행하는 adder가 존재한다. 중복된 adder가 존재하지 않도록 일부 adder의 출력을 wiring 하여 adder의 개수를 감소시켰다. 각각의 adder와 shift 연산을 block diagram으로 표현하는 것은 비효율적이므로 block diagram 대신 개선한 코드를 첨부하였다. - 23 - 개선 전에는 57개의 adder(subtracter)와 47개의 shifter가 사용된 반면, 개선 후에는 42개의 adder(subtracter)와 29개의 shifter가 사용되었다. 또한, 기존에는 INPUT 메모리와 OUTPUT 메모리의 address를 관리하기 위해 각각 16bit의 레지스터를 사용하였지만, 이를 하나의 16bit 레지스터만 사용하도록 top 모듈을 개선하였다. 합성 후 top 모듈 내의 레지스터(메모리 address 레지스터)의 절반이 사라진 것을 확인할 수 있었다. 합성 후 DCT모듈 내의 adder의 개수가 감소한 것을 확인할 수 있었다. - 24 - 이미지 # 1 2 3 4 5 6 7 8 PSNR 31.0588 35.3745 37.4838 35.1582 29.6890 38.3930 34.1591 39.1670 평균 35.0604 개선 전 대비 평균 PSNR 감소율 1.31% 표준편차 3.1549 PSNR이 29이상일 확률 (정규분포) 97.26% 손실이 발생하지 않는 개선 요소이기 때문에, 각 이미지들의 PSNR값은 [VERSION 2]와 같았다. VER.4 [μm²] Total Area 비율 [%] 감소율 [%] Combinational Non-Combinational top_dct 1086804.5000 100.0 52.74 11081.3408 3334.3560 DCT0 134409.9219 12.4 70.39 45212.8242 0 DCT1 220284.6719 20.3 70.15 39041.7188 0 TP 메모리 666897.5000 61.4 34.36 133009.5293 533891.6876 회로의 면적을 계층 구조로 나타냈을 때 위의 그림과 같았다. 주요 모듈의 면적은 표의 값과 같다. 전체 회로의 면적은 개선 전에 비해 52.74% 감소하였다. 특히 개선이 중점적으로 이루어진 DCT 모듈의 경우 면적이 개선 전에 비해 각각 70.39%, 70.15% 감소하였다. 앞서 개선한(VERSION 2) 회로의 DCT 모듈에 대해서도 면적이 31.62% 37.34% 감소하였다. 개선한 회로의 power report와 timing report는 위와 같았다. Power report에서 회로의 total - 25 - dynamic power가 30.8877mW(0.83% 감소)이고, timing repeport에서 회로가 100MHZ의 클럭에서 MET state임을 확인할 수 있었다. 5. [VERSION 5] Throughput 조절을 통한 Transpose 메모리 제거 Throughput을 변경하면 안된다는 공지가 추가되어서 본 내용을 삭제합니다. 아래에 다른 방법으로 throughput 감소 없이 TP 메모리를 제거하는 과정을 추가했습니다. DCT 모듈의 경우 초기 버전에 비해 많은 개선이 이루어져서 면적이 약 70% 감소해, 회로에서 32.7%의 면적만을 차지한다. 그에 반해 TP 메모리는 여전히 전체 회로에서 차지하는 면적 비율이 61.4%로 높다. TP 메모리는 입력과 출력이 동시에 이루어질 수 없기 때문에, 두 쌍(네 개)의 TP 메모리를 사용해 회로를 구현해왔다. 하지만 입출력 Throughput을 절반으로 감소시킨다면 두 개의 TP 메모리만으로 회로를 구현할 수 있다. [#Overview ­ 4.]에서 입력 데이터(원본 이미지 데이터)가 사전에 INPUT 메모리 BUFFER에 저장되어있다고 가정하였다. 따라서 메모리의 address를 계산하는 로직을 변경하여 위와 같이 8 cycle 동안 데이터를 메모리에서 가져오고 다음 8 cycle동안은 새로운 값을 가져오지 않도록 조절할 수 있다. 만약, 사전에 데이터가 저장되어있는 것이 아니라, 실시간으로 데이터가 들어오는 상황이 된다면, 앞단에 적절한 구조의 flip-flop을 달아 위와 같이 8 cycle 마다 휴지 기간을 가지도록 조절할 수 있다. 회로에 플립플롭이 없다고 가정하면 변경된 예상 timing diagram은 위와 같다. D는 데이터를, *는 DCT 연산되었음을, T는 transpose 되었음을 의미한다. 기존의 timing diagram에 비해 단위시간당 데이터가 입력/출력 되는 양이 절반으로 줄었음(throughput이 절반으로 감소하였음)을 확인할 수 있다. VER.5 [μm²] Total Area 비율 [%] 감소율 [%] Combinational Non-Combinational top_dct 743565.3125 100.0 67.66% 1376.8705 3508.5381 DCT0 134832.9219 18.1 70.29% 44831.2344 0 DCT1 219272.9219 29.5 70.29% 37863.9297 0 TP 메모리 333697.0469 44.90 67.15% 66770.1875 266928.7422 회로의 면적을 계층 구조로 나타냈을 때 위의 그림과 같았다. 주요 모듈의 면적은 표의 값과 같다. 전체 회로의 면적은 개선 전에 비해 67.66% 감소하였다. 특히 개선이 중점적으로 이루어진 TP 메모리의 경우 면적이 개선 전에 비해 67.15% 감소하였다. - 26 - 5. [VERSION 5] Bitwidth 축소 및 adder 제거 지금까지는 bitwidth를 14bit로 설정해서, DC성분은 MSB 12bit를, AC성분은 LSB 12bit를 값으로 사용하였다. 그러나 하위 비트들은 값의 크기가 매우 작기 때문에(AC성분 기준으로 LSB는 1/1024의 값을 가짐) 무시해도 무방하다. 따라서 bitwidth를 줄이더라도 PSNR에는 큰 영향을 미치지 않기 때문에 bitwidth를 10bit로 조절하였다. 더불어, DCT 모듈에서 X[6], X[7]을 제거한 것처럼, X[5]도 제거하고자 하였으나, [#Pre-Implementation using JAVA]에서 확인한 바와 같이 X[5]제거시 PSNR이 매우 큰 폭으로 떨어짐을 확인하였다. 따라서 X[5]를 완전히 제거하지 않고, X[5]의 일부 성분을 제거하여 adder의 개수를 줄였다. 이미지 # 1 2 3 4 5 6 7 8 PSNR 30.3297 34.4955 35.8714 33.9836 29.0807 36.7461 33.2445 37.6189 평균 33.9123 개선 전 대비 평균 PSNR 감소율 5.60% 표준편차 2.7968 PSNR이 29이상일 확률 (정규분포) 96.08% 개선한 모듈을 통해 출력된 2D DCT결과를 가지고 JPEG 이미지를 생성하였다. 생성한 JPEG 이미지와, 각 이미지 들의 PSNR 값은 위와 같았다. - 27 - VER.5 [μm²] Total Area 비율 [%] 감소율 [%] Combinational Non-Combinational top_dct 789532.2500 100 65.67 8277.8242 3350.9441 DCT0 121213.7812 15.35 73.29 37606.8477 0 DCT1 131191.8281 16.62 82.22 36959.8906 0 TP 메모리 480160.3203 60.82 52.74 97658.6348 382504.1406 회로의 면적을 계층 구조로 나타냈을 때 위의 그림과 같았다. 주요 모듈의 면적은 표의 값과 같다. 전체 회로의 면적은 개선 전에 비해 65.67% 감소하였다. 개선한 회로의 power report와 timing report는 위와 같았다. Power report에서 회로의 total dynamic power가 22.6652mW임을 확인할 수 있었다. 또, timing repeport에서 회로가 100MHZ의 클럭에서 MET state임을 확인할 수 있었다. 6. [VERSION 6] TP메모리 두 개 제거 DCT 모듈의 경우 초기 버전에 비해 많은 개선이 이루어져서 면적이 약 70%~80% 감소해, 회로에서 39.18%의 면적만을 차지한다. 그에 반해 TP 메모리는 여전히 전체 회로에서 차지하는 면적 비율이 60.82%로 높다. - 28 - 지금까지 사용한 TP메모리는 값을 쓰는 동안 출력을 하지 못하였기 때문에, 한 번의 DCT 과정 당 두 개의 TP메모리를 사용해 ping-pong 구조로 회로를 구현하였다. 그러나 TP메모리를 입력과 출력이 동시에 이루어질 수 있도록 개선한다면, 하나의 TP 메모리로 한 번의 DCT를 수행할 수 있다. 다시 말해, 지금까지는 [TP1에 값 가로로 쓰기] - [TP2에 값 가로로 쓰기 & TP1의 값 세로로 읽기] - [TP1에 값 가로로 쓰기 & TP2의 값 세로로 읽기] - [TP2에 값 가로로 쓰기 & TP1의 값 세로로 읽기] 가 반복되었다면, 개선을 통해 [TP1에 값 가로로 쓰기] - [TP1의 값 세로로 읽고 그 자리에 값 쓰기] - [TP1의 값 가로로 읽고 그 자리에 값 쓰기] 와 같이 회로를 만들 수 있다. 합성 후 top 모듈은 위와 같은 block diagram을 가졌다. Critical path는 기존과 유사하게 - - 임을 확인할 수 있었다. [VERSION 4]에서 개선한 output address 레지스터의 제거와, TP 메모리 두 개 제거, 두 TP의 출력간의 OR연산 제거 등을 통해 top 모듈이 간단한 구조로 변경되었다. 이미지 # 1 2 3 4 5 6 7 8 PSNR 30.3297 34.4955 35.8714 33.9836 29.0807 36.7461 33.2445 37.6189 평균 33.9123 개선 전 대비 평균 PSNR 감소율 5.60% 표준편차 2.7968 PSNR이 29이상일 확률 (정규분포) 96.08% 손실이 발생하지 않는 개선 요소이기 때문에, 각 이미지들의 PSNR값은 [VERSION 5]와 같았다. - 29 - VER.6 [μm²] Total Area 비율 [%] 감소율 [%] Combinational Non-Combinational top_dct 674251.2500 100 70.68 1227.5713 2952.8120 DCT0 120392.6094 17.86 73.48 36968.1875 0 DCT1 140223.9844 20.80 81.00 36860.3633 0 TP 메모리 364235.8750 54.02 64.15 149422.7461 214816.2500 회로의 면적을 계층 구조로 나타냈을 때 위의 그림과 같았다. 주요 모듈의 면적은 표의 값과 같다. 전체 회로의 면적은 개선 전에 비해 70.68% 감소하였다. 특히 개선이 중점적으로 이루어진 TP 메모리의 경우 면적이 개선 전에 비해 64.15% 감소하였다. 개선한 회로의 power report와 timing report는 위와 같았다. Power report에서 회로의 total dynamic power가 15.5543mW(44.13% 감소)임을 확인하였다. 또, timing repeport에서 회로가 100MHZ의 클럭에서 MET state임을 확인할 수 있었다. - 30 - 7. 결론 [μm²] 개선 전 VERSION 2 VERSION 3 VERSION 4 VERSION 5 VERSION 6 감소율 [%] top_dct 2299532.25 1611964.2500 1290207.6250 1086804.5000 789532.2500 674251.2500 76.74 DCT1 453895.5938 196576.4219 196327.3906 134409.9219 121213.7812 120392.6094 74.59 DCT2 737962.9375 351554.1250 355303.5312 220284.6719 131191.8281 140223.9844 82.51 TPMem 1015920.6407 991951.5312 668207.9533 666897.5000 480160.3203 364235.8750 76.35 [mW] 개선 전 VERSION 2 VERSION 3 VERSION 4 VERSION 5 VERSION 6 Total Dynamic Power 45.7141 44.5605 31.1456 30.8877 22.6652 15.5543 순차적으로 개선을 거치며 회로의 주요 모듈의 면적과, 회로의 total dynamic power는 위 표와 같이 변화하였다. 이미지 # 1 2 3 4 5 6 7 8 PSNR 30.3297 34.4955 35.8714 33.9836 29.0807 36.7461 33.2445 37.6189 평균 33.9123 PSNR이 29이상일 확률 (정규분포) 96.08% 본 회로를 통해 계산한 2D DCT값을 가지고 생성한 JPEG 이미지들의 최종적인 PSNR값은 위 표와 같았다. ([VERSION 5]와 같음.)

반응형
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그