목차
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. 결론
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가 반올림, 버림 식으로 다르기 때문이라고 알 수 있었다.
_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가 반올림, 버림 식으로 다르기 때문이라고 알 수 있었다.
소개글