1. DAC and it’s Applications
Digital-to-Analog-Converter, 디지털 아날로그 변환 회로)
- 디지털 신호를 아날로그 신호로 변환하는 장치.
2. 이진 표현(Binary Representation)
- 전자 구현 (Electronic implementation)
- 10진수를 사용하지 않는 이유
- 쌍안정 (bistable) 요소로 보관이 용이하다
- 산술 함수의 간단한 구현 (Straightforward implementation of arithmetic functions)
- 시끄럽고 부정확한 전선에서도 안정적으로 전송된다. (Reliable transmitted on noisy and inaccurate wires)
3. 정보 표현 (Representing Information)
- Information = Bits + Context
- 컴퓨터는 사물의 표현을 조작한다.
- 사물은 이진수로 표현된다.
- 2^n개
- 숫자, 문자, 픽셀, 위치, 소스 코드, 실행 파일, 기계 명령 ..
- 어떤 작업을 수행하는 지에 따라 다르다.N비트로 표현 가능한 것은?
4. 인코딩 바이트 값 (Encoding Byte Values)
- Binary(이진수) : 00000000 to 11111111
- 0b/ 0B로 시작하는 정수 상수는 C에서는 이진수.
- Octal(8진수) : 000 to 377
- 0으로 시작하는 정수 상수는 C에서 8진수(파이썬에서는 0o)
- Decimal(10진수) : 0 to 255
- 첫 번째 숫자가 0이어서는 절대 안 됨
- Hexadecimal(16진수) : 00 to FF
- ‘0’~’9’ 및 ‘A’~’F’ 문자를 사용한다.
- C에서 - FA1D37B16을 0xFA1D37B / 0xfa1d37b(0x/0X)로 표시
binary → Decimal ?
- 1이 있는 곳마다 각 자리의 값을 2^n으로 계산해서 더해준다.
- 1111 1111 → 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
- (다 1일 경우, 다음 자릿수 값 -1 하면 됨. 즉, 1 0000 000 -1 = 256 - 1 )
Octal → Decimal ?
- 각 수를 2진수 3자리로 먼저 계산한다. (사실상 8진수를 한 자리 당 7까지만 가능한데, 2진수로 7은 111이므로 2진수 3자리로 바꾸는 것은 당연함.)
- 2진수 3자리를 합쳐서 10진수로 계산하면 끝이다.
- 0 43 → 0b 100 011 → 35
Hexadecimal → Decimal ?
- 각 수/문자를 2진수 4자리로 먼저 계산한다. (사실상 10진수는 한 자리 당 15까지 -F가 15를 의미- 가능하므로 15는 이진수로 1111이라서 2진수 4자리로 바꾸는 건 당연함.)
- 4자리로 바꾼 2진수를 모두 합쳐서 10진수로 계산하면 끝이다.
- 0x D9 → 0b 1101 1001 → 217
Decimal → Octal ?
- 10진수를 2진수로 먼저 변환한다.
- 변환한 2진수를 맨 끝(오른쪽)부터 3칸씩 끊는다.
- 각 3칸을 10진수 값으로 계산해서 각각 한 자리수로 적어준다.
- 63 → 0b 0011 1111 → 0 00 111 111 → 0 111 111 → 0 77
- 64 → 0b 0100 0000 → 0 001 000 000 → 0 100
5. 부호 없는 (이진) 정수(Unsigned (Binary) Integers)
- +나 -가 존재하지 않고, 0과 자연수로 이루어져 있음.
- → 오버플로우/ 언더플로우 발생
- (8비트) 0b 0000 0000 ~ 1111 1111 → 0 ~ 255
- MSB (Most Significant Bit)
- LSB (Least Significant Bit)
- Range : 0 ~ 2^n - 1 (n = bit 수)
- 8비트의 경우, 2^8-1= 256 - 1 =255
6. 부호 있는 정수 (Signed Integer)
- 음수, 0, 양수 // 넓은 숫자의 범위 표현
- 양수 인코딩 (Encoding positive numbers)
- (= 부호 없는 수 인코딩. Unsigned numbers)
- 음수 인코딩 (Encoding negative numbers)
- 부호화 절댓값 표현 (Sign-magnitude representation)
- 1의 보수 표현 (One’s complement representation)
- 2의 보수 표현 (Two’s complement representation)
7. 부호 크기 표현 (Sign-magnitude Representation)
- 문제점 : Two Zeros (+0, -0)
- 부동 소수점에 사용된다. (Floating Point)
- MSB = Sign bit (positive = 0 / negative = 1)
- n비트 - MSB = Magnitude (원래 표현하려던 수를 2진수로 표현한다.)
- Range : -(2^(n-1)-1)~+(2^(n-1)-1)
- (8비트): - (2^7 -1) ~ +(2^7 -1) = -127 ~ +127 (0111 1111 ~ 1111 1111)
8. 1의 보수 표현 (One’s Complement Representation)
- 문제점 : 여전히 0이 두 개
- 1의 보수 방법은 주어진 2진수의 0은 1로, 1은 0으로 대체한 수로 부호 절댓값 방식에서 음수의 순서를 뒤집는 1의 보수 방법을 쓰기로 한다.
- 부호는 음수(-) 일 때, 1로 표기하고, 양수(+) 일 때, 0 으로 표기하기로 한 성질을 유지하면서, 음수와 양수를 단순히 더하는 방식으로 뺄셈을 구현할 수 있다.
- Range : - (2^(n-1)-1) ~ +(2^(n-1)-1)
- 현재 사용 x
- (부호 절대값 방식에서 골치거리였던 것이 깔끔하게 해결된다. 부호와 절대값을 따로 계산하지 않아도 되고, 음수를 더하는 방식으로 뺄셈을 할 수 있게 된다. 단, 캐리가 발생하면 LSB(최하위비트)에 1을 더해줘야 한다.)
- 그런데 여전히 0이 두 개인 것과 캐리를 처리해야 하는 문제가 남아있다. 즉, 0000과 1111을 둘 다 0으로 처리해야 하고, 계산과정에 캐리가 발생됐는지 감시해서 LSB에 1을 더해주는 회로를 구성해야 한다.
9. 2의 보수 표현 (Two’s Complement Representation)
- 0이 하나 (1의 보수에서 값의 범위 1 증가)
- 1의 보수 + 1
- 3 >> 0011 → (1의 보수) 1100 → (2의 보수) 1101 = -3
- Range : - (2^(n-1)) ~ + (2^(n-1) -1)
- 하드웨어에 용이함 (MSB)
- 0 ≥ 0 (0 and positive)
- 1 < 0 (negative)
- 거의 모든 최신 기계에서 사용
- ( MSB가 0이면 양수, 1이면 음수라는 성질이 유지된다.음수의 비교 연산에서 발생하는 모순이 해결된다.덧셈과 뺄셈을 구현할 때 캐리를 처리하지 않아도 된다. )
- [출처] 컴퓨터는 왜 2의보수를 사용할까|작성자 굿맨
- 0이 두 개나 존재하는 모순이 해결된다.
- 음수를 더하는 방식으로 뺄셈을 할 수 있다.
- ~x + 1 = -x
- ~x + x = -1
- ~x + x + (-x + 1) = -1 + (-x +1)
- ~x + 1 = -x
10. 부호 확장 (Sign Extension)
- Signed : w bits → x + k bits
- w비트가 부호 있는 정수라면,
- 동일한 값을 갖는 w + k 비트정수로 변환
- sign 비트는 왼쪽에 복제한다.
- +2 : 0010 —> 0000 0000 0000 0010
- -2 : 1110 —> 1111 1111 1111 1110
- RISK-V instruction(명령어) set 에서
- lb = sign-extend loaded byte
- lbu = zero-extend loaded byte
- w비트가 부호 있는 정수라면,
11. RISC-V lb, lbu
lb (load byte)
lbu (load byte unsigned)
12. Operation
1) C의 비트 수준 연산 (Bit-Level Operation in C)
- &, |, ~, ^ 연산
- 비트 별로 적용
2) AND 연산
- 단어의 비트를 mask 하기 편리하다
- 일부 비트를 선택하고, 나머지는 0으로 지운다.
- mask : 원하는 비트를 추출하기 위한
3) OR 연산
- 단어를 비트에 포함하는 데 유용하다.
- 일부 비트를 1로 설정하고, 나머지는 고정한다.
4) XOR 연산
- Differencing operation
- 일부 비트를 1로 설정하고, 나머지는 고정한다.
5) C의 논리 연산 (Logic Operation in C)
- &&, ||, !
- 0 = “False”, 0이 아닌 모든 것 = “True”
- 항상 1 또는 0 반환
- if else 와 같은 조건문에 일반적으로 사용
- 조기 종료
6) Shift 연산 (시험)
- Left shift : x << y (= x2)
- x를 y만큼 왼쪽으로 이동
- 왼쪽의 남는 비트는 버림 - 산술 시프트의 오버플로우
- 오른쪽을 0 으로 채운다.
- A multiplication by a power of 2
- x를 y만큼 왼쪽으로 이동
- Right shift : x >> y
- x를 y만큼 오른쪽으로 이동
- 오른쪽의 남는 비트 버림
- Logical Shift (논리 시프트)
- 왼쪽을 0으로 채운다
- 오른쪽에 MSB 복제
- 2의 보수 정수 표현에 유용하다
- 대략 나누기 2와 비슷Arithmetic Shift (산술 시프트) (= / 2)
- x를 y만큼 오른쪽으로 이동
- y < 0 , y ≥ word size 인 경우는 아직 정의되지 않았음
13. 정수 연산
1. 정수 덧셈 (Integer Addition)
- 결과가 범위를 벗어날 경우 = 오버플로우
- +ve and -ve : no overflow
- two +ve : sign bit가 1이면, 오버플로우
- two -ve : sign bit가 0이면 오버플로우
2. 정수 뺄셈 (Integer Subtraction)
- 두 번째 피연산자(operand)의 부정(negation) 추가
- 정수+ 정수(2의 보수)
- two +ve / two -ve : NO overflow
- (+ve) + ( -ve) : sign bit가 1이면 오버플로우
- (-ve) + (+ve) : sign bit가 0이면 오버플로우
14. 멀티미디어를 위한 산술 (Arithmetic for Multimedia)
- 그래픽, 미디어 처리는 8bit와 16bit 데이터의 벡터에서 작동한다.
SIMD (single-instruction, multiple-data)
- 하나의 명령어로 여러 데이터를 처리할 수 있는 인텔의 기술
- 64비트 adder 사용, with partitioned carry chain
- operate on 8x8 bit, 4x16 bit, 2x32 bit vectors
15. ALU (Arithmetic Logic Unit, 산술 논리 장치)
- 덧셈, 뺄셈 등의 산술 연산이나 / AND, OR 등의 논리 연산을 수행하는 장치
- CPU내의 비트 단위 연산
곱셈 - Multiplier (시험)
A * B = Product
- A = multiplicand (피승수)
- B = multiplier (승수)
- product = 곱
- product(결과)의 길이 = 연산 길이의 합
- optimized multiplier (최적화된 연산기) - 시험
회로의 단순화/ (multiplicand 레지스터, ALU레지스터 ) 64비트→ 32비트/ multiplicand-shift left / multiplier 레지스터/ multiplier는 product의 오른쪽에 배치/ product의 왼쪽은 모두 0으로 초기화
- 단계를 병렬로 수행 : 추가 + 이동
- 64bit → 32bit로 감소
- 부품 추가 당 1 사이클
- 곱셈 빈도가 낮으면 괜찮다.
- Faster multiplier
- 곱셈 연산 시 adder를 여러개 사용하면 빠른 곱셈이 가능하다. 그러나 하드웨어 리소스를 많이 사용하게 되어 비용이 증가한다. - (31iteration = 31 ALU)
- (비용과 성능의 tradeoff)
- 파이프라인 사용 시 적은 하드웨어 비용으로 높은 성능을 낼 수 있다. (여러 곱셈의 병렬 계산)
- 곱셈 연산 시 adder를 여러개 사용하면 빠른 곱셈이 가능하다. 그러나 하드웨어 리소스를 많이 사용하게 되어 비용이 증가한다. - (31iteration = 31 ALU)
분할 (Division)
- optimized divider (시험⭐⭐⭐⭐⭐)
- Divisor register 64 → 32 bit
- ALU registor 63 → 32 bit
Quetient register→ Remainder Register의 오른쪽에 위치Divisor shift right→ shift는 이제 remainder 레지스터 한 번만 수행
- remainder - division ≤ 0 ? (= 빼고 난 값의 MSB가 1인가)
[기존 remainder로 복귀 && {(remainder<<1) && (Quotient의 LSB = 0 )}] : {(remainder<<1) && (Quotient의 LSB = 1 )}
- 뺄셈(-) 연산 : remainder + (division의 1의 보수 + 1, 즉 2의 보수)
참고
'전공 테트리스 > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] 4. RISC-V 명령어 1 (0) | 2024.05.18 |
---|---|
[컴퓨터구조] 3. Floating points(부동 소수점) (0) | 2024.04.27 |
[컴퓨터구조] 1. 컴퓨터 추상화 및 기술 (2) | 2024.04.27 |