ASIC SoC2011. 4. 4. 15:52
2의 보수 체계에서 N-bit 표현을 할 경우에 -2^(N-1)에 해당 하는 Counter part가 없다는 점이 coner case에 해당한다.
예를들어서 5비트로 표현할 경우 -16이 최소 값인데, 최대값은 15이다. 이런 상황에 처하는 것을 Coner case라고 부른다. 즉 -16으로 표현하고 +16으로 ABS를 취할 경우 5비트로 표현이 안되는 경우가 발생하는 것이다.

예를들어서  (-1) x (-1)을 Q1.2 format으로 연산할 경우 아래와 같다.

 


(주) 책에서는 After dropping redundant sign bit의 값이 1 0 0 0 0 0 으로 되어 있다.  
        단순한 계산인데 외 틀리는가 해서 고민을 했다.
       책이 오타이다. 덕분에 2의 보수 체계를 다시 공부해야 했다는 TT_TT
       
하여튼 (-1) x(-1) = 1이 되어야 하는데 Q1.5 format에서는 다시 (-1)이 되는 문제가 발생한다. 이러한 경우를 대비해서 
Conner case를 체크하는 구문을 넣어야 한다. 아래 함수를 보자

Word32 L_mult(Word16 var1,Word16 var2)

{


   Word32 L_var_out;

   L_var_out = (Word32)var1 * (Word32)var2;
 

   if (L_var_out != (Word32)0x40000000L) // 0x8000 x 0x8000 = 0x40000000

  {

        L_var_out *= 2; //remove the redundant bit

  }

  else

  {

       Overflow = 1;

       L_var_out = 0x7fffffff; //if overflow then clamp to max +ve value

   }
 

  return(L_var_out);

}



위의 코드에서 연산의 결과가 Integer MAX값에 도달하면 O/F를 세팅하고 수정하게 한다.
같은 방법으로 4비트 연산을 한 경우의 차이점은 아래와 같다.


4비트 곱셈을 정수로 할 경우에 하위 4비트를 취하고 이때 Overflow여부를 체크할 수 있다.
Q1.3 format으로 한다면 결과에 대해서 Shift 4를 한 뒤에 남은 것을 사용할 수 있다.
4비트 Fixed Point의 한계로 -0.765625를 표현 못하지만, 하여튼 유사 값으로 따라갈 수 있다.

이런것을 이용해서 만든것이 Fixel point Multiplication이다.

 


위의 연산은 Singed / Unsigned , Integer , Q-Format에 대해서 모두 할 수 있는 곱셈기이다. 상황에 맞게 사용할 수 있도록 Operand와 Fractional을 사용할 수 있도록 만들었다.
 

Posted by GUNDAM_IM