일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 |
29 | 30 | 31 |
- 퀀트
- FOMC
- 제다큐어
- 지엔티파마
- 중국경제
- 코로나19
- 엘론 머스크
- 금리인상
- 유상증자
- DSP
- prometheus
- WTI유
- 반려견치매
- 머신러닝
- WTI
- 주가분석
- 마법공식
- 스크리닝
- 뉴지스탁
- 아모레퍼시픽
- Python
- 국제유가
- 주식투자
- 미국금리
- 기업분석
- 넬로넴다즈
- 테슬라
- 중국증시
- 뇌졸중
- 경제위기
- Today
- Total
Data Analysis for Investment & Control
32bit Floating-point Adder/Subtractor using VHDL 본문
VHDL로 작성한 32bit 부동소수점 프로세서 중 덧셈/뺄셈기입니다. Altera의 Quartus2에서 설계하였습니다.
연산 원리는 대략 아래와 같습니다.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
덧셈/뺄셈기는 각 오퍼랜드의 절대값과 양수인지 음수인지에 따라 아래와 같이 몇 가지의 경우로 연산을 분류할 수 있다. 즉, 오퍼레이션의 종류와 각 오퍼랜드의 부호와 크기에 따른 경우의 수를 분석하여 각 케이스에 맞는 연산 수행을 하도록 정의되어 있다.
l Recognition(4): operand1과 operand2의 부호와 동작 연산이 덧셈 연산인지 뺄셈 연산인지 체크. 부호가 같고 덧셈 연산이면 0, 부호가 다르고 덧셈 연산이면 1, 부호가 같고 뺄셈 연산이면 1, 부호가 다르고 뺄셈 연산이면 0.
l Recognition(3): operand1의 지수부와 operand2의 지수부의 값이 같은지 체크. 같으면 1, 다르면 0.
l Recognition(2): operand1의 지수부와 operand2의 지수부 중 어느 쪽이 더 큰지 체크. Operand1의 지수부가 더 크면 0, operand2의 지수부가 더 크면 1.
l Recognition(1): operand1의 가수부와 operand2의 가수부의 값의 크기가 같은지 체크. 같으면 1 다르면 0.
l Recognition(0): operand1의 가수부와 operand2의 가수부 중 어느 쪽이 더 큰지 체크. Operand1의 가수부가 더 크면 0, operand2의 가수부가 더 크면 1.
각각의 operand와 연산의 종류에 따라 위에서 정한 기준에 따라 아래와 같은 분류로 연산을 재정의한다.
Case |
Case check bit Select[3..0] |
Comment |
1 |
0001 |
Opcode를 고려한 각각의 operand의 부호가 같고 지수부가 다르고 가수부가 다를 경우 |
2 |
0010 |
Opcode를 고려한 각각의 operand의 부호가 같고 지수부가 같고 가수부가 다를 경우 |
3 |
0011 |
Opcode를 고려한 각각의 operand의 부호가 같고 지수부가 같고 가수부가 같을 경우 |
4 |
1001 |
Opcode를 고려한 각각의 operand의 부호가 다르고 operand1의 지수부가 클 경우 |
5 |
1010 |
Opcode를 고려한 각각의 operand의 부호가 다르고 operand2의 지수부가 클 경우 |
6-1 |
1011 |
Opcode를 고려한 각각의 operand의 부호가 다르고 지수부가 같고 operand1의 가수부가 클 경우 |
6-2 |
1100 |
Opcode를 고려한 각각의 operand의 부호가 다르고 지수부가 같고 operand2의 가수부가 클 경우 |
6-3 |
1101 |
Opcode를 고려한 각각의 operand의 부호가 다르고 지수부가 같고 가수부가 같을 경우. 즉 연산 결과가 0이 나오는 경우. |
Opcode와 operand1, operand2를 고려하여 덧셈 또는 뺄셈 연산의 수행 방향이 결정되면 그에 따른 지수의 offset값이나 조정이 필요한 가수 등 연산을 제어하기 위해 필요한 신호 및 데이터를 다른 모듈로 내보낸다.
위의 그림은 덧셈/뺄셈기의 내부의 모듈들을 나타내고 있다. Recognition module에서 opcode와 operand1, operand2를 고려하여 case를 결정하고 이를 기반으로 arrangement module에서 크기가 작은 operand의 가수를 연산을 위해 비트를 조정해서 operation module에 전송한다. Operation module은 case를 고려하여 크기가 큰 operand의 가수와 arrangement module에서 비트가 조정된 operand의 가수를 받아 필요한 연산을 수행하고 그 결과를 rearrangement module로 전송한다. Rearrangement module은 operation module에서 넘겨받은 가수 결과에 따라 지수를 재조정하여 마지막으로 연산 결과를 내보낸다.
위의 내부 모듈들은 모두 concurrent circuit으로 one clock cycle에 모두 처리가 된다. 결과적으로 각 모듈을 구성하는 많은 내부 논리 게이트들이 직렬로 배치가 되기 때문에 clock cycle에 내부 논리 연산을 위한 충분한 시간이 필요하다.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
또한 설계된 Adder/Subtractor의 연산 성능을 시뮬레이션한 결과는 아래와 같습니다.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Arithmetic Unit의 덧셈, 뺄셈, 곱셈 그리고 나눗셈 연산에 대한 예가 아래에 나타나 있다.
Operand1은 π를 소수점 8자리에서 근사화 시킨 값인 3.14159265, Operand2는 자연 상수 e를 소수점 8자리에서 근사화 시킨 값인 2.71828182로 정한다. 이렇게 근사화된 값을 가지고 Arithmetic Unit에서 연산된 결과를 PC에서 double 형으로 연산한 결과와 비교하여 오차가 얼마나 발생하는지 비교하였다.
Add Operation
Operand1: 01000000010010010000111111011010 (≒ 3.14159265)
Operand2: 01000000001011011111100001010100 (≒ 2.71828182)
Result: 01000000101110111000010000010111(≒ 5.85987424850464)
Error: | 5.85987447 - 5.85987424850464 | = 0.00000022149536
Sub Operation
Operand1: 01000000010010010000111111011010 (≒ 3.14159265)
Operand2: 01000000001011011111100001010100 (≒ 2.71828182)
Result: 00111110110110001011110000110000(≒ 0.42331075668335)
Error: | 0.42331083 - 0.42331075668335 | = 0.00000007331665
'Robotics > Hardware' 카테고리의 다른 글
TMS320C2000 DSC 로드맵 (0) | 2009.06.15 |
---|---|
지수함수 근사화 알고리즘 (0) | 2009.06.14 |
32bit Single Precision, the range of value (0) | 2009.06.14 |
32bit Floating-point Multiplier using VHDL (0) | 2009.06.10 |
칩 저항의 규격 (0) | 2009.02.13 |