[Verilog] Inverse Quentization을 수행하는 코드
본 자료는 8페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
해당 자료는 8페이지 까지만 미리보기를 제공합니다.
8페이지 이후부터 다운로드 후 확인할 수 있습니다.

소개글

[Verilog] Inverse Quentization을 수행하는 코드에 대한 보고서 자료입니다.

목차

I. 프로젝트 계획 및 회의록

1. 조원별 역할 분담

2. 프로젝트 계획

3. 회의록

II. 설계 계획 및 배경 이론

1. 설계 계획

2. 배경 이론

III. Verilog 코드

1. IQ.v 코드

2. Romiq.v 코드

3. Romd.v 코드

4. IQ_tb.v 코드

IV. Waveform

V. C++ Romiq, Romd 생성 코드

1. Romiq, Romd생성코드

2. Romiq, Romd 데이터

VI. C++ 검증 코드

VII. MATLAB 검증

VIII. 결론

본문내용

n("v_result_int.txt",
_O_CREAT | _O_TEXT | _O_WRONLY, _S_IREAD | _S_IWRITE);
if(file_int_result<0)
{
printf("File open error!!!\n");
return -1;
}
for(i=0; i<8192 ; i++)
{
real[i]=pow(i,sq)+0.000000000001;
if(i<128)
{
result1[i] = romiq[i];
printf("%d, %f (%f)\n",i,result1[i],real[i]);
}
else if(i<1024)
{
j=i/8;
remain1=i%8%8;
remain=remain1/8.0;
romd1=romd[j];
result1[i] = romiq[j]*16 + romd1*16*remain;
printf("%d, %f (%f)\n",i,result1[i],real[i]);
}
else
{
j=i/64;
remain1=i%64%64;
remain=remain1/64.0;
romd1=romd[j];
result1[i] = romiq[j]*16*16 + romd1*16*16*remain;
printf("%d, %f (%f)\n",i,result1[i],real[i]);
}
calc_sign_bit(result1[i], sign_bit);
calc_int_bits(result1[i], int_bits, sizeof(int_bits));
calc_frac_bits(result1[i], frac_bits, sizeof(frac_bits));
sprintf(buf, "%s%s_%s\n",sign_bit, int_bits, frac_bits);
sprintf(rst, "%s%s%s\n",sign_bit, int_bits, frac_bits);
write(file1, buf, strlen(buf));
for(k=0 ; k<24 ; k++)
{
if(rst[k]=='0')
bit=0;
else
bit=1;
v_result=v_result + (bit << (23-k));
}
sprintf(out, "(%4d)%9d -> %s",i,v_result,buf);
write(file_int_result,out,strlen(out));
sprintf(final, " %4d %13f ( %13f ) result : %7d -> %s",
i,result1[i],real[i],v_result,buf);
write(file_final,final,strlen(final));
v_result=0;
}
close(file1);
close(file_int_result);
close(file_final);
memset(buf, 0x00, sizeof(buf));
file2 = open("Romiq_vin_non.txt",
_O_CREAT | _O_TEXT | _O_WRONLY, _S_IREAD | _S_IWRITE);
if(file2<0)
{
printf("File open error!!!\n");
return -1;
}
for(i=0 ; i<128 ;i++)
{
calc_int_bits(romiq[i], romiq_int_bits, sizeof(romiq_int_bits));
calc_frac_bits(romiq[i], romiq_frac_bits, sizeof(romiq_frac_bits));
sprintf(buf,"%s_%s\n", romiq_int_bits, romiq_frac_bits);
write(file2, buf, strlen(buf));
}
close(file2);
memset(buf, 0x00, sizeof(buf));
file3 = open("Romd_vin_non.txt",
_O_CREAT | _O_TEXT | _O_WRONLY, _S_IREAD | _S_IWRITE);
if(file3<0)
{
printf("File open error!!!\n");
return -1;
}
for(i=0; i<128 ;i++){
calc_int_bits(romd[i], romd_int_bits, sizeof(romd_int_bits));
calc_frac_bits(romd[i], romd_frac_bits, sizeof(romd_frac_bits));
sprintf(buf, "%s_%s\n", romd_int_bits, romd_frac_bits);
write(file3, buf, strlen(buf));
}
close(file3);
}
VII. MATLAB 검증
VIII. 결론
MATLAB으로 검증을 해보니 첫 번째 그래프에서 알 수 있듯이 256개의 데이터로 만든 (그래프상의 빨간선)과 8192개의 데이터로 된 (그래프상의 파란선)은 거의 일치하였다. 두 번째 그래프는 256개 데이터로 근사화된 값과 정확한 값을 빼봄으로써 실제 값의 차이를 나타내었다. 최대 2.2정도의 차이가 나는데 이 값은 백분율로 계산하면 굉장히 작은 오차율임을 알 수 있다. 따라서 무시할 정도의 오차율을 가지고 있다.
가장 어려웠던 점은 처음 Nonlinear quantization의 의미를 파악하는데 있었다. 한번도 접해 보지 못했던 부분이었기 때문에 그 개념을 이해하는데 많은 시간을 소비했던것 같다.
Nonlinear quantization을 이해한 후도 만만치 않았던 것이 메인 알고리즘의 구현이었다. 256개의 데이터만을 이용하여 8192개의 모든 값을 만들어 내어야 했다. 최대한 간단하게 한구역당 하나의 식으로 나타내기 위해 많은 생각을 하였고 결과적으로 Nonlinear quantization을 이용한 식을 구현하게 되었다.
최종적으로 구한 데이터 값을 같은 알고리즘으로 C++로 코딩하여 결과 값을 MATLAB을 이용하여 비교하여 보았다. 결과가 완벽하게 일치 하지는 않았다. 이는 실제로 계산한 데이터값과 프로그램을 통해서 얻게된 값의 차이를 그래프로 그려봄으로써 알 수 있었다. 이러한 차이가 생기는 이유는 최하위 비트가 간혹 한비트식 다른 값을 나타내는 경우가 있었는데 이는 연산과정에서 유효숫자의 처리가 C와 Verilog가 반올림, 버림 식으로 다르기 때문이라고 알 수 있었다.

키워드

  • 가격3,000
  • 페이지수25페이지
  • 등록일2010.09.10
  • 저작시기2010.4
  • 파일형식한글(hwp)
  • 자료번호#630105
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니