2024. 4. 24. 02:55ㆍ카테고리 없음
목차
3.1 ALU의 구성 요소
3.2 정수의 표현
3.3 논리 연산
3.4 시프트 연산
3.5 정수의 산술 연산
3.6 부동소수점 수의 표현
3.7 부동소수점 산술 연산
< 3.1 ALU의 구성 요소 >
- 산술 연산장치: 산술 연산들( +, -, ×, ÷ )을 수행
- 논리 연산장치: 논리 연산들(AND, OR, XOR, NOT, TRUE 등)을 수행
- 보수기(complementer): 2진 데이터를 2의 보수로 변환(음수화)
- 시프트 레지스터(shift register): 비트들을 좌측 혹은 우측으로 이동시키는 기능을 가진 레지스터
- 상태 레지스터(status register): 연산 결과의 상태를 나타내는 플래그(flag)들을 저장하는 레지스터(Z,N,C,V)
- ALU의 내부 구성 요소들

< 3.2 정수의 표현 >
1. 정수의 표현
- 2진수 체계: 0, 1, 부호 및 소수점으로 수를 표현

- 부호 없는 정수 표현의 예
00111001 = 57
00000000 = 0
00000001 = 1
10000000 = 128
111111111 = 255
- n-비트 2진수를 부호 없는 정수 A로 변환하는 방법:

2. 소수와 음수의 표현
- 최상위 비트인 a(n-1)의 좌측에 소수점이 있는 소수의 10진수 변환방법


- 음수 표현 방법
> 부호화-크기 표현(signed magnitude representation)
> 1의 보수 표현(1's complement representation)
> 2의 보수 표현(2's complement representation)
< 3.2.1 부호화-크기 표현 >
- 맨좌측 비트는 부호 비트, 나머지 (n-1)개의 비트들은 수의 크기(magnitude)를 나타내는 표현 방식
[예]
+9 = 0 000 1001 +35 = 0 010 0011
-9 = 1 000 1001 -35 = 1 010 0011
- 부호화-크기로 표현된 2진수를 10진수로 변환



- 결점
> 덧셈과 뺄셈을 수행하기 위해서는 부호 비트와 크기를 비교하여 처리하는 복잡한 과정 필요
> 0에 대한 표현이 두 개 존재
0 000 0000 = +0
1 000 0000 = - 0

< 3.2.2 보수 표현 >
1. 보수 표현
- 1의 보수 표현
> 모든 비트들을 반전 ( 0 -> 1, 1 -> 0 )
- 2의 보수 표현
> 모든 비트들을 반전하고, 결과값에 1을 더한다
[예]
+9 = 0 000 1001 +35 = 0 010 0011
-9 = 1 111 0110 (1의 보수) -35 = 1 101 1100 (1의 보수)
-9 = 1 111 0111 (2의 보수) -35 = 1 101 1101 (2의 보수)
- 8-비트 2진수로 표현할 수 있는 10진수의 범위
> 1의 보수: -(2^7 - 1) ~ +2^7 = -127 ~ 128
> 2의 보수: -2^7 ~ +(2^7 - 1) = -128 ~ 127
| 10진수 | 1의 보수 | 2의 보수 |
| 127 | 0 111 1111 | 0 111 1111 |
| 126 | 0 111 1110 | 0 111 1110 |
| ... | ... | ... |
| 2 | 0 000 0010 | 0 000 0010 |
| 1 | 0 000 0001 | 0 000 0001 |
| +0 | 0 000 0000 | 0 000 0000 |
| -0 | 1 000 0000 | - |
| -1 | 1 111 1110 | 1 111 1111 |
| -2 | 1 111 1101 | 1 111 1110 |
| ... | ... | ... |
| -126 | 1 000 0001 | 1 000 0010 |
| -127 | 1 000 0000 | 1 000 0001 |
| -128 | - | 1 000 0000 |
2. 2의 보수 -> 10진수 변환
- 2의 보수로 표현된 양수(an-1 = 0)을 10진수로 변환하는 방법

- 2의 보수로 표현된 음수(an-1 = 1)을 10진수로 변환하는 방법


< 3.2.3 비트 확장 (Bit Extension) >
- 데이터의 길이(비트 수)를 늘리는 방법
> 필요성: 데이터를 더 많은 비트의 레지스터에 저장하거나, 더 긴 데이터와 연산을 수행하기 위해 필요
[예제 3-7]

- 2의 보수 표현의 경우: 확장되는 상위 비트들을 부호 비트와 같은 값으로 세트
- 부호-비트 확장(sign-bit extension)이라 함
[예제3-8]

< 3.3 논리 연산>
1. 기본적인 논리 연산들
| A B | NOT A | NOT B | A AND B | A OR B | A XOR B |
| 0 0 | 1 | 1 | 0 | 0 | 0 |
| 0 1 | 1 | 0 | 0 | 1 | 1 |
| 1 0 | 0 | 1 | 0 | 1 | 1 |
| 1 1 | 0 | 0 | 1 | 1 | 0 |
2. 논리 연산을 위한 하드웨어 모듈
- 하드웨어의 구성
> 입력 비트들은 모든 논리 게이트들을 통과
> 선택 신호들에 의하여 멀티플렉서의 네 입력들 중의 하나를 출력

* Selector가 0,1,2,3을 가리키고 출력할 것을 결정한다

3. N-비트 논리 연산장치
- N-비트 데이터들을 위한 논리 연산장치
> 기본 논리 모듈들을 병렬로 접속
[예] 4-비트 논리 연산장치

4. AND 연산 / OR 연산
- AND 연산: 두 데이터 단어들의 대응되는 비트들 간에 AND 연산 수행
A = 1011 0101
B = 0011 1011
------------------
0011 0001 (연산 결과)
- OR 연산: 두 데이터 단어들의 대응되는 비트들 간에 OR 연산 수행
A = 1001 0101
B = 0011 1011
-------------------
1011 1111 (연산 결과)
5. XOR 연산 / NOT 연산
- XOR 연산: 두 데이터 단어들의 대응되는 비트들 간에 exclusive-OR 연산을 수행
A = 1001 0101
B = 0011 1011
-------------------
1010 1110 (연산 결과)
- NOT 연산: 데이터 단어의 모든 비트들을 반전(invert)
A = 1001 0101 (연산 전)
--------------------
0110 1010 (연산 결과)
6. 선택적-세트 연산 / 선택적-보수 연산
- 선택적-세트(selective-set) 연산: B레지스터의 비트들 중에서 1로 세트된 비트들과 같은 위치에 있는 A레지스터의 비트들을 1로 세트 <OR연산 이용>
A = 1001 0010 (연산 전)
B = 0000 1111
--------------------
1001 1111 (연산 결과)
- 선택적-보수(selective-complement) 연산: B레지스터의 비트들 중에서 1로 세트된 비트들에 대응되는 A레지스터의 비트들을 보수로 변환 <XOR연산 이용>
A = 1001 0101 (연산 전)
B = 0000 1111
-------------------
A = 1001 1010 (연산 결과)
7. 마스크 연산
- 마스크(mask) 연산: B레지스터의 비트들 중에서 값이 0인 비트들과 같은 위치에 있는 A레지스터의 비트들을 0으로 바꾸는(clear하는) 연산 <AND연산 이용>
> 용도: 단어 내의 원하는 비트들을 선택적으로 clear하는 데 사용
A = 1101 0101 (연산 전)
B = 0000 1111
-------------------
0000 0101 (연산 결과)
8. 삽입 연산(삽입 연산 교재 다시 보기)
- 삽입(insert)연산: 새로운 비트 값들을 데이터 단어내의 특정 위치에 삽입
> 방법
1) 삽입할 비트 위치들에 대하여 마스크(AND) 연산 수행
2) 새로이 삽입할 비트들과 OR연산 수행
[예]
A = 1001 0101
B = 0000 1111 마스크 (AND연산)
-------------------
A = 0000 0101 첫 단계 결과
B = 1110 0000 삽입(OR연산)
-------------------
A = 1110 0101 최종(삽입) 결과
9. 비교 연산
- 비교(compare) 연산
> A와 B 레지스터의 내용을 비교 ~> XOR연산
~> 만약 대응되는 비트들의 값이 같으면, A레지스터의 해당 비트를 '0'으로 세트
~> 만약 서로 다르면, A 레지스터의 해당 비트를 '1'로 세트
~> 모든 비트들이 같으면(A = 00000000), Z플래그를 1로 세트
[예]
A = 1101 0101
B = 1001 0110
--------------------
A = 0100 0011 (연산 결과)
< 3.4 시프트(shift) 연산 >
1. 논리적 시프트(logical shift)
: 레지스터 내의 데이터 비트들을 왼쪽 혹은 오른쪽으로 한 칸씩 이동
- 좌측 시프트(left shift)
> 모든 비트들을 좌측으로 한 칸씩 이동
> 최하위비트(A1)으로는 '0'이 들어오고, 최상위 비트(A4)는 버림

- 우측 시프트(right shift)
> 모든 비트들이 우측으로 한 칸씩 이동
> 최상위 비트(A4)로 '0'이 들어오고, 최하위 비트(A0)은 버림
2. 시프트 레지스터(shift register)
- 시프트 기능을 가진 레지스터의 내부 회로

3. 순환 시프트(circular shift)
: 회전(rotate)라고도 부르며, 최상위 혹은 최하위에 있는 비트를 버리지 않고 반대편 끝에 있는 비트 위치로 이동
- 순환 좌측-시프트(circular shift-left): 최상위 비트인 A4가 최하위 비트 위치인 A1으로 이동

- 순환 우측-시프트(circular shift-right)

4. 직렬 데이터 전송(serial data transfer)
- 시프트 연산을 데이터 비트 수만큼 연속적으로 수행함으로써 두 레지스터들 사이에 한 개의 선을 통하여 전체 데이터를 이동하는 동작

[예제 3-18]

5. 산술적 시프트(arithmetic shift): 수(number)를 나타내는 데이터에 대한 시프트
- 방법: 시프트 과정에서 부호 비트는 그대로 유지시키고, 수의 크기를 나타내는 비트들만 시프트
(1) 산술적 좌측-시프트(arithmetic shift-left)
| A4(불변), A3<-A2, A2<-A1, A1<-0 |
(2) 산술적 우측-시프트(arithmetic shift-right)
| A4(불변), A4->A3, A3->A2, A2->A1 |
[예제 3-19]

6. C플래그를 포함한 시프트 연산
- C플래그를 포함한 좌측-시프트(SHLC: shift left with carry)
- C플래그를 포함한 우측-시프트(SHRC: shift right with carry)

- RLC(rotate left with carry): C플래그를 포함하는 좌측 순환 시프트(회전) 연산
- RRC(rotate right with carry): C플래그를 포함하는 우측 순환 시프트(회전) 연산

< 3.5 정수의 산술 연산 >
- 기본적인 산술 연산들

< 3.5.1 덧셈 >
1. 덧셈
- 2의 보수로 표현된 수들의 덧셈 방법
> 두 수를 더하고, 만약 올림수가 발생하면 버림
[예제3-20]

2. 병렬 가산기(parallel adder)
- 덧셈을 수행하는 하드웨어 모듈
- 비트 수만큼의 전가산기(full-adder)들로 구성
- 덧셈 연산 결과에 따라 해당 조건 플래그들(condition flags)를 세트
> C 플래그: 올림수(carry)
> S 플래그: 부호(sign)
> Z 플래그: 0(zeor)
> V 플래그: 오버플로우(overflow)
3. 4-비트 병렬 가산기와 상태 비트 제어회로

4. 덧셈 오버플로우
- 덧셈 결과가 그 범위를 초과하여 결과값이 틀리게 되는 상태
- 검출 방법: 두 올림수(carry)들 간의 XOR를 이용

[예제 3-21]

< 3.5.2 뺄셈 >
1. 뺄셈
- 덧셈을 이용하여 수행(a: 피감수(minuend), B: 감수(subtrahend))
A - (+B) = A + (-B)
A - (-B) = A + B
[예제 3-22]

2. 덧셈과 뺄셈 겸용 하드웨어의 블록 구성도

3. 4-비트 병렬 가감산기(4-bit parallel adder-subtracter)
- 4-비트 데이터들 간의 덧셈(A+B) 및 뺄셈(A-B)를 모두 수행하는 조합회로
- 제어신호 M=0: 덧셈, M = 1: 뺄셈(입력 B의 비트들을 반전하고, 최하위 올림수로서 M을 입력)

4. 뺄셈 오버플로우
- 뺄셈 결과가 그 범위를 초과하여 결과값이 틀리게 되는 상태
- 검출 방법: 덧셈과 동일

[예제 3-23]

< 3.5.3 부호 없는 정수의 곱셈 >
1. 방법
- 각 비트에 대하여 부분 적(partial product) 계산
- 부분 적들을 모두 더하여 최종 결과를 얻음
[예제 3-24]

2. 부호 없는 정수 승산기의 하드웨어 구성도
- M 레지스터: 피승수(multiplicand) 저장
- Q 레지스터: 승수(multiplier) 저장
- 두 배 길이의 결과값은 A레지스터와 Q레지스터에 저장

3. 곱셈이 수행되는 과정에서의 레지스터 내용들


4. 2의 보수들 간의 곱셈
- Booth 알고리즘(Booth's algorithm) 사용
- 하드웨어 구성
> 부호 없는 정수 승산기의 하드웨어에 다음 부분을 추가
~> M레지스터와 병렬 가산기 사이에 보수기(complementer) 추가
~> Q레지스터의 우측에 Q-1이라고 부르는 1-비트 레지스터를 추가하고, 출력을 Q0과 함께 제어 회로로 입력
5. Booth 알고리즘의 흐름도

6. Booth 알고리즘을 이용한 곱셈의 예 (-7x3)
< 3.5.4 나눗셈 >

1. 나눗셈
- 나눗셈의 수식 표현

A: 피제수(dividend) / B: 제수(divisor) / q: 몫(quotient) / r: 나머지 수(remainder)
- 부호 없는 2진 나눗셈
(그림)
2. 부호 없는 2진 나눗셈 알고리즘의 흐름도
3. 2의 보수 나눗셈 방법