6. 제어판
오실레이터 16비트 카운터 64K x 8 RAM
Clk
Clr 주소 값
0000h : 00h
0001h : 00h
0002h : 00h
0003h : 00h A B
0004h : 00h
8비트 덧셈기
…
FFFFh : 00h S
V
지우기
DI
Clk 8비트 래치
Clr
DO
초기 상태
전구
6
7. 제어판
오실레이터 16비트 카운터 64K x 8 RAM
Clk
0000h 00h
Clr 주소 값
0000h : 00h
0001h : 00h
0002h : 00h
0003h : 00h A B
0004h : 00h
8비트 덧셈기
…
FFFFh : 00h S
V
지우기
DI
Clk 8비트 래치
Clr 00h
DO
지우기 스위치 입력
전구
7
8. 제어판
오실레이터 16비트 카운터 64K x 8 RAM
Clk
0000h 00h
Clr 주소 값
0000h : 01h
0001h : 15h
0002h : 11h
0003h : 23h A B
0004h : 50h
8비트 덧셈기
…
FFFFh : 00h S
V
지우기
DI
Clk 8비트 래치
Clr 00h
DO
제어판으로 RAM에 데이터 초기화
전구
8
9. 제어판
오실레이터 16비트 카운터 64K x 8 RAM
Clk
0000h 0000h 01h 00h
Clr 주소 값
0000h : 01h
0001h : 15h
0002h : 11h
0003h : 23h A B
0004h : 50h
8비트 덧셈기
…
FFFFh : 00h S
V
지우기 01h
DI
Clk 8비트 래치
Clr 00h
DO
지우기 스위치 개방
전구
9
10. 제어판
오실레이터 16비트 카운터 64K x 8 RAM
Clk
0 -> 1 0000h 0000h 01h 01h
Clr 주소 값
0000h : 01h
0001h : 15h
0002h : 11h
0003h : 23h A B
0004h : 50h
8비트 덧셈기
…
FFFFh : 00h S
V
지우기 01h
DI
Clk 8비트 래치
Clr 01h
DO
첫번째 클럭 발생시 1 단계
전구
10
11. 제어판
오실레이터 16비트 카운터 64K x 8 RAM
Clk
0 -> 1 0001h 0001h 15h 01h
Clr 주소 값
0000h : 01h
0001h : 15h
0002h : 11h
0003h : 23h A B
0004h : 50h
8비트 덧셈기
…
FFFFh : 00h S
V
지우기 16h
DI
Clk 8비트 래치
Clr 01h
DO
첫번째 클럭 발생시 2 단계
전구
11
12. 제어판
오실레이터 16비트 카운터 64K x 8 RAM
Clk
0 -> 1 0002h 0002h 11h 16h
Clr 주소 값
0000h : 01h
0001h : 15h
0002h : 11h
0003h : 23h A B
0004h : 50h
8비트 덧셈기
…
FFFFh : 00h S
V
지우기 27h
DI
Clk 8비트 래치
Clr 16h
DO
두번째 클럭 발생시
전구
12
13. 문제점
동작을 중지시킬 방법이 없음
무한루프, FFFFh 번지 까지 진행후 처음부터 다시 계산
8비트 덧셈만 가능
여러개를 붙이지 않고 확장할 수 없을까?
모든 수를 더해서 하나의 결과값만 구함
50개의 쌍을 더해서 50의 결과값을 구하고 싶다면?
13
15. 출력 결과를 다시 RAM에 저장하기
50 쌍의 수를 더했다면
각 50쌍의 연산결과를 메모리에
다시 저장 할 수 있음.
15
16. 출력 결과를 다시 RAM에 저장하기
0000h: 27h 0000h 주소에 있는 값을 로드해서 누산기에 저장
A2h 0001h 주소에 있는 값과 누산기의 값을 더함
0002h 주소에 있는 값과 누산기의 값을 더함
18h
누산기에 있는 값을 0003h 주소에 저장
첫 번째 합은 여기
0004h 주소에 있는 값을 로드해서 누산기에 저장
0004h: 1Fh
0005h 주소에 있는 값과 누산기의 값을 더함
89h 누산기에 있는 값을 0006h 주소에 저장
두 번째 합은 여기 0007h 주소에 있는 값을 로드해서 누산기에 저장
0007h: 33h 0008h 주소에 있는 값과 누산기의 값을 더함
2Ah 0009h 주소에 있는 값과 누산기의 값을 더함
누산기에 있는 값을 000Ah 주소에 저장
55h
자동화된 덧셈기의 동작을 중지시킴
세 번째 합은 여기
16
17. 출력 결과를 다시 RAM에 저장하기
0000h: 27h 0000h 주소에 있는 값을 로드해서 누산기에 저장
A2h 0001h 주소에 있는 값과 누산기의 값을 더함
0002h 주소에 있는 값과 누산기의 값을 더함
18h
누산기에 있는 값을 0003h 주소에 저장 로드, 더함, 저장, 중지
첫 번째 합은 여기
0004h 주소에 있는 값을 로드해서 누산기에 저장
0004h: 1Fh
0005h 주소에 있는 값과 누산기의 값을 더함 네가지 작업이 필요
89h 누산기에 있는 값을 0006h 주소에 저장
두 번째 합은 여기 0007h 주소에 있는 값을 로드해서 누산기에 저장
0008h 주소에 있는 값과 누산기의 값을 더함
명령어
0007h: 33h
2Ah 0009h 주소에 있는 값과 누산기의 값을 더함
누산기에 있는 값을 000Ah 주소에 저장
55h
자동화된 덧셈기의 동작을 중지시킴
세 번째 합은 여기
17
19. 명령어와 데이터 메모리 비교
명령어 메모리 데이터 메모리
0000h: 10h 로드 0000h: 27h
20h 더하기 A2h
20h 더하기 18h
11h 저장 첫 번째 합은 여기
0004h: 10h 로드 0004h: 1Fh
20h 더하기 89h
11h 저장 두 번째 합은 여기
0007h: 10h 로드 0007h: 33h
20h 더하기 2Ah
20h 더하기 55h
11h 저장 세 번째 합은 여기
000Bh: FFh 중단 000Bh: 19
20. 로드 명령어 처리
RAM의 출력을 8비트 래치의 입력과 연결
2:1 선택기 추가
제어 신호는 생략
로드명령에서는 2:1 선택기의 Select입력은 0
저장 명령인경우는 RAM에 대한 쓰기 신호값이 1
제어 신호는 논리게이트를 다양하게 조합해서 만들 수 있음.
20
21. 빼기 명령어 추가
동작 부호 명령어 메모리 데이터 메모리
로드 10h 0000h: 10h 로드 0000h: 56h
저장 11h 20h 더하기 2Ah
더하기 20h 21h 빼기 38h
빼기 21h 11h 저장 <- 결과는 여기에 적힘
중단 FFh FFh 중단
21
22. 빼기 명령어 처리
1. 뺄셈시에 C0 은 1이 입력됨
2. 덧셈기의 입력은 인버터를 통해 1의 보수가 됨
3. 덧셈기의 CI에 1을 입력함으로서 2의 보수로 만듬
22
23. 16비트 계산하기
명령어 메모리 데이터 메모리
0000h: 10h 로드 0000h: ABh
20h 더하기 2Ch
76ABh 76h ABh
11h 저장 <- 결과의 하위 바이트
+ 232Ch + 23h + 2Ch 10h 로드 76h
99D7h 99h D7h 20h 더하기 23h
11h 저장 <- 결과의 상위 바이트
FFh 중단
23
24. 자리 올림과 빌림
1h 1 비트 자리 올림 래치 사용
76ABh ABh 76h 하위 8비트 덧셈
+ 236Ch + 6Ch + 23h 일반적인 덧샘 수행 후 자리올림
값을 자리올림 래치에 저장
117h 9Ah
상위 8비트 덧셈
덧셈기의 자리올림 입력에
자리올림 래치 값을 입력
24
25. 자리 올림과 빌림
동작 부호
로드 10h
저장 11h
더하기 20h
빼기 21h
자리올림을 이용하여 더하기 22h
빌림을 이용하여 빼기 23h
중단 FFh
25
26. 32비트 덧셈
명령어 메모리 데이터 메모리
0000h: 10h 로드 0000h: CDh
20h 더하기 FFh
11h 저장 <- 결과의 최하위 바이트
10h 로드 2Bh
7A892BCDh
22h 자리올림 더하기 Carry 72h
+ 65A872FFh
11h 저장 <- 결과의 윗자리 바이트
10h 로드 89h
22h 자리올림 더하기 Carry A8h
11h 저장 <- 결과의 윗자리 바이트
10h 로드 7Ah
22h 자리올림 더하기 Carry 65h
11h 저장 <- 결과의 최상위 바이트
FFh 중단
26
27. 아직 남은 문제들
번거로운 입력
가장 아래 바이트 부터 연속되지 않은 메모리에 나누어 넣어야함
연산의 결과를 뒤에서 재사용 불가능
A 와 B 의 합에 C 를 더하고 싶다면?
메모리를 0000h 번지부터 순차적으로만 접근 가능 하기 때문
27
28. 주소 지정 추가
명령어 길이를 3바이트로 변경
1바이트 명령어와 2바이트 주소로 구성
3바이트 명령어 메모리
0000h: 10h 0000h 번지의 한 바이트를 누산기로 로드함
명령어 메모리 데이터 메모리 00h
0000h: 10h 로드 0000h: 4Ah 00h
20h 더하기 B5h 0003h: 20h 0001h 번지의 한 바이트와 누산기의 값을 더함
11h 저장 <- 결과 00h
FFh 중단 01h
0006h: 11h 누산기의 값을 0002h 번지로 저장함
00h
02h
FFh 중단
28
35. 16비트 카운터 수정
16비트 카운터는 플립플롭 16개를 연결한 것임을 상기
A : 새로 지정할 비트 값
Set It 이 1 이면 A의 값이 플립플롭에 입력됨
35
36. 곱셈 구현
1000h: 00h 16 비트 승수
1단계 : 00A7h X 1
00A7h
X 001Ch A7h
1002h: 00h 16비트 피승수
1Ch
1004h: 00h <- 16비트 곱은 여기와
00h <- 여기에
00A7h 를 001Ch 번 더하자.
36
37. 곱셈 구현
2 단계 : 처음으로 되돌아가기
0012h: 30h 0000h 번지로 분기
00h
00h
언제까지??
조건 분기 필요
37
38. 조건 분기
Zero 래치
덧셈기의 출력이 0인지 판별
덧셈기의 출력 값이 0일때 1을 가짐
38
39. 조건 분기
동작 부호
로드 10h
저장 11h
더하기 20h
빼기 21h
자리올림을 이용하여 더하기 22h
빌림을 이용하여 빼기 23h
분기 30h
Zero면 분기 31h
자리올림이면 분기 32h
Zero가 아니면 분기 33h
자리올림이 아니면 분기 34h
중단 FFh
39
40. 데이터
곱셈 구현
1000h: 00h 16 비트 승수
A7h
1002h: 00h 16비트 피승수
1Ch
<- 16비트 곱은 여기와
3단계 : 조건 분기
1004h: 00h
00h <- 여기에
001Ch가 0이 아닌 동안 0000h으로 돌아간다.
1Eh의 FFh를 더하는 이유는 -1을 더하기위한 트릭
40
45. 니모닉
동작 부호 니모닉
로드 10h LOD
저장 11h STO
더하기 20h ADD
빼기 21h SUB
자리올림을 이용하여 더하기 22h ADC
빌림을 이용하여 빼기 23h SBB
분기 30h JMP
Zero면 분기 31h JZ
자리올림이면 분기 32h JC
Zero가 아니면 분기 33h JNZ
자리올림이 아니면 분기 34h JNC
중단 FFh HLT
45
46. 니모닉
구성 : 명령 코드 목적지, 소스
“1003h에 있는 바이트 값을 누산기로 로드”
LOD A, [1003h]
A 는 누산기
[]는 주소에 있는 값을 참조
“누산기의 내용을 1003h 번지로 저장하라“
STO [1003h], A
“만일 Zero 플래그 값이 1이 아니라면 0000h로 분기하라”
JNZ 0000h
46