CPU 의 기초 이론
-
Upload
faith-hull -
Category
Documents
-
view
133 -
download
4
description
Transcript of CPU 의 기초 이론
CPU 의 기본적 구성 요소
일반적인 CPU 의 구성 요소 레지스터 ALU & flag 명령 패치 및 명령 실행 모듈
CPU 가 실행되기 위한 가장 기초적 요소메모리
ROM/FLASHRAM (SRAM,DRAM)
초기 CPU 레지스터의 구조 (8비트 )
초기 CPU 의 레지스터 A (Accumulator ) : 데이터 처리의 기본 레지스터 B : A 와 연동하는 보조 레지스터 ALU 는 명령의 종류에 따라 1,2 개의 요소가 필요 한데 A,B
가 기본 요소이다 .2 개 필요 : ADD ; A+B -> A1 개 필요 : RR A ; 오른쪽 로테이션
일반적 레지스터가 여러 개 추가 - 일반 레지스터 . 8086,Z80 : B, C, D, E, H, L 2 개의 레지스터가 결합하여 동작하기도 한다 . BC, DE, HL -> 16 비트 조작 명령도 있음
진화한 구조 레지스터
일반 레지스터의 차이가 없다 .Accumulator 가 처리하는 것을 모든 일반
레지스터가 실행각 레지스터간의 특별한 의미가 없이 동등R0, R1, R2, … RnALU 와 선택적으로 연결되어 계산
ADD R2,R3 ; R2+R3 -> R2
ARM, 68000
8 비트 CPU 의 특수 레지스터 종류
Index 레지스터주로 메모리 주소를 나타내어 데이터를 읽거나 쓸 때
주소값으로 사용6800 : IX, 8051 : DPTR8086,Z80 : 일반레지스터 HL 을 메모리 인텍스로 사용
PC (Program Counter), IP(x86)현재 기계어 명령이 실행되는 있는 메모리의 위치를
나타낸다 . PC 값은 자동으로 처리되기 때문에 임의적으로 값을
바꾸는 명령은 없다 .SP (Stack Pointer)
메모리를 사용한 특수 stack 처리를 위한 메모리의 위치를 지정하는 포인터 값을 갖는다 .
Reset 후 초기 PC 값
A
B. . .
FLAG
data bus
. . .
ALU
주소 기계어 어셈블러 ORG 0000H0000 74 00 MOV A,01H0002 25 02 ADD A,02H0004 F5 A0 MOV 0A0,A0006 02 00 57 JMP MAIN 0009 02 . . . . . .
74
25
02
01
0000
0001
0002
0003
PC=0000
패치 (Fetch ) 을 할 때 PC 사용
A
B. . .
FLAG
data bus
. . .
ALU
주소 기계어 어셈블러 ORG 0000H0000 74 01 MOV A,01H0030 25 02 ADD A,02H0033 F5 A0 MOV 0A0,A
74
명령어 버퍼
명령어 해석
•처음 00 번지 기계어를 읽는다 . •명령어 74 는 다음 데이터를 A 레지스터로 옮기라는 명령으로 규정 -> 해석
25
02
01
740000
0001
0002
0003
PC=0000
Fetch 후 자동으로 PC 값 1 증가
B. . .
FLAG
data bus
. . .
ALU
주소 기계어 어셈블러 ORG 0000H0000 74 00 MOV A,01H0002 25 02 ADD A,02H0004 F5 A0 MOV 0A0,A
74
74
명령어 버퍼
명령어 해석
25
02
•다음 1 번지의 데이터 00 을 읽어 A 레지스터에 넣는다 . •명령 한 개가 종료 됨 .
A 01
01
0000
0001
0002
0003
PC=0001
자동으로 PC 1 증가하여 다음 명령처리
A = 01
B. . .
FLAG
data bus
. . .
ALU
주소 기계어 어셈블러0000 74 00 MOV A,01H0002 25 02 ADD A,02H0004 F5 A0 MOV 0A0H,A
25
명령어 버퍼
명령어 해석
•처음 02 번지 기계어를 읽는다 . •명령어 25 는 다음 데이터를 A 레지스터와 더하라는 명령으로 규정 -> 해석• A+02H -> A 준비
02
01
74
25
0000
0001
0002
0003
PC=0002
명령어 실행 -Machine Cycle
한 명령이 실행되기 까지의 전체 시간Fetch - 기계어 명령 읽기Decode - 기계어 기능 해석Execute - 실행Store - 메모리에 저장
MOV A,02HADD A,02H
MC1 Fetch- 명령어 읽기
MOV A,01H = 7474 01 메모리로 부터 명령어 74 을 읽는 과정이다 .
Address bus
25
02
01
74 0000
0001
0002
0003
PC=0000
B. . .
FLAG
ALU
A
data bus
. . . . . .
명령어 버퍼
제어신호
읽기제어신호
ROM
16
8
CS, OE
EPROM Read Timing
CPU 출력ROM 출력
0000
74
MOV A,01H
8051 코어
MC2 Decode – 명령어 해석MOV A,01H = 7474 01
읽어들인 명령어 74 을 해석 한다 .
Address bus
25
02
01
74 0000
0001
0002
0003
PC=0001
B. . .
FLAG
ALU
A
data bus
. . . . . .
명령어 버퍼 74
Decode
읽기제어신호
ROM
16
8
Decode:74 가 MOV 명령 해석
MOV A,01H
제어신호
MC3 Execute – 명령어 실행
MOV A,01H = 74 0101 다음 데이터을 읽어 A 에 넣기 실행
Address bus
25
02
01
74 0000
0001
0002
0003
PC=0001
B. . .
FLAG
ALU
A 01
data bus
. . . . . .
제어신호
읽기제어신호
ROM
16
8
CS, OE
EPROM Read Timing
CPU 출력ROM 출력
0001
01
MOV A,01H
MC1 Fetch- 명령어 읽기
ADD A,02H = 2525 02 메모리로 부터 명령어 25 을 읽는 과정이다 .
Address bus
25
02
01
74 0000
0001
0002
0003
PC=0002
B. . .
FLAG
ALU
A = 01
data bus
. . . . . .
명령어 버퍼
제어신호
읽기제어신호
ROM
16
8
CS, OE
EPROM Read Timing
CPU 출력ROM 출력
0002
25
ADD A,02H
MC2 Decode – 명령어 해석ADD A,02H = 2525 02
읽어들인 명령어 25 을 해석 한다 .
Address bus
25
02
01
74 0000
0001
0002
0003
PC=0003
B. . .
FLAG
ALU
A
data bus
. . . . . .
명령어 버퍼 25
Decode
읽기제어신호
ROM
16
8
Decode:25 가 ADD 명령 해석
ADD A,02H
MC3 Execute – 데이터 실행
ADD A,02H = 25 0202 다음 데이터을 02 를 읽는다 .
Address bus
25
02
01
74 0000
0001
0002
0003
PC=0003
B. . .
FLAG
ALU
A 01
data bus
. . . . . .
제어신호
읽기제어신호
ROM
16
8
CS, OE
EPROM Read Timing
CPU 출력ROM 출력
0003
02Oper and 버퍼 02
ADD A,02H
MC4 Execute – 더하기 실행ADD A,02H = 25 02
ALU 을 이용하여 A+operand 실행
Address bus
25
02
01
74 0000
0001
0002
0003
PC=0004
B. . .
ALUALU
data bus
. . . . . .
Operand 02
Decode
읽기제어신호
ROM
16
8
ALU: ADD 선택
A = 01 -> 03
FLAGFLAG
01 02
03
제어 : ADD
Z=0,C=0, N=0, Z=0,C=0, N=0, V=0, P=0V=0, P=0
ADD A,02H
MC1 Fetch- 명령어 읽기
MOV 0A0H,A = F5F5 A0 메모리로 부터 명령어 F5 을 읽는다 .
Address bus 25
02
01
74 0000
0001
0002
0003PC=0004
B. . .
FLAG
ALU
A=03
data bus
. . . . . .
명령어 버퍼
제어신호
읽기제어신호
ROM
16
8
CS, OE
EPROM Read Timing
CPU 출력ROM 출력
0004
F5
MOV 0A0H,A
F5F5
A0
0004
0005
MC2 Decode – 명령어 해석MOV 0A0H,A = F5F5 A0
읽어들인 명령어 74 을 해석 한다 .
Address busPC=0005
B. . .
FLAG
ALU
A=03
data bus
명령어 버퍼 F5
Decode
읽기제어신호
16
8
Decode:F5 가 MOV 명령 해석
25
02
01
74 0000
0001
0002
0003
. . . . . .
ROM
F5
A0
0004
0005
MOV 0A0H,A
MC3 Execute – 명령어 실행
MOV 0A0H,A = F5 A0A0 저장할 주소값 읽기
Address busPC=0005
B. . .
FLAG
ALU
A = 03
data bus
제어신호
읽기제어신호
16
8
CS, OE
EPROM Read Timing
CPU 출력ROM 출력
0005
A0
25
02
01
74 0000
0001
0002
0003
. . . . . .
ROM
F5
A0
0004
0005
MOV 0A0H,A
Oper and A0
MC4 Store – 데이터 저장
MOV 0A0H,A = F5 A0 읽힌 주소값 (A0) 을 이용 RAM 쓰기
Address busPC=0006
B. . .
FLAG
ALU
A = 03
data bus
제어신호
읽기제어신호
8/16
8
CS, WE
CPU 출력CPU 출력
A0
03
25
02
01
749E
9F
A0
A1
. . . . . .
내부 RAM
F5
A0A2
A3
MOV 0A0H,A
Oper and A002
00
30
. . .
FF
54
03
8051 의 RAM은 내부에 있는 것이므로 8비트 주소값을 갖는다 .그러나 통상 8비트 CPU 는 주소는 16비트이다 .
RAM Write Timing
MC3 Store – 데이터 저장
MOV @DPTR,A 읽힌 주소값 (A0) 을 이용 RAM 쓰기
Address busPC=0006
B. . .
FLAG
ALU
A = 03
data bus
제어신호
읽기제어신호
16
8
CS, WE
CPU 출력CPU 출력
5011
03
25
02
01
74500F
5010
5011
5012
. . . . . .
외부 RAM
F5
A05013
5014
MOVX @DPTR, A 현재 DPTR=5011
DPTR = 501102
00
30
. . .
FF
54
03
RAM Write Timing
PC 값이 자동으로 진행하지 않는 경우
PC 는 CPU 가 실행하면서 현재 실행 시점에서 자동으로 증가하면 다음 명령을 실행
필요에 따라 다음 명령이 아닌 곳으로 실행을 옮길 필요가 있는데 이것은 기계어 명령에 따라 이루어 진다 .Jump 명령CALL / RET 명령
8 비트 CPU 의 PC 는 16 비트 레지스터 이므로 최대 64K 바이트 내에서 기계어 코드가 실행 된다 .
플래그 (FLAG) 의 개념과 종류
ALU 산술연산 , 논리연산 , 쉬프트 등의 결과로 발생되는 상태를 나타내고 CPU 에 저장하여 , 이 상태를 사용하는 명령에 의해 명령 고려 시 참조된다 .
수학적 2 진법 계산에서 주로 언급되는 이론수학적 계산을 할 때 , 디지털 회로에서 정해진
비트로 설정하고 계산한다 .CPU 마다 취급되는 종류는 약간씩 다르나
기본적인 것은 모두 가지고 있다 .
플래그의 종류
C (Carry) : 어떤 연산결과 맨 앞의 비트 계산 결과 발생되는 자리 올림 값 . 더하기 할 때는 carry 빼기 할 때는 borrow
Z (Zero) : 계산 결과가 모두 0 일 때 Carry 비트는 제외
V (Overflow) : 계산 결과 레지스터가 취급할 수 값의 범위를 넘었을 때 발생
S (Sign) : 맨 앞의 비트 (MSB) 가 1 일 때 음수를 나타낸다 .
P (Parity) : 계산 결과 값에서 1 의 개수가 홀수 개 인지 짝수개 인지를 나타낸다 .
AC(Auxiliary Carry) : 8 비트 CPU 에서 3 번째 비트를 연산한 결과의 Carry/Borrow 값
8 비트 계산의 C 와 AC
char inum; inum = -3; inum += 2;
0000 0011 : 3 1111 1100 : 3 의 1 의 보수 1111 1101 : 3 의 2 의 보수 = 1 의 보수 + 1 => -3
0 1111 1101 : (-3) 0 0000 0010 : + 2----------- ADD 0 1111 1111 : (-3) + 2 => -1
맨 앞의 비트에서 더할 때 carry 가 발생하지 않아C = 0 (clear) 되고 AC=0
0
Carry 예 2
char inum; inum = -3; inum += -2;
0 1111 1101 : -30 1111 1110 : -2---------- + ADD1 1111 1011 : (-3) + (-2) => -5
맨 앞의 비트에서 더할 때 carry 가 발생하여C=1 (set) 되고 AC=1
1
로테이션 명령에서 carry 와 함께
RRC A : RRC (Rotate Right with Carry)
0 → 1111 1101 → C C=1
RLC A : RLC (Rotate Left with Carry)
C ← 1111 1101 ← 0 C=0
A 레지스터
A 레지스터
Zero 예 (8 비트 )
char inum; inum = -3; inum -= 3;
0 1111 1101 : -30 0000 0011 : 3----------- SUB 0 0000 0000 : (-3) - 3 => 0
연산결과 0 이 나와 Z=1(set), C=0(clear)
S (Sign), N(Negative)
char inum; inum = -3; MOV A,#0FDH inum += 2; ADD A,#02
0 1111 1101 : -30 0000 0010 : 2----------- ADD 0 1111 1111 : (-3) +2 => -1
연산결과 -1 이고S=1(set), Z=0(clear), C=0(clear)
V (Overflow)
-127 -1 = 80H – 01H => 127 : V=1, C=0, S=0
0 1000 0000 : 80H = -1280 0000 0001 : 01H = 1---------- : SUBB 0 0111 1111 : -128 - 1 = +127
-128 - 1 = -129 와 같이 결과가 나와야 하지만8 비트의 제한 때문에 127 이 나와 한계를 넘는경우를 overflow 라고 한다 .V=1(set) 로 됨
char icn;icn = -127;icn -= 1;
CLR CMOV A,#80HSUBB A,#01
V (Overflow)
126 +3 = -127 : V=1, C=0, S=1
0 0111 1110 : 1260 0000 0011 : 3---------- : ADD 0 1000 0001 : 126 + 3 = -127
126 + 3 = 129 와 같이 결과가 나와야 하지만8 비트의 제한 때문에 -127 이 나와 127 보다 큰 수가될 수 없고 한계를 넘는 경우를 overflow 라고 한다 .V=1(set) 로 됨
char icn;icn = 126;icn += 3;
CLR CMOV A,#126SUBB A,#03
P (Even Parity )
char inum; inum = -3; MOV A,#0FDH inum += 2; ADD A,#02
0 1111 1101 : -30 0000 0010 : 2----------- ADD 0 1111 1111 : (-3) +2 => -1
연산결과 값은 -1 이고 , 1 의 개수가 8 개로 짝수이다 . 이 때 P=1 로 set 됨 .
P=1(set), S=1(set), Z=0(clear), C=0(clear)
스택 (Stack) 의 개념
스택은 데이터를 저장하거나 꺼내 사용할 때 , 저장하는 방식을 말한다 .
마지막에 넣은 데이터를 우선 꺼내지는 구조이다 .
데이터 넣기PUSH
데이터 꺼내기POP
스택 구조를 지원하기 SP 레지스터 사용
메모리에 데이터를 넣고 빼기 위해 주소값을 저정하기 위한 포인터가 필요한데 이것이 SP 레지스터 이다 .
SP 는 특정 명령이 실행되며 자동으로 증가하거나 감소 한다 .
PUSH POP
SP
메모리
레지스터
8 비트 CPU 의 스택의 억세스 순서
스택에 넣을 때는 PUSH 명령을 사용 한다 .
PUSH
00FF
메모리
00FF
00FE
00FD
00FC
주소
MOV SP,#00FFH
SP
00FF 00FF
00FE
00FD
00FC
주소
SP
MOV A,#10PUSH A
10
00FE
00FF
00FE
00FD
00FC주소
SP
10
PUSH A 실행 과정
1. SP 가 가리키는 주소에 10 을 넣는다 .
2. SP 가 1 이 자동감소
XX
스택의 억세스 순서 step2
기계어 데이터를 꺼내려면 POP 명령을 사용
읽기
00FF 00FF
00FE
00FD
00FC
주소
SP
POP A
10
00FE
00FF
00FE
00FD
00FC
주소
SP
10
POP A 실행 과정
2. SP 가 가리키는주소에서 값을 읽는다
1. SP 가 1 이 자동증가
10 A
3. 읽혀진 값을 A 에 저장
00FF
8051 스택의 억세스 순서
기계어 데이터를 넣으려면 PUSH 명령을 사용
5F
내부메모리
5F
62
61
60
주소
MOV SP,#5FH
SP
60SP
MOV A,#10PUSH A
60SP
PUSH A 실행 과정
2. SP 가 가리키는 주소에 A=10 을 넣는다 .
1. SP 가 1 이 자동증가
5F
62
61
60
주소
105F
62
61
60
주소
10 A
8051 스택의 억세스 순서 step2
기계어 데이터를 꺼내려면 POP 명령을 사용
읽기
POP A
주소
POP A 실행 과정
1. SP 에서 읽어 A 에 저장 한다 .
10 A 레지스터
2. SP 을 1 감소 한다 .
60
62
61
60SP 5F
10
주소
60
62
61
60
SP 5F
10
주소
5F
62
61
60
SP5F
10
8051 의 레지스터
A
B
R0
R1
R3
R4
R2
R5
R7
R6
DPH DPL
PC
DPTR
PC 16 비트
SP스택
포인터
CY AC F0 RS1 OVRS0 P--FLAGPSW
ALU 와연동
범용
8 비트 – 내부 RAM 만 사용
16비트
8 비트
8 비트
8086 레지스터
A : Accumulator General registers:
B,C, BC (data pointer) D,E, DE (data pointer) H,L, HL (reference memory address)
PC (Program counter,16 비트 ) SP (Stack pointer,16 비트 )-stack
2 씩 증가 /감소 . FLAG
S : Sign Z : Zero AC : Auxiliary carry - carry 3 비트의 결과 ->4 비트에 영향 P : Parity – even parity (1 의 숫자가 짝수개 일때 , 1) C : Carry – 더하기 (carry), 빼기 /비교 (borrow)
메모리메모리
CPU 의 기본 이론
• EPROM (8 비트의 시스템에서 주로 사용 )• SRAM (8 비트의 시스템에서 주로 사용 )• DRAM (ARM 등 임베디드 시스템에서 주로 사용 ) 고 용량의 메모리에 필요
메모리의 엑세스
CPU 가 프로그램을 읽어 실행하기 위해 필요
변수의 값을 설정 하기 위해MOV/MOVX 등의 값 설정
스택을 사용할 경우PUSH/POP 명령에 의한 스택 사용CALL/RET 에 의한 복귀 주소 처리인터럽트 /RETI 에 의한 복귀 주소 처리
CPU 는 억세스 하기 위한 신호
현재 메모리의 억세스 인가를 나타내는 신호와 억세스 방향 (read/write) Z80 : MREQ, RD, WR
MREQ=0 이고 RD=0,WR=1 인 동안 메모리 읽기MREQ=0 이고 WR=0,RD=1 인 동안 메모리 쓰기프로그램과 데이터 /변수영역의 구분이 없다 .
8051 : RD, WR, PSEN, ALE프로그램 메모리와 데이터 /변수 영역 구분 있음RD=0 이고 WR=1,PSEN=1 : 데이터 메모리 읽기RD=1 이고 WR=0,PSEN=1 : 데이터 메모리 쓰기RD=0 이고 WR=1,PSEN=0 : 프로그램 메모리 읽기RD=1 이고 WR=0,PSEN=0 : 프로그램 메모리 쓰기
CPU 와 메모리
CPU 의 신호에 따라 Read/Write 한다 .
CPU
Decoder
ROMAddress Bus A[n:0]
Data Bus D[7:0]
RAM
•메모리 제어 신호 발생•ARM 등의 임베디드 칩은 CPU 내에 포함
RD/WRPSEN
CS OE
CS RD WR
메모리의 구조 – 신호
메모리는 여러 개의 데이터 저장이 필요하므로 각 데이터의 위치를 결정하기 위한 주소 값이 필요 - Address Bus
한 번에 읽거나 쓰기 때 , 여러 비트의 데이터 처리를 위해 데이터 신호가 필요 – Data Bus (1,8,16,32 비트 )
읽거나 쓸 때 정확한 시점을 결정하기 위한 신호 ( CS – Chip Selector)
RAM 의 경우 읽거나 쓰기를 결정하기 위한 신호 (RD / WR )
ROM 의 경우 읽을 때 , 데이터의 출력을 결정하기 위한 신호 (OE)
메모리의 구조 – ROM 신호
A[n:0] – Address Bus : 신호의 라인수는 칩의 용량과 관계가 있다 .
D[7:0] – Data Bus : 한번에 8 비트 단위로 읽는다 .
CS (CE) : 읽거나 쓰는 시점을 결정한다 . Active 에서만 데이터를 읽거나 쓴다 .
OE(Output Enable) : 읽을 때 데이터를 출력 한다 . 이것이 deactive 되면 데이터 버스는 끊어 진다 ( 하이 임피던스 ).
CS, OE 의 신호는 0 일 때 active 된다 .
메모리의 구조 – SRAM 신호
A[15:0] – Address Bus : 신호의 라인수는 칩의 용량과 관계가 있다 .
D[7:0] – Data Bus : 한번에 8 비트 단위로 읽는다 .
CS : 읽거나 쓰는 시점을 결정한다 . Active 에서만 데이터를 읽거나 쓴다 .
WE : CS 가 active 시점에서 쓰기를 한다 .OE(Output Enable) : 읽을 때 데이터를 출력
한다 . 이것이 deactive 되면 데이터 버스는 끊어 진다 ( 하이 임피던스 ).
CS, WE, OE 의 신호는 0 일 때 active 된다 .
CPU 와 메모리
CPU 의 메모리 처리 한계CPU 가 처리할 수 있는 메모리의 한계가 있다 .
CPU 의 레지스터가 주소 지정을 할 수 있는 공간8 비트 CPU 대부분 16 비트 주소를 갖는 64Kbyte
임 .
CPU 의 메모리 배치 방법프로그램과 변수 /데이터 영역이 구분되지 않은
경우 대부분의 CPU 는 여기에 속함 )
프로그램과 변수 /데이터영역이 구분8051 계열
CPU 의 메모리 처리 한계
CPU 가 정해진 길이 만큼의 메모리 한계필요에 따라 메모리의 용량을 결정프로그램과 데이터 영역의 구별이 없는 CPU 경우 예
AddressBus A[15:0]
32K
16K
16K
0000
7FFF8000
BFFFC000
FFFF
ROM
RAM1
RAM2
MREQRDWR
A15A14
A15=0 CS
CS
CS
A15=1,A14=0
A15=1,A14=1
CPU
디지털 로직
Address
decoder
메모리 배치 개념시스템이 필요한 용량만큼의 메모리 설계
00
011011
0
1
0
1
000001
010011
100101
110
111
CPU측에서 본 주소값ROM 칩 1
RAM 칩 2
RAM 칩 3
CSOE
A0A1
CSRD
A0
WR
CSRD
A0
WR
A0A1
RDWR
A2
MEMREQ
CPU 신호
ROM 칩 1 의 CS 신호 논리
MREQ A2 A1 A0 Out
0 0 X X 0
0 1 X X 1
1 0 X X 1
1 1 X X 1
MREQ A2 Out
0 0 0
0 1 1
1 0 1
1 1 1
RAM 칩의 CS 신호 논리
MREQ A2 A1 Out
0 0 0 1
0 0 1 1
0 1 0 0
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 1
1 1 1 1
Out = MREQ A2 A1
= MREQ + A2 + A1
논리 식
포트 (Port)
장치에서 시스템 구성 상 상황에 따라 디지털 입출력이 필요 출력 : 어느 장치를 제어하기 위한 디지털 1 비트
출력 CPU 가 한번 쓰기를 하면 이 상태가 다음 쓰기전에는 유지해야 한다 .
입력 : 디지털 입력 0,1 의 상태를 읽음 keypad
포트는 간단 디지털의 1 비트만을 입 /출력 주로 8 비트 단위로 입출력 -CPU 마다 다름
디지털 입 . 출력
디지털 출력은 필요한 비트 만을 설계 초기의 CPU 는 TTL 를 사용 하였다 .
출력 :D-FF/LATCH 을 이용 입력 : 74244 등의 버퍼 사용
MCU/ 임베디드는 칩 내부에서 지원 메모리가 내부에 존재하므로 밖에 있는
메모리를 억세스 할 필요가 없다 . 칩의 핀을 포트로 사용하도록 진화 하였다 . 각 핀을 선택적으로 디지털 입 .출력과
특수목적으로 선택할 수 있다 .
디지털 출력 초기의 CPU 는 TTL 의 D-FF/LATCH 을 이용
AddressDecoder
Data Bus D[7:0]
RD/WRPSEN
AddrBus
D
CLK
Q
D
CLK
Q
D
CLK
Q
D
CLK
Q
D
CLK
Q
D
CLK
Q
D
CLK
Q
D
CLK
Q
D0
D1
D2
D3
D4
D5
D6
D7
74374
출력 8 비트
CPU
디지털 입력 초기의 CPU 는 TTL 의 D-FF/LATCH 을 이용
AddressDecoder
Data Bus D[7:0]
RD/WRPSEN
AddrBus
D0
D1
D2
D3
D4
D5
D6
D7
74541
8 비트 입력
CPU
포트 - 입출력의 구현 ( 범용 )
D
CLK
Q
D-FF
출력 CLK
Data bus
출력 Write
외부 입력 읽기
입출력을 선택적으로 사용한다 . 프로그램에 의해 입출력 선택 ( 레지스터 사용 )
PT7 PT6 PT5 PT4 PT3 PT2 PT1 PT0
D[7:0]
. . .
출력 Data 읽기
P0D0
포트가 입력인지 출력인지를 결정하는 레지스터
1 : 출력0 : 입력
8 개의 D-FF 사용D
CLK
Q
PortPort
입력은 제어필요없다 .
PT0 가 1 이면출력 버퍼가 D-FF을 핀에 출력 한다 .
포트의 개수 - 처리단위
출력 CLK
8 개의 포트를 하나로 묶어 사용 입출력 선택 및 제어를 위한 레지스터 – 8 개 단위
PT7 PT6 PT5 PT4 PT3 PT2 PT1 PT0
D[7:0]
. . .
PA0
PT0 가 1 이면출력 버퍼가 D-FF을 핀에 출력 한다 .
포트가 입력인지 출력인지를 결정하는 레지스터
PortPort
D
D
D
. . .
PA1
PA7
PA.0
0,1,2,3,4,5,6,7
A,B,C,D,E, . . .0,1,2,3,4, . . . PA3, PB2
P1.3, P0.1
D0
D1
D[7:0]
DataBus
. . .
포트를 출력으로 사용
D
CLK
Q
D-FF
Data bus
출력 Write
외부 입력 읽기
출력 선택 : PT 레지스터에 1 을 설정한다 . 포트의 D-FF 에 원하는 로직을 쓴다 .
0 0 1 0 0 1 1 1PTA
. . .
출력 Data 읽기
PA0
D0
PT0 가 1 이므로출력 버퍼가 D-FF 을 핀에 출력 한다 .
레지스터에 1 을 쓰면 출력 선택
1 : 출력
PT0
입력은 제어필요없다 .
PT1PT2PT3PT4PT5PT6PT7
출력한 데이터를 다시 읽기
D
CLK
Q
D-FF
Data bus
출력 Write
외부 입력 읽기
출력 선택 : PT 레지스터에 1 을 설정한다 . 포트의 D-FF 에 원하는 로직을 쓴다 .
0 0 1 0 0 1 1 1PTA
. . .
출력 Data 읽기
PA0D0
PT0 가 1 이므로출력 버퍼가 D-FF 을 핀에 출력 한다 .
레지스터에 1 을 쓰면 출력 선택
1 : 출력
PT0
외부입력은 제어필요없다 .
PT1PT2PT3PT4PT5PT6PT7
포트를 입력으로 사용
D
CLK
Q
D-FF
Data bus
출력 Write
외부 입력 읽기
출력 선택 : PT 레지스터에 1 을 설정한다 . 포트의 D-FF 에 원하는 로직을 쓴다 .
0 0 1 0 0 1 1 0PTA
. . .
출력 Data 읽기
PA0D0
PT0 가 0 이므로출력 버퍼가 Z 상태
레지스터에 0 을 쓰면 출력 해제
0 Z
PT0
입력할 때 만 읽어 들이면 된다 .
PT1PT2PT3PT4PT5PT6PT7
포트의 멀티기능 출력 디지털 입출력과 다른 하드웨어 출력 선택적으로 사용 예 : 디지털 입출력과 UART 의 핀으로 사용 UART_ENABLE
레지스터 비트를 1 로 설정하면 UART 쪽의 버퍼를 활성화
D
CLK
Q
D-FF
Data bus
출력 Write
외부 입력 읽기
출력 Data 읽기
P3.1/TxD
D10
포트출력은 무시포트 입출력 레지스터는 무시된다 .
0 0 1 0 0 1 X 1PT3
출력버퍼 Shift Register
X X X X X X X 1
UART 제어레지스터
UTxD_ENABLE
Z
TxD
P3.1
PT3.1
UART
모듈
포트의 멀티기능 입력 디지털 입출력과 다른 하드웨어 출력 선택적으로 사용 예 : 디지털 입출력과 UART 의 핀으로 사용 UART_ENABLE
레지스터 비트를 1 로 설정하면 UART 쪽의 버퍼를 활성화
D
CLK
Q
D-FF
Data bus
출력 Write
외부 입력 읽기
출력 Data 읽기
P3.0/RxD
D10
포트출력은 무시포트 입출력 레지스터는 무시된다 .
0 0 1 0 0 1 0 XPT3
입력버퍼 Shift Register
X X X X X X X 1
UART 제어레지스터
RxD_ENABLE
Z
RxD
P3.0
PT3.0
UART
모듈
키패드 (keypad)
키패드는 장치의 특성에 개수는 결정키의 개수와 CPU 의 포트의 수에 따라
회로를 결정개수가 적을 경우 CPU 포트 하나에
하나의 키로 설계개수가 많으면 매트릭스 형태로 설계
소프트에서 처리
키가 눌리면 논리 1 -> 0 로 바뀜만약 포트의 인터럽트가 가능하면
인터럽드 사용 인터럽트가 발생하면 키를 읽어 확인키에 맞는 기능 수행
인터럽트 불가능하면 계속 키가 눌렸는지 확인키가 눌리면 이에 맞는 동작 실행
키가 많을 때 (4x4=16 키 )
VDD
R출력 회로
CPU 포트 출력TTL D-FF
CPU 포트 입력TTL(74244)
11 22 33
◀◀
44 55 66
▶▶
77 88 99
** 00 ##
RR
Run/Run/StopStop
매트릭스 키의 신호처리
키가 눌리면 인터럽트 신호 발생하는 경우어느 키 인지를 감지하는 프로그램 실행키에 맞는 동작 실행
인터럽트가 불가능 하면 키 눌렸는지 확인 어느 키 인지를 확인하고 동작 실행
어느 키인지를 확인하는 절차 -1
키 대기 상태에서 R[3:0] 에 모두 0 을 출력하고 키입력을 가다린다 . 만약 어느 비트라도 0 이 입력되면 키가 눌렸음을 확인을 안다 .
VDD
R
키출력R0
R1
R2
R3
C0C1C2C3 D0D1D2D3
0
0
0
0
1011
키입력
키 확인 절차 - 2
우선 R0 에 을 나머지는 0 을 나머지는 1 을 출력하고 키입력 값을 읽는다 . 입력된 키 값이 모두 1 이므로 R0 줄의 모든 키는 입력이 되지 않았음 .
VDD
R
키출력R0
R1
R2
R3
C0C1C2C3 D0D1D2D3
0
1
1
1
1111
키입력
키확인 절차 - 3
VDD
R
출력R0
R1
R2
R3
C0C1C2C3 D0D1D2D3
1
0
1
1
1011
R1 에 0 을 나머지는 1 출력하고 키입력값 C[3:0] 을 읽는다 . 키입력값에 두번째 비트가 0 임을 확인
키확인 절차 - 4
VDD
R
출력R0
R1
R2
R3
C0C1C2C3 D0D1D2D3
1
1
0
1
1111
R1 에 0 을 나머지는 1 출력하고 키입력을 한다 . 키입력을 하면 두번째 비트가 0 임을 확인
키을 읽을 때의 문제점
키의 전자 신호는 보통 채터링이라는 신호 형태를 띤다 .
A키 off
B키 눌림
C불안정
D안정
E키 떨어짐
F불안정
A키 off
• 키가 눌리면 변화 과정에서 C 와 F 와 같은 불안정 상태를 거친다 .• CPU 는 이것의 상태를 수정할 수 있는 프로그램이 필요하다 .- 키를 누르면 2 번 실행할 경우 이 문제 때문 일 수 있다 .
LCD
문자형 LCD 정해진 문자를 쓸수 있다 . (ASCII) 간단한 구조 – CPU 와의 인터페이스가 간단 .
그래픽형 LCD STN-LCD : 흑백으로 적은 사이즈의 LCD TFT-LCD : 휴대장치나 기타
그래픽 처리 때문에 LCD 드라이버가 복잡 그래픽 메모리가 필요 메모리로 부터 고속 전송 필요 임베디드에서는 내부의 DMA 등으로 그래픽
데이터 전송
문자 LCD 모듈 내부 블록도
LCD Controller & Driver IC
CPUCG
RAMCG
ROM
LCD
ControllerPower Supply
DC/DC converter
Memory
DDRAM
Driver
CommonDriver
SegmentDriverCGRAM CGROM
LCD 화면과 1:1 로 대응하는
ASCII 코드
User 가 원하는 FONT 를 만들어서
저장하는 RAM
LCD 화면에Display 될 글자
데이터 (font) 를 저장
Data register
LCD 내부 Register 와 신호 흐름
입출력버퍼
CGRAM
CGROM+5
V
RS
R/W
E
D[7:0]
Vo
GND
Instruction register LCDRS=0
DD RAM
8
RS=1
8
8
8
제어 레지스터DR(Data Register)
DD RAM/CG RAM 에 쓰거나 읽어낸 데이터를 일시적으로 저장
IR(Instruction Register) : Write Only Display Clear, Cursor Shift 등의 명령과
DD RAM 및 CG RAM 의 Address 저장BF(Busy Flag)
RS=0, R/W=1, BF 1 : 내부 설정중 , 다음 명령을 대기 0 : 명령을 받을 수 있음 .
LCD 에 명령을 줄때마다 BF 확인 필요
IR, DR 억세스
RS R/W 기 능
0 0 IR 에 쓰기(Function Set, Display Clear, …)
0 1 Busy Flag 및 Address Counter 읽어들임
1 0 CG RAM 및 DD RAM 에 data 쓰기 (DR DD RAM, CG RAM) 출력 문자 쓰기 (ASCII DDRAM)
1 1 CG RAM 및 DD RAM 에서 data 읽어들임
(DD RAM, CG RAM DR)
문자형 LCD
LCD
1
23
456
789
1011121314
AddressDecoder
R/WA0
D2
D0
D4
D6D7
D3
D5
D1
A[15:0]
MEM_CS
VCC
D2
D0
D4
D6D7
VCC
ER/W
D3
D5
VSS
D1
RS
Vo
CPU
LCD 초기설정 - FUNCTION FUNCTION SETSET
LCD 기능설정 (FUNCTION SET) 명령 Interface 의 길이 , Display Line, Character font
설정
- DL : Interface 길이DL=1 : 8 bit data
lineDL=0 : 4 bit data
line- N : Number of display line- F : Type of character font
LCD 기능설정은 “Busy flag/address read” 명령을 제외한 모든 명령보다 앞에서 실행되어야 한다 .
초기화전원 ON
VDD 가 4.5V 될 때까지 15ms 이상 대기
FUNCTION SET 명령
4.1 ms 이상 대기
100sec 이상 대기
FUNCTION SET 명령
FUNCTION SET 명령
FUNCTION SET 명령DISPLAY OFF 명령CLEAR DISPLAY 명령ENTRY MODE 명령DISPLAY ON 명령
초기설정 완료
0011****
0011****
0011****
00 11 N F * *0000 1 0 0 00000 000 1
00000 1 I/D S0000 1 1 C B
LCD 프로그램#define LCD_DATA 0xXXXX //
RS=1#define LCD_COM 0xXXXX // RS=0
/* Function Set * 0x38 : 0011 1000 * - 8bits I/O, 2 Line, 5x7 Matrix */
void LCD_Init(){ lcd_outp(LCD_COM,0x38); if (LCD_Busy()) lcd_outp(LCD_COM,0x38);
LCD_DspOff(); LCD_Clear(); LCD_DspOn(CURON);}
char LCD_Busy(){ int cnt;
for (cnt = 0;cnt < 1000;cnt++) if (! (lcd_inp(LCD_COM) & 0x80) ) return 0; return 1;}
void LCD_Clear(){ LCD_Busy(); lcd_outp(LCD_COM,0x01); }
void LCD_PrintStr(int p, char *str){ int lp;
if (LCD_GotoPos(p)) return; if (p < SZ_ONE_LINE) lp = p + 0x80; else { lp = p - SZ_ONE_LINE; lp |= 0xC0; } LCD_Busy(); lcd_outp(LCD_COM,lp); while (*str && p < SZ_ALL_LINE) { LCD_Busy(); if (*str < ' ') lcd_outp(LCD_DATA, ' '); else lcd_outp(LCD_DATA, *str);
p++; if (p == SZ_ONE_LINE ) { lp = p - SZ_ONE_LINE; lp |= 0xC0; LCD_Busy(); lcd_outp(LCD_COM,lp); } str++; }}
// 원하는 위치로 이동하는 함수// 2줄 x 40 char 문자형#define SZ_ONE_LINE 20#define SZ_ALL_LINE 40
int LCD_GotoPos(int pos){ if (pos >= SZ_ALL_LINE) return -1; if (pos < SZ_ONE_LINE) pos |= 0x80; else { pos -= SZ_ONE_LINE; pos |= 0xC0; } LCD_Busy(); lcd_outp(LCD_COM, pos); return 0;}
// mode#define DSPON 0x04 // Display On#define CURON 0x02 // Cursor On#define BLINKON 0x01 // Blink On
void LCD_DspOn(BYTE mode){ LCD_Busy(); lcd_outp(LCD_COM,0x08 | DSPON | mode);}
void LCD_DspOff(){ LCD_Busy(); lcd_outp(LCD_COM,0x08);}
인터럽트
인터럽트는 CPU 가 어느 프로그램 코드를 실행하고 있을 때 , 프로그램을 동작을 멈추고 인터럽트를 요구하는 모듈에 처리를 하는 과정을 말한다 .보통 CPU 외의 Timer, Serial, 포트 등의
상태 변화가 있을 때 CPU 에게 알려 이에 맞는 동작을 하는 프로그램이 실행
예를 들어 포트에 연결된 키가 눌려지면 인터럽트로 CPU 에 알리고 현재 진행중인 프로그램을 멈추고 키 처리 루틴을 실행
처리 방법
CPU 가 어느 부분의 프로그램 코드를 실행하고 있는 지를 인터럽트을 발생하는 부분에서는 모른다 .
임의의 코드를 중지하고 현재 레지스터 값을 대피하고 인터럽트 발생한 부분의 프로그램을 찾는다 . ( 프로그램은 이미 결정되어 있음 )
인터럽트의 발생 부분의 코드를 처리 한다 .처리가 끝나면 RETI( 기계어 코드 ) 에 따라
종료하고 대피한 레지스터를 복귀 한다 .레지스터가 복귀되면 이전의 프로그램이
자동으로 계속 된다 .
인터럽트의 발생부와 코드의 위치
CPU 가 인터럽트에 대응하는 프로그램은 찾은 방법은 주로 2 가지를 사용 한다 .이미 결정된 주소를 점프한다 .
8051, 8080, Z-80CPU 는 현재 실행중인 코드를 종료하고 정해진 주소로
점프 (PC 값 변경 )벡터 테이블을 찾아 주소 값을 읽고 , 이 주소로 점프
한다 .80386, 68000, ARMCPU 는 현재 실행중인 코드를 종료하고 벡터테이블에서
주소값을 읽는다 .읽혀진 주소값으로 점프 (PC 값 변경 )
인터럽트 처리 시 레지스터 대피
보통 스택 (stack) 을 이용하여 레지스터를 저장 한다 .인터럽트 루틴 시작에서 PUSH 명령을
사용하여 저장C 의 경우 interrupt 을 사용한 함수에서 자동
저장레지스터 뱅크를 사용하는 방법
레지스터 뱅크가 있어 레지스터 블록이 여러 개 일 경우 현재 레지스터 뱅크를 다른 뱅크로 변경 => 현재 실행되는 상태는 유지
프로그램과 메모리 사용 (CPU)
기계어 코드 (ROM/RAM)명령이 처리위한 기계어 코드
영역변수 데이터 (RAM)
명령이 실행될 때 데이터가 저장되는 공간
고정 데이터 (ROM/RAM)명령이 실행될 때 변하지 않는
변수 공간
int a;
int main(){ a = 10; a++; printf(“a=%d”,a) return 0;}
메모리와 변수와의 관계
프로그램 코드를 할 때 , 코드와 변수 공간이 필요하다 .
C 와 어셈블리와는 표현 방식이 다르다 .C 에서 int, char, … 로 변수 선언을 하면
메모리의 특정 부분이 할당 된다 . 자동 변수의 경우는 레지스터로 할당되는 경우도 있다 .
어셈블리에서는 EQU 로 특정 주소를 직접 지정하고 사용 한다 .
변수의 종류
변수는 특성이 여러가지가 있다 .초기값이 없는 변수
C 의 전역변수 중에서 초기 설정을 하지 않는 변수int int cntcnt;;
void main()void main()
{{
cnt = 10;cnt = 10;
printf(printf(““cnt = %d\ncnt = %d\n””, cnt);, cnt);
}}
초기값이 있는 변수C 의 전역변수 중 초기 설정을 하는 변수 int int cnt = 10cnt = 10;;
초기 실행 시 ROM 에 있는 10 이 RAM 변수영역으로 복사되어 설정 되고 main 으로 점프 한다 .
변수의 존재 방식
선언된 변수는 변수영역의 메모리 (RAM)에 할당된다 .
할당된 변수는 실행 코드에 의해 값이 변한다 . – 실행 코드는 기계어
CPURAM
ROM
int cnt;
기계어 코드
0A
00
xxxx
MOV
A
74
00
2502
C 코딩
프로그램 메모리 배치 – 실행 시
초기값 변수
초기값없는 변수
Code
HEAP
STACK
rodata
BSS
text
Stack 또는 CPU 레지스터
Data
heap
stack
상수값 데이터
int g_total_No = 100;char defname[] = “홍길동” ;
int g_temp;char *databuff;
void main(){ int cnt; static int sum;
databuff = (char*) malloc(64);
sum = 0; for (cnt = 1; cnt <= 10; cnt ++) sum += cnt; printf(“Sum = %d\n”, sum);}
mainmain 함수 시작함수 시작 전에전에 복사복사
변수 초기 데이터
Session 메모리
RAM
RAMROM
FLASH
RAM
컴파일러 마다 session 구조는 약간씩 다름
프로그램 실행 모델 – 일반 OS
초기값 변수
초기값없는 변수
Code
HEAP
STACK
rodata
BSS
text
Data
heap
stack
상수값 데이터
mainmain 함수 시작함수 시작 전에전에 복사복사
변수 초기 데이터
Session 메모리
RAM
RAM
RAM
Window Window 또는또는 linuxlinux 1. 사용자에 의해 프로그램이
프로그램에 선택되면 하드디스크나 기타 보조 저장 장치로 부터 RAM으로 로드 된다 .
2. ‘ 변수 초기 데이터’를 초기값 변수영역으로 복사하는 등 프로그램 초기 부분이 실행 된다 . ( 개발자가 코딩하는 것이 아니라 링커가 초기 모듈을 결합 )
3. main() 함수가 호출 된다 .
임베디드임베디드1. 부트로더가 플래쉬나 기타
저장장치로 부터 프로그램을 RAM 에 복사 한다 . ( 통상 속도상 RAM 실행 )
2. 초기 프로그램을 실행하여 초기값 변수값을 복사한다 .
3. main() 을 호출 한다 .
프로그램 실행 모델 – MCU/CPU
초기값 변수
초기값없는 변수
Code
HEAP
STACK
rodata
BSS
text
Data
heap
stack
상수값 데이터
mainmain 함수 시작함수 시작 전에전에 복사복사
변수 초기 데이터
Session 메모리
RAM
ROMFLASH
RAM
1.ROM 또는 FLASH 에 프로그램 코드가 존재 한다 .
2.‘ 변수 초기 데이터’를 초기값 변수영역으로 복사하는 등 프로그램 초기 부분이 실행 된다 . ( 경우에 따라 개발자가 코딩하거나 링커가 알아서 라이브러리에서 결합 )
3.main() 함수가 호출 된다 .
프로그램과 CPU 의 실행
C 와 기계어의 관계 그리고 실행
int a;
void main(){ a = 10; if (a == 10) a++;}
A EQU 0023H
MAIN: PUSH A MOV A,10 CMP A,10 JNE EndIF INC AEndIF: POP A RET
컴파일러
if 메커니즘
C 의 상당 부분은 if 가 기본이다 . if, for, while, do~while 은 기본적으로 if 과 점프
명령으로 구성된다 .
if 의 실행 방법 : if (a == 10)1. CMP A,10 A 레지스터의 현재값에서 ALU 을 통해 10 빼고 결과는
플래그만을 설정 한다 . CMP 명령은 A 레지스터는 변화 없다 .
2. JNE EndIF 만약 A 와 10 이 같으면 결과 값이 0 이 되고 캐리는 C=0 이
된다 . JNE 명령은 값이 같지 않으면 다음명령 스킵되도록 점프 한다 .
3. INC A만약 C=0 이면 A 레지스터 값을 1 증가 한다 .
C 의 a++ 가 실행하기 위한 기계어 명령이다 .
a = 10;if (a == 10) a++;
MOV A,10 CMP A,10 JNE EndIF INC AEndIF: