728x90

ARM 프로세서 동작 모드

- USER 모드 : 일반 사용자 프로그램 모드

- SYSTEM 모드 : CPSR을 완전히 읽기 쓰기 가능

- Supervisor 모드 : 운영체제를 위한 예외, 커널이나 디바이스 드라이버 처리

- FIQ 모드 : 긴급한 인터럽트 발생시 진입. 빠른 인터럽트 처리를 위한 모드

- IRQ 모드 : 일반 인터럽트 발생시 진입.

- Abort 모드 : 데이터 또는 명령어 거부시 진입

- Undefined 모드 : 패치된 명령어가 정의되지 않을시 진입

* CPSR : Current Program Status Register

 

(1) ARM 프로세서 동작모드

1) 프로그래머 모델

2) 프로세서 동작모드

3) 특권 모드

4) 예외 모드

5) 동작 모드 변경

 

1) 프로그래머 모델

프로그래머 모델이란?

- 컴퓨터 시스템 구조와 동작을 표현한 추상적 개념모델

- 프로그래머가 코드 작성위해 알아야한 최소한 프로세서에 대한 정보

- 프로그램 최적화를 위한 중요 정보

 

프로그래머 모델 구성

- 프로세서 동작모드 : 운영체제를 하드웨어적으로 지원하는 모드

- 레지스터 구성방법 : CPU가 사용가능한 효율적인 저장장소

- 메모리접근방법 : 메모리서 데이터 읽거나 쓸때 적용

- 명령어 셋 :  프로세서가 실행할수있는 명령어 셋

- 예외처리방법 : 시스템의 실사간 처리에 큰 영향을 줌. 실시간 처리 성능 예측과 성능향상에 중요

 

2) 프로세서 동작모드

 

ARM 프로세서 동작 모드

- 프로세서가 프로그램 실행시 권한 설정

- 7개 동작 모드 : 6개 특권 privileged mode + 1개 사용자 모드 user mode

   특권 모드 : 예외 처리, 시스템 자원에 접근 - system 모드, supervisor 모드, fiq 모드, irq 모드, abort 모드 등

   사용자 모드 : 사용자 프로그램 실행 상태, 시스템 자원 접근 제한. 필요시 운영체제에 요청. 동작모드 변경불가

 

3) 사용자 모드

사용자 모드

- 시스템 자원 접근 제한하여 시스템 자원 보호

- 다른 동작 모드 진입 불가

- 변경 시 소프트웨어 인터럽트로 특권모드 진입후 가능

- 사용자 모드서 레지스터 사용 : R0 ~R12 범용레지스터 R13 스택 포인터 R14 링크레지스터 R15 프로그램카운터

 

4) 특권 모드

- 예외 처리하거나 시스템 자원에 접근가능모드

- 시스템 모드 : 운영체제를 위한 모드 운영체제 커널 작업 실행. 시스템 자원 접근 가능. 예외 발생 없이 진입.

- 슈퍼바이저 모드 : 운영체제를 위한 보호모드로 시스템 리셋이 진입시 초기 동작모드. 전원 공급시 가장 먼저 진입

- IRQ 모드 : 일반 인터럽트 모드시 진입

- FIQ 모드 : 고속 인터럽트 발생시 진입. 레지스터 뱅킹 세트 확장. R8~R12까지 5개레지스터 추가하여 8개 레지스터 추가사용

- Abort 모드 : Abort 예외발생시 진입. 명령어나 데이터 메모리 접근 오류시 발생.

   명령어 접근 오류 : 명령어 pre-fetch 과정서 발생 오류

   데이터 접근 오류 : 데이터 alignment 오류, 가상 어드레스 변환오류, 메모리 도메인/ 접근권한 위반 오류 등

- Undefined 모드 : Undefined 예외 발생시 진입. 정의 되지 않은 명령어가 디코딩 시

 

5) 예외 모드

- 특권 모드 중 예외와 관련있는 동작 모드

- 시스템 모드를 제외한 5가지 -> 슈퍼바이저, IRQ, FIQ, Abort, Undefined

- 하드웨어 또는 소프트웨어 예외발생시 진입

- 동작 모드 전확 속도 향상을위해 레지스터 셋 뱅킹

- 시스템 자원에 접근

 

6) ARM 프로세서 동작 모드 설정

- ARM 프로세서 동작 모드 설정은 상태레지스터 CPSR의 동작 모드 필드 M[4:0] 사용

- 사용자 모드 : 10000

- 시스템 모드 : 11111

- 슈퍼바이저 모드 : 10011

- FIQ 모드 : 10001

- 동작 모드 값 변경은 특권 모드에서만 변경가능

 

7) 동작 모드변경

프로세서 동작 모드 변경

- 동작모드 설정 : 상테레지스터의 동작모드 필드 값 변경하여 변경 -> 특권모드서 가능

- 예외 발생하여 특권모드 진입 -> 특권모드에서 동작모드 필드 변경하여 가능

 

 

(2) 레지스터 구성

1) 레지스터 구성

2) 프로그램 상태 레지스터

 

1) 레지스터 구성

ARM 프로세서 구성

- 레지스터 : 모드 37개 32비트 레지스터로 31개 범용, 6개의 상태 레지스터. 프로세서 모드에 따라 사용가능한레지스터가 바뀜

 

특수용도 레지스터

- R13 : 스택 포인터로 각 동작 모드에 사용되는 스택 위치 정보를 저장. R13을 이용하여 스택 관리

- R14 : BL명령어로 실행. 링크 레지스터 PC 내용 복사해서 복귀 위치 저장. 

- R15 : 프로그램 카운터 

- CPSR : 현재 상태 레지스터 . 상태표시 플래그, 동작모드 설정비트, 제어비트 등 포함. SPSR(이전 CPSR 값저장)

 

Thumb state 레지스터 구성

- 레지스터 사용이 크게 재한

- R8 ~ R12 까지 범용 레지스터는 사용 불가

- ARM state처럼 범용 레지스터 뱅킹 이점을 갖지 못함

 

2) 프로그램 상태 레지스터

프로그램 상태 레지스터

- 1개의 CPSR

- 5개의 SPSR : CPSR의 뱅킹 레지스터. 예외 처리 함수에서 사용. 모드 변경시 CPSR 내용을 SPSR로 복사

- condition code flag, control bits

 

컨디션 코드 플래그 필드

- CPU 연산 결과를 반영하는 플래그 필드

- nzcv 4개의 플레그 사용

- N : 연산 결과가 음수

- Z : 연산 결과가 음수

- C : 캐리 발생, 자리빌림, 최상위 비트로 쉬프트되어 나온값

- V : 연산결과가 오버플로시 표시

 

컨트롤 비트 필트

- 인터럽트 허용 여부 결정 -> T/I비트

- 프로세서 동작모드설정 -> 모드설정비트

- 프로세서 상태 표시 -> T 비트

- 예외 발생시 변경

- 특권 모드에서 소프트웨어적으로 변경 가능

* T 비트 :  프로세서의 state 표시. 0이면 ARM state, 1이면 thumb state

* I 비트 : 인터럽트 disable 비트. 1설정시 인터럽트 불허

 

동작 모드 필드

- 동작 모드 필드 값에 따라 프로세서의 동작 모드가 결정됨

 

300x250
728x90

마이크로 프로세서 이해

- 효율적 시스템 설계 필요

- HW 측면 : 플랫폼(메인보드) 설계

- SW 측면 : 프로그램 코딩 기법 이해 - 디버깅 작업에서 필수적임

 

(1) ARM 프로세서 개요

1) ARM 프로세서

2) ARM 코어 구조

3) ARM7TDMI

4) ARM 코어 로드맵

5) ARM 프로세서 요약

 

1) ARM 프로세서

- 영국 ARM사에서 개발한 32비트 RISC 프로세서

- 1983 영국 Acorn Computer 사에서 최초 개발

- Cortex-A, R, M 시리즈로 제공

 

ARM 프로세서 특징

- 32비트 임베디드 프로세서 시장 70%이상 차지

- 저전력 고성능으로 휴대용 장치에 주로 사용

- 16비트 명령어 제공

- Java 코드 가속

- DSP 기능

- 특정 메모리 영역제안 - 보안 기능

 

ARM 코어

- ARM 프로세서의 명령어 셋을 실행할수있는 하드웨어

- ARM 구조 -> ARM 코어의하드웨어구조

- ARM 시스템 코어 = ARM 코어 + 메모리 유닛(버퍼, 캐쉬,MPU 등)

 

ARM 코어 제공 형태

- 하드 매크로 셀 Hard macro cell : 레이아웃 수준 설계, 설계 변경 불가, 코어 크기 및 전원정압 고정

- 합성가능한 코어 Synthesizeable core : HDL 사용하여 RTL 수준으로 제공, 코어크기-내부메모리 변경가능, 기능변경불가

 

HDL (Hardware Description Language)

- 논리 회로를 텍스트로 표현하는 언어

- VHDL, Verilog HDL이 표준으로 채택

 

RTL (Register Transfer Level)

- 디지털 시스템을 레지스터 사이 데이터 전송 관계로 표현하는 방식

 

2) ARM 코어 구조

 

ARM 코어 특징

-32 비트 RISC CPU 코어

- RISC 타입의 기본 구조인 로드-스토어 구조

- 빠른 인터럽트가 가능하도록 설계

- 데이터 저장방식은 빅엔디언과 리틀엔디언 선택가능

 

32비트 RISC

- 데이터 기본 처리단위 : 32비트

- 명령어 셋 구조 : RISC

- 간단하고 적은 명령어 -> 간단한 코어구조 & 빠른 명령어 실행 속도

 

Load-Store 구조

- 모든 데이터 처리는 레지스터를 대상으로 함

- 메모리 인터페이스는 load /store 명령어만 사용

- 메모리상 데이터 Load 명령어로 레지스터에 로딩 후 연산

- Store 명령어로 메모리에 저장

 

빠른 인터럽트 처리

- 빠른 인터럽트 모드 제공

- 동작 모드별 중요 레지스터 뱅킹 -> 사전에 중요 레지스터 여러 셋준비

 

메모리 저장 방식

- 아래 둘중하나 선택하여 메모리 사용 유연성을 높임

- 빅 엔디언 : 최상위 비트가 하위 어드레스에 먼저 저장 -> 모토로라 IBM, 대부분 RISC 프로세서

- 리틀 엔디언 : LSB가 하위 어드레스에 먼저 저장 -> 인텔 계열 프로세서

 

3) ARM7TDMI Core

- ARM 코어를 가장 잘 설명할수 있는 간단한 구조

- 32비트 ALU, 레지스터 뱅크, 어드레스 레지스터, 쓰기데이터 레지스터, 명령어 디코더 등으로 구성

- 폰 노이만 구조를 따름 - 프로그램 메모리와 데이터메모리가 같은 경로를 사용

- 중간에 배럴 쉬프터가 한 명령어로 ALU 연산과 쉬프트 동작 동시에 수행 가능

 

4) ARM 코어 로드맵

- 클래식 ARMCore 

- Coretex 암코어 : 응용 프로세서용, 임베디드용

- 각 프로세서 군의 특성을 파악 -> 설계 목표에 부합하는 프로세서 선정

- 최신 프로세서 구조의 발전 흐름을 알아볼 수 있음

* VFP 부동소수점 고속 연산

* Jazelie 자바 명령어 가속

 

5) ARM 프로세서 요약

- ARM 7 패밀리 ; 명령어 v4T

- 3-state pipeline

 

코어끝 접미어 의미

- 코어가 제공하는 기능

- ARM7TDMI-S 예시

T = Thumb 명령어 지원

D = 디버그 인터페이스

M = 64비트 곱셈기

I = In-circuit 애뮬레이터 인터페이스

-S = 하드웨어 기술언어로 작성된 프로세서 코어, 자동 합성도구로 합성 가능

 

ARM 9 패밀리

- v4T 명령어

- 5-state pipeline, cache 사용

- Jazelle DBX 자바 가속 제공

- Havard 구조

 

ARM9E 패밀리

- ARM9 패밀리에 신호처리 명령어를 추가

- TCM : 빈번히 사용하는 데이터 엑세스 속도 향상 -> 실시간 향상

 

ARM10 패밀리

- 6state pipeline

- 64비트 명령어 처리, 부동 벡터 처리 명령 지원 VFP

- Jazelle DBX 자바 가속 제공

 

ARM11 패밀리

- 내부는 64비트, 외부는 32비트

- SIMD, TrustZone, Thumb-2 명령어 지원

- 멀티 코어 구성

 

Cortex 패밀리 (2004년부터 발표)

- A 시리즈 : 고성능 멀티미디어용

- R 시리즈 : 실시간 제어 임베디드용

- M 시리즈 : 저가격 마이크로 컨트롤러용

 

(2) ARM 명령어 구성

1) ARM ISA

2) Thumb 명령어

3) DSP 확장 명령어

4) 기타 확장 기능

 

1) ARM ISA

ARM ISA 특징

- 32비트 고정길이 명령어 : ARM 명령어

- 16비트 고정 길이 명령어 : Thumb 명령어

- 모든 명령어들이 조건부 명령어 -> 불만족시 실행 불가

- 하나의 명령어로 Shift와 ALU 연산 동시실행

- 명령어에 자동 증가/감소 모드 제공

- 여러 레지스터들을 동시에 메모리에 저장 및 로딩

=> 최대 15번 동시 읽기/쓰기 가능

 

ARM ISA 확장

- 세로축 명령어 세트별. 가로축 명령어 확장기능

- T Thumb mode : 16비트 명령어 모드. 32비트 명령어를 16비트로 재배치 -> 메모리 사용량 줄이며, 메모리 인터페이스 부담 줄임

- DSP :  해당 명령어 셋이 DSP 제공

- Z Jazelle : 자바 하드웨어로 실행

- M Mdeia: 멀티미디어 데이터 처리를 위한 명령어 확장

- Z  Trust Zone : 보안 관련

- T2 Thumb2 : Thumb 보다 축소된 명령어 기법 사용

- 명령어 셋 v4T : 버전 4 명령어 + Thumb 명령어

- v5TE : v4TE + DSP

 

2) Thumb 명령어

Thumb 16비트 명령어

- 프로그램 코드 크기 절약

- 외부 메모리 인터페이스 최소화 -> 소비전력 절약

 

ARM 명령어와 Thumb 명령어 비교

- 약 30% 프로그램 메모리 절약

- Thumb 모드 사용시 외부 메모리 소비전력 30% 절약

 

Thumb 명령어 단점

- 조건부 명령어 사용불가

- 명령어 내 상수 표현범위가 좁음

- 사용가능한 레지스터 범위가 R0 ~ R7으로 제한

 

ARM/Thumb 연동

- ARM State : ARM 명령어를 쓸수있는상태

- Thumb state : Thumb 명령어를 실행할수있는 상태

- BX 명령어로 전환 가능

- 프로세서 동작상태는 CPSR의 T 비트로 확인

 

3) DSP 확장 명령어

- CLZ(Count Leading Zero) 명령어 : MSB에서 LSB 검사하면서, 처음으로 1이 나타나는 비트위치 검색

- Saturate 연산 명령어 : 연산 결과가 표현 범위를 초과했는지 확인. 초과시 CPSR의 Q플래그 SET

- Signed Multiplication 지원 

- Signed MAC 지원

- Double word load/store : 64비트 로드스토어를 LDRD, STRD 명령어로 표현

 

4) 확장 명령어

- Jazelle : BJX(자바 실행 전환) 명령 사용 -> 자바 바이트 코드 실행 속도 향상

- Media : SIMD 명령어로 오디오 비디오 처리 능력 향상 2~4배.

- Thumb2 : Thumb 명령어 셋 확장. 16비트 명령어보다 25% 빠름. 32비트 명령어보다 메모리 공간 절약

- TrustZone : 시스템 보안 강화

- VFP(Vector Floating Point) : 부동 소수점 연산

- NEON : 멀티미디어 데이터, 신호처리가 필요한 응용프로그램 성능 향상

300x250
728x90

임베디드 시스템 개발

- 하드웨어 개발 : 하드웨어 플랫폼 자체 개발, 설계에 적합한 상용 보드 구매 -> 프로토타입 구현 -> 상품화 시 전용보드

- 소프트웨어 개발

    운영체제 : 자체 개발 힘들 시 기존 운영체제 사용. 라이센스, 안정성 등 고려

    응용 소프트웨어 : 오픈소스 사용하여 개발 시간 단축

 

(1) 하드웨어 개발

1) 하드웨어 플랫폼

하드웨어 플랫폼 구성

- CPU 보드, IO보드

- CPU 보드 : CPU를 실장한 보드(PCB) -> Main Board, Mother Board

- IO보드 : 특정기능을 수행하는 입출력장치를 실장한 보드 -> Sub-board, Daughter board

 

2) 하드웨어 플랫폼 제작

1. 최적화 보드 자체 제작

2. 상용 보드 구매

3. 외부 전문 기업에 위탁 제작 

- 제작 비용과 시간, 성능을 고려하여 개발

 

응용 분야 최적화 보드 자체 제작

- PCB 설계 : 회로도 작성 -> 부품 배치 -> 부품 배선 -> 기반도면완성(Artwork)

         -> PCB 제작 ->부붐 실장(Mounting) -> 동작 테스트 -> 메모리 스프트웨어 로딩

        * PCB에 대한 열분석, 노이즈 분석 등으로 방열 대책, 노이즈 대책이 추가

 

3) 오픈 하드웨어 플랫폼

- 교육/개발용 오픈 아키텍처보드

- 짧은 시간 내, 제품 기능 구현 가능성 검증용으로 적합

ex) 8비트 아두이노 보드, 32비트 라즈베리파이, 32비트 갈릴레오보드

 

8비트 아두이노보드

- Atmel의 AVR 코어 기반

- 저가형 8비트 CPU 보드 -> 소규모 임베디드 시스템 구현에 적합

- 다양한 IO보드를 활용 -> 상용 시스템 구현 가능

 

32비트 라즈베리파이 보드

- 2006년 영국 라즈베리파이 재단이 개발한 싱글보드 컴퓨터

- ARM11 계열 프로세서를 사용. 운영체제는 리눅스 기반의 라즈비안

 

32비트 갈릴레오보드

- 인텔 Quark Soc X1000 프로세서 기반 마이크로 컨트롤러 보드(32비트 팬티엄급 CPU)

- 아두이노와 호환가능. 100MB 이더넷, RS-232 직렬, USB 호스트 포트 등 제공

 

(2) 소프트웨어 개발

1) 임베디드 OS

2) 실시간 OS

3) 응용프로그램 개발

4) 오픈 소스

 

1) 임베디드 OS

임베디드 OS 특성

- 범용 운영체제에 비해 작음

- 빠른 부팅, 저전력, 비디스크방식

- 다양한 프로세서 지원

- 빠른 응답속도 -> 실시간성 높음

- 메모리 기반 File System/Database 시스템 제공

- 컴포넌트 방식의 구성 - 목적 시스템에 따라 구성 변경이 가능

 

2) 실시간 OS

실시간 OS 특성

- 지정된 시간 제한 내 출력

- 정해진 시간 안에 작업 수행 가능한 환경

- 예측 가능하고 일정한 응답시간을 요구하는 응용프로그램 지원

- 하드웨어 자원사용으로 작업 시간 제한 충족

- 우선순위가 높은 작업에 많은 실행 시간 할당

 

실시간 OS 구분

- 경성 실시간 (Hard real-time) : 작업을 일정시간안에 처리해야함. 제한 시간 경과시 시스템 실패 ->비행기, 군장비

- 연성 실시간 (Soft real-time) : 제한 시간안에 실행못해도 실패로 끝나지 않음 -> 휴대폰, 라우터

- 상용 실시간

 

상용 실시간 (Commercial real-time) OS 특성

 - 선점형 멀티태스킹, POSIX(표준 유닉스 시스템 인터페이스) 지원

 - 작업 우선순위에 따라 실행

 - 시스템 콜에 의한 커널 모드와 사용자 모드 독립성 보장

 - 통합 개발환경과 디버깅 툴 제공하여 개발자들이 쉽게 개발할 수 있도록 지원

 - 고가 라이선스 비용

 

3) 응용 프로그램 개발

응용 프로그램

- 사용 목적에 따라 개발된 프로그램

- 하드웨어 플랫폼 위에서 실행 -> 특정 HW 플랫폼에 의존적

- 실행 속도 및 리소스 사용량 최소화를 위해 시스템 설계부터 코딩까지 최적화 과정을 거침

 

설계 사양 -> 설계 -> 시스템 설계 -> 최적 -> 최적설계결과

* 시스템 설계 평가의 설계 평가 요소 : 실행 속도, 하드웨어 사용량, 소비 전력

 

4) 오픈 소스

오픈 소스 소프트웨어 및 라이브러리

- 일반에 소스까지 공개된 SW/Lib

-> 설계 비용과 시간 절약

- 쉽게 검색 및 커뮤니티를 통한 기술지원

- 신뢰도와 안정성이 미흡할 수 있음

 

오픈소스의 정의

- 자유로운 재배포 -> 자유로운 배포 허용. 비용 받지 않아야함

- 소스(원시) 코드 -> 고의로 보기 힘들게 하지 않아야 함.

- 파생 저작물 -> 개작과 파생 저작물 허용. 파생 저작물은 원본 오픈소스에 적용된 라이선스 적용.

- 저작자의 소스 코드 원형 유지 : 변경된 소스 코드로 만들어진 결과 배포 허용.

- 개인이나 단체 차별 금지

- 사용분야 차별 금지

- 라이선스의 배포

- 특정 제품에만 유효한 사용 허가 금지 : 권리가 특정 소프트웨어 배포에만 한정적이여선 안됨. 

- 다른 소프트웨어에 대한 제한 금지 : 다른 라이선스를 가진 소프트웨어에 대한 제한을 포함해선 안됨

- 기술 중립적

 

Open CV

- Open Source Computer Vision

- 인텔 영상 처리 라이브러리

- 기초 ~ 고급 영상처리 알고리즘 함수로 구현되 포함됨

- 오픈 소스 규격으로 개발된 알고리즘은 라이브러리에 등록 가능

- 최적화된 C언어로 작성, 멀티코어 프로세서 장점 활용, 연산 효율성 고려하여 설계됨

 

안드로이드 플랫폼

- 모바일 디바이스를 위한 오픈 소스 소프트웨어 스택

- 언어는 JAVA, SDK와 API 사용

 

(3) HW-SW 공조설계

1) 공조설계 개요

2) 이론적 공조 설계 흐름

3) 현실적 공조 설계 흐름

 

1) 공조 설계 개요

HW-HW 공조설계

- 하드웨어, 소프트웨어가 조합된 시스템에서 기능, 성능을 목적을 달성하기 위해 협력성과 동시성을 지원하는 설계방법

 

공조설계방법

- 시스템 사양서 분석

- 실행속도가 중요한 부분은 하드웨어,  확장성 중요한부분은 소프트웨어로 구현할 부분 분할

- HW, SW 독립적으로 구현하여 통합

 

HW-SW 공조설계 문제점

- 시스템 통합과 검증에 많은 시간과 비용 소요

- HW SW 전문지식 가진 개발인력 부족

 

2) 이론적 공조 설계 흐름

 

3) 현실적 공조 설계 흐름

- 이론적 공조설계와 동일하나 설계 과정에 다소 차이

- 개략적인 개발 흐름 고려시 이런 흐름을 따름

 

300x250
728x90

임베디드 시스템

- 범용 컴퓨터와 동일한 구조

- HW/SW 구성요소 특징 분석 -> 설계 비용과 시간 등 예측 -> 최적화 작업

- HW, SW를 설계 초기 단계서 부터 같이 고려 필요

임베디드 하드웨어 구성

- Microprocess : cpu 내장하여 데이터 처리

- memory : 데이터 저장

- I/O Device :  입출력 수행하는 주변장치 peripheral로 외부 인터페이스 제공, 특정 기능 수행하는 전용 하드웨어 포함

- HW가 PCB판에 실장 -> embeded system platform

 

임베디드 소프트웨어 구성

- 초기화 코드 : 시스템 초기화 프로그램

- OS : 시스템/슬팽 프로그램 자원 관리

- 라이브러리 : 공용 프로그램 패키지

-> 응용 소프트웨어 : 임베디드 시스템 결정, 시스템 구현하고자하는 특정 용도 프로그램 

=> 메모리에 저장 => 마이크로 프로세서 cpu에서 실행

 

임베디드/범용 유사점

- 프로세서 내장 -> 동일 구조 : 프로세서, 메모리, 입출력 장치 구성

- 하드웨어 성능 향상 + 소프트웨어 유연성 -> 성능,유연 고려한 공조 설계 가능

- SW 사용 -> 시스템 설계, 시간 단축, 업그레이드 용이

 

임베디드와 범용 차이점

- 특정 분야에 최적화 -> 범용성 저하

- 최적화를 통한 성능 향상 -> 시스템 유연성 감소

 

임베디드 하드웨어

1. 마이크로프로세서

- 컴퓨터 동작에 필요한 연산과 제어를 실행하는 하드웨어 -> 단일칩

- CPU + 소용량 메모리 + 필수 입출력 장치로 구성 -> 간단한 시스템 구현 가능

- 외부에 추가적인 메모리와 입출력 장치 더해서 컴퓨터 시스템 구현

 

마이크로 프로세서 내부 CPU

- ALU, 레지스터, 제어 유닛으로 구성

- ALU : 산술 연산, 논리연산, 쉬프트 연산 수행

- 레지스터 : ALU 연산 값 일시 저장

- 제어 유닛 : CPU 회로에 필요한 제어 신호 생성, 명령어 디코더 포함

컴퓨터, 마이크로 프로세서, CPU

주요 레지스터

- 프로그램 카운터 PC : 다음에 실행할 명령어가 저장된 메모리 주소 값, PC 변경하여 프로그램 실행 흐름 제어

- 명령어 레지스터 : 메모리로부터 읽은 명령어 저장. 명령어 레지스터에 저장 -> 제어 신호 생성

- 상태 레지스터 : 연산 결과에 대한 플래그 및 제어 정보 저장, CPU 연산 결과를 검사하여 플래그 형태로 저장 

  * 연산 결과가 0일때 -> 제로 플레그, 표현 범위를 넘길때 -> 오버플로우 플래그

  * 제어정보도 포함 : 인터럽트 활성화 비트

- 스텍 포인터 : 스텍의 데이터 저장 위치 저장 -> 스텍으로 사용하는 메모리 주소값 가리킴.

 * 스텍 : 프로그램 실행에서 중요한 메모리 영역, 임시 데이터 전달이나 함수 파라미터 전달 장소로 활용

 

2. 메모리

- 프로그램과 데이터 저장하는 디바이스

- 프로그램 메모리 : 프로그램 코드 저장

- 데이터 메모리 : 프로그램 실행과 관련된 데이터 저장하는 메모리

- 온칩메모리(마이크로 프로세서 내부) + 오프칩 메모리(마이크로 프로세서 외부) = 시스템 전체 메모리

 

메모리 보관 방식에 따라 분류

- 휘발성 : 전원 중지시 저장 데이터 회손. 데이터 임시 저장 장소. SDRAM

  -> 프로그램에 사용되는 데이터 저장

- 비휘발성 : 훼손되지 않고 정보 유지. 프로그램 코드/영구적 저장하는 데이터의 저장장소. 플래시메모리

  -> 프로그램 저장. 보존되어야 할 데이터나 다음에 반영해야하는 데이터도 저장

 

임베디드 메모리

- 가격은 비싸나 크기 작고, 가볍고, 전력 적고, 소음/발열없는 플래시 메모리 주로 사용

- 설계 목표 : 메모리 접근 시작을 줄이고 용량을 키워야 함

- ALU에 가까울수록 고속 메모리, 멀어질 수록 대용량 메모리를 계층적 사용 -> 최적 메모리 설계

- 여러 프로그램 사용시 한 메모리를 공동 사용. 각 프로그램은 물리 메모리를 자신혼자쓰는것 처럼 실행

  -> 가상 메모리

- 메모리 보호작업 : 메모리 공간을 타 프로그램의 불법적 접근 방지 -> 독립적 실행과 보안성 보장

- 가상 메모리 + 메모리 보호 작업 -> 하드웨어 자원으로 운영체제의 소프트웨어에서 수행

 

3. 입출력 장치

- CPU 계산 부담을 줄이기 위해 하드웨어 주변장치라 불림

- 특정 기능을 하드웨어로 구성 -> 마이크로 프로세서 처리 성능 향상

- 마이크로 프로세서 내부에 포함(on-chip 디바이스)

- 외부에 ASIC 형태로 추가하여 (off-chip 디바이스) 마이크로 프로세서에 연결 사용

- 오브칩 구현 : 프로세서 보드와 별도로 입출력 장치 보드를 추가하여 사용

 

입출력 장치 형태

- 메모리 보호 작업 : 범용 입출력장치, 타이머, ADC, USART 등

- 부가기능 입출력 장치 : 이더넷 컨트롤러, 오디오 컨트롤러, USB 컨트롤러 등

 

4. 마이크로 프로세서 기본 기능

- 프로그램 : 특정 작업을 위한 명령들을 논리적 순서로 배열. 메모리에 저장됨.

- 프로그램 메모리에 저장된 프로그램 실행

- 결과를 데이터 메모리에 저장하거나 출력장치를 통해 외부로 출력

- 프로그램에 포함된 명령들을 정해진순서로 실행

 

명령어 실행 절차

- instruction fetch : 메모리에서 명령어를 읽어와 제어 유닛 명령 레지스터에 저장

- instruction decoding : 제어 유닛에서 명령어 디코더로 명령어를 해석하여 제어 신호를 생성

- data fetching : 명령 실행에 필요한 데이터를 데이터 메모리나 레지스터 등 데이터 저장 장소에서 가져옴

- data processing : ALU에서 데이터 처리

- result storing, write back : 결과를 레지스터나 데이터 메모리에 저장

 

마이크로 프로세서 명령 실행 흐름(기본 동작)

- 프로그램 메모리에서 명령어 읽음

- PC가 명령 주소값 가짐

- 명령어 레지스터에 명령어 저장

- 명령어 디코더가 번역

- 제어 신호 출력

- 데이터 필요 시 읽어옴

- 읽은 데이터로 ALU 연산/작업수행

- 레지스터/메모리 저장

5. 마이크로 프로세서 분류

- 데이터 처리 단위 : 4비트, 8비트, 16비트, 32비트 등

- 명령어 구조

    RISC Reduced Introduction Set Computer : 명령어 구조가 간단. 동일 작업에 간단한 여러 명령어 사용

    CISC Complext Introduction Set Computer : 명령어 구조가 복잡. 동일 작업에 복잡한 명령어 적은수 사용

- 메모리 연결 방식 : CPU와 메모리 연결 형태

     폰노이만 구조 : 프로그램과 데이터 입출력 경로가 동일

     하버드 구조 : 프로그램과 데이터 입출력 경로가 분리

- 사용 용도

   MCU Micro Controller Unit : 제어용 프로세서, 비트 단위 연산 명령어가 다양하고, 인터럽트가 빠르게 처리

   ASP Application Service Procsessor : 특정 용도에 최적화된 프로세서 -> 그래픽, 자바, 네트워크, 크립토 프로세서 등

   MPU Micro Processing Unit : 계산용 프로세서, 고성능 ALU 여러개 보유 -> 고속 계산 가능

   DSP Digital Signal Processor : 디지털 신호 처리 전용 프로세서

                                           MAC(음성/영상 데이터 처리) + FPU(부동수소수점 연산기)로 구성

   임베디드 프로세서 : 소형, 저소비 전력에 최적화 된 프로세서

 

6. 상용 마이크로 프로세서

 32 비트

  - 인텔 x86 프로세서 : 인텔 범용 컴퓨터용 프로세서. 소형화와 소비전력을 줄여 임베디드 프로세서로 사용되기도함

  - ARM 프로세서 : 임베디드 프로세서 시장 점유율이 높음. 소비전력이 작으나 높은 성능 대부분 모바일 장치서 사용

  8 비트

   - 현재 임베디드 시스템은 32비트 프로세서가 주로쓰나 8비트도 수요가 유지됨

   - PIC 프로세서, AVR 프로세서, 8051 프로세서 : 구조가 간단, 가격대비 성능 우수 -> 소형 디지털 시스템과 간단제어

   - DSP : TI사의 TMS 시리즈. 시장에서 쓰이는 대부분의 DSP 프로세서

 

임베디드 소프트웨어

1. 초기화 코드

2. 운영체제

3. 라이브러리

4. 응용 프로그램

 

1. 초기화 코드

초기화 코드

- 주로 하드웨어 초기화 작업을 실행하는 프로그램

- 스타트업 프로그램, 부트코드, 부트로더라 불림

 

초기화 코드

- 어셈블리 코드로 됨 -> 직접 응용프로그램/운영체제 실행하여 실행환경 구축

- 하드웨어와 밀접하게 관련됨. 하드웨어 설계 완료 후 HW에 적합하도록 기존 초기화 코드 수정 작업 필요

- 위치 :  임베디드 시스템 메모리 하위번지에 위치

- 기능 : 하드웨어 자가진단 및 초기화, 운영체제 구동에 필요한 시스템 파라미터 설정, 운영체제 메모리 로딩 후 실행

 

대표적인 초기화 코드

- 범용 리눅스 부트로더 : LILO, GRUB 등

- 임베디드용 부트로더 : blob, U-Boot, Bootlr, ARMBoot 등

 

2. 운영 체제

임베디드 소프트웨어 구현 방법

- 순차적 프로그램 : 단순하고 순차적 기능 구현 -> 초기 임베디드 시스템에 많이 쓰임

- 운영체제 : 멀티태스킹, 멀티프로그램실행, 네트워크, 멀티미디어 제어

 

초기 임베디드 시스템 : 순차적 프로그램 방식 구현, 입출력 장치의 이벤트 처리 요청 ->예외처리로 실시간 처리

임베디드 발전 : 내부기능, 사용자외부와 인터페이스 다양/복잡 -> 순차적 처리 방법 한계 -> 운영체제 사용

운영체제 기반

- 다양한 입출력 장치 수용, 효율적 관리

- 시스템 동작 안정성 향상

- 실시간 요구 충족

- 개발 시간 단축 및 편한 유지보수

 

무료 : 원가 절감 -> 리눅스 : 실시간 성 향상 노력, 안전 보안 지속 개선 -> 많이 활용

상용 : 실시간성과 원활한 기술 지원

자체 개발 : 회사에서 자체 필요로 개발

 

3. 라이브러리

- 응용 프로그램들에서 공통적으로 사용되는 프로그램 모듈들의 집합

- 멀티미디어, 그래픽 처리, 데이터베이스, 웹서비스, 사용자 인터페이스 - 응용프로그램 개발에 많이 쓰임

-> 운영체제와 응용프로그램 사이에있어 미들웨어 라고도 함.

- 잘 정의된 프로그램을 재사용하여 개발시간과 비용 절약 가능. 오픈소스로 공개됨

 

4. 응용 프로그램

- 시스템 구체적인 구닝을 구현한 프로그램

- 시스템 사용 목적에 맞춰 최적화 되어야 함

- 적절한 라이브러리 선택하여 개발시간과 비용 절약필요

300x250
728x90

임베디드 시스템

- 특정 용도에 최적화 된 컴퓨터 시스템

- 전기/전자 회로 + 마이크로 프로세서

 

임베디드 시스템 특징

- 성능 및 자원에 높은 효율 > 범용 시스템

- 저비용, 고성능 > 전용 하드웨어/범용 시스템

 

임베디드 장점

- 하드웨어로 속도 향상

- 소프트웨어로 유연 -> 기능 블럭들 구현, 변경, 수정 용이 -> 개발 단축, 비용 절약

- 처리 작업이 큰건 하드웨어로 구현 -> 시간 절약, 성능 향상

 

임베디드 단점

- 하드웨어/소프트웨어 혼재 -> 에러 소재 파악 힘듬 ->디버깅힘듬

- 설계 공간 확대 -> 다양한 설계가능 -> 최적 설계 예측 힘듬

- 하드웨어/소프트웨어 공조 설계가 가능한 전문 인력 부족

 

임베디드 시스템 구조

- 하드웨어 : CPU, 메모리, 입출력

- 소프트웨어 : 응용 소프트웨어, 라이브러리, 운영체제

임베디드 시스템 구조

임베디드와 범용 컴퓨터 차이

- 동일한 구성 <-> 목적에 따라 최적화

- 동일한 범용 cpu 사용 하나 사용 목적에 따라 설계 구조 변경

* 간단한 시스템은 소프트웨어 만으로 구현 가능

 

응용 분야

- 가전/개인단말 장비

- 사무 자동화 장비

- 공장 자동화 장비

- 네트워크 장비

- 군/항공우주/운송 장비

 

 

설계 특성

 

1. 설계 목표

- 고성능/ 실시간 처리/ 최적화/ 유연성/ 신뢰 및 안정성 보장/ 소비 전력 최소/ 경쟁력 / 환경 친화

 

2. 고려 요소

초기 단계

- 프로세서 : 고성능, 저가

- 운영체제 : 실시간 os/비실시간os/ 순차형 프로그램, 메모리 사용량  + 정책

설계 중 항상 고려

- HW 자원 활용도 향상 : 최소한 자원, 최적화 코딩 요구

- 시스템 유연성 확보 : 업그레이드 기능 확장 고려, hw/sw 설계 필요

- 신뢰/보안 향상 : 불법적 접근 방지 -> 리버스 엔지니어링 방지

 

3. 구현 방법

- HW-SW 공조설계 방식

- HW 구현 방법 

 1. 범용 컴퓨터 사용 -> SW만으로 구현 (os없이 펌웨어만으로도 구현 가능)

 2. 전용 CPU 보드 설계 + ASSP( 표준화 입출력 디바이스) + 전용 IC 개발)

  - 설계 겅험, 비용 시간 큼 -> 최고 성능

 3. SoC + ASSP

  - SoC 안에 CPU와 ASIC을 구현할 수 있는 프로그래머블 디바이스

  - 신뢰성 큼, 소비전력 적으나 설게비용 증가 

  - SoC에 포함할수없는 부분은 외부에 별도 ASSP 추가

 

SW 구현 방법

 1. 펌웨어 기반

  - 하드웨어 관리 간단

  - 프로그램이 동시 여러 작업 안함

  - 순차적 실행시 OS 없이 간단한 프로그램으로 완성

 2. 운영체제 기반

  - 하드웨어 자원 관리 복잡

  - 멀티태스킹 필요 한 경우

 

HW-SW 공조 설계

  -임베디드 시스템 -> 기능 블록별로 분리 -> 하드웨어 or 소프트웨어

  - 실행 속도, 메모리, 전력, 등 고려하여 구현방법 결정

 - 하드웨어 : 이미 판매하는 ASSP 사서쓰거나, 없으면 ASIC 직접 구현

 - 프로그램 언어, 프로세서 컴파일러, 운영체제 특성과 디버깅 비용을 고려하여 최적화 프로그래밍 구현

 

운영체제로 개발

 - 설계 기능 복잡, 순차 방식 한계, 동시 실행 필요 시

 - 32비트급 프로세서로 임베디드 시스템 구현시 운영체제 사용

 - 직접 개발, 상용/공개 운영체제 사용 

 

SoC (system on chip)으로 구현

- 마이크로 프로세서, 메모리, 주변장치 등을 하나의 칩으로 구현 IC

- 단일 칩 임베디드 시스템

-> 성능 향상, 소비전력 감소, 외부 잡음 차단, 크기 축소

<-> 많은 설계경험과 비용, 시간이 요구, 디버깅 힘듬

 

4. 설계 공간

- 설계 사양에 맞는 설계들이 형성되는 공간 

- 비용 함수 : 각 설계 사례를 평가하는 방법 -> 평가요소 시스템크기, 성능, 소비전력 x 평가 요소 별 가중치 = 설계 비용

- 설계 공간 탐색 : 비용함수를 최소화 하는 최적 설계 찾아가는 과정

- 설계 사양 -> 설계(+설계 경험/ 능력) -> 설계 평가(비용함수) -> 최적(아닐 시 재 설계) -> 최적 설계 결과

300x250
728x90

소스 코드 파일을 여러개 만드는 이유

- 큰 프로그램을 하나의 코드로 만들 시 -> 복잡, 분량이 너무 큼 -> 작업 불가 -> 논리/기능 단위로 분리

- 라이브러리 활용 : 자주 쓰는 함수를 파일에 모아 여러 프로그램에서 같이 사용

- 소스 코드 + 라이브러리 소스 코드 전체 같이 컴파일은 비효율 적

 

외부 기호 참조 문법 - EXTERN 문법

- EXTERN symbol

- EXTERN 기호는 심벌 테이블에 등록, 외부에서 선언된 기호라 표시

- opcode에 임의의 값을 넣었다가 나중에 다른 파일에서 심벌 테이블을 읽어 대치함.

 

EXTERN 대치 시 주의 사항

- EXTERN 기호가 대치 시 다른 파일의 주소 값을 사용 x

- 모든 파일의 기계어 코드 + 변수 데이터가 결국 하나로 합쳐 바이너리 생성됨

- 코드/데이터 영역 크기 고려 필요

 

오브젝트 파일 Object file

- 모든 소스코드가 매번 컴파일은 비효율 -> 필요한 코드면 컴파일 + 변경 없는 코드는 컴파일 x

-> 변경 없는 파일을 미리 컴파일 해둠

<-> 미리 컴파일 시 변경된 코드와 병합 시 주소 영역 등이 일치 x

- 중간 파일 역활

 

오브젝트 파일로 바이너리 만들기

- opcode는 모두 기계어로 바꿈. 기호 정보는 오브젝트  파일에 기록

- 각 오브젝트 파일의 기호/참조 정보 조합 -> 바이너리 파일 생성

 

링커 Linker

- 오브젝트 파일을 합쳐 바이너리 만드는 프로그램

- 정적 링킹, 동적 링킹

 

링킹 Linking

- 오브젝트 파일 간 기호 참조 정보를 모아 분석, 정리

 

정적 링킹 static linking

- 라이브러리 오브젝트 파일과 프로그램 오브젝트 파일을 합쳐 단일 바이너리 파일 생성

- 링커 동작하기 간단

 

동적 링킹 dynamic linkiing

- 라이브러리 특정 영역을 필요한 순간 재배치하여 프로그램 동작 하는 방식

- 정적 링킹에 비해 바이너리가 작고, 컴파일 빠름

- 구현 어려움

 

오브젝트 형식 설계 시 주의 사항

- 기호 정보와 참조 정보를 어떻게 유지할 것가

- EXTERN은 외부 파일 참조 의미 -> 다른 파일에서 해당 값을 찾지 못할 수 있음 -> 링킹 실패

 

EXPORT 기호를 사용하는 방법 

- 외부에서 사용하는 기호에 EXPORT 선언 키워드 쓰기

- EXTERN은 타 파일 심벌 테이블에서 EXPORT만 찾아 링커 구성

- 오브젝트 파일에 EXPORT 기호만 포함시키므로 간단 <-> 불일치 시 에러 발생, 자유도 저하

 

EXTERN만 사용하는 방법

- EXTERN 만으로 외부 참조 기호를 찾을 수 있도록 링커 설계

- 다른 오브젝트 파일 심벌 테이블에 있는 모든 기호/참조 정보로 본체를 찾아야 함.

 

오브젝트 파일 형식

- 헤더 : 어디에 어떤 심블 테이블이 있는지 표시. 링커는 헤더의 기계어 시작부터 읽고 합쳐 바이너리 완성

- 내부 심벌 참조 테이블 : EXTERN 제외한 모든 기호의 심벌 테이블 정보. 심벌테이블을 오브젝트 파일에 기록한것.

   타 오브젝트 파일의 EXTERN이 참조하는 대상

- 외부 심벌 참조 테이블 : EXTERN 선언 기호 기록. 타 오브젝트 파일의 내부 심벌 참조 테이블에서 주소/값 읽어       

   opcode 인자에 씀

 

오브젝트 파일 형식

 

오브젝트 파일이 서로 참조하는 방법

- 한 오브젝트 파일의 외부 심벌 참조 테이블은 타 오브젝트 파일 내부 심벌 참조 테이블 참조

-> 링커는 모든 오브젝트 파일의 내부 심벌 참조 테이블로 통합 심벌 테이블을 만듬

-> 통합 심벌 테이블에서 각 오브젝트 파일의 외부 심벌 참조 테이블의 기호를 찾아 값/주소를 전달

 

오브젝트 파일 -> 바이너리

- 기계어 코드 : 코드 영역 + 데이터 영역이 위치한 곳

- 기계어 코드 내 심벌이 참조하는 opcode 인자를 심벌 테이블의 값/주소로 대치

-> 바이너리 완성

재배치 relocation

- 링커가 오브젝트 파일을 합칠 때 배치되는 순서

- 이 순서에 따라 기계어 코드에서 참조 주소 절댓값이 변경됨 -> 주소 값을 정해주는 작업

- 오브젝트 파일 = 재배치 가능 파일 형식

- 링커는 주소 절대 값이 바뀌어도 해당 주소 기호를 참조하도록 함

재배치 시 주소 지정 방식

- PC/Reg-PC 연관 주소 지정 방식을 제외한 모든 방식은 메모리 특정 위치를 절대값으로 주소 지정

- 절대 주소 지정 방식은 재배치로 기호/참조 정보의 주소가 바뀔 시 opcode의 주소 영역도 바뀌어야함.

- 연관(상대) 주소 지정 방식은 opcode 주소 영역 수정 필요 x

 

번역

- 코드의 체계가 바뀌는 과정

ex) 어셈블리어 -> opcode, opcode -> 기계어

 

컴파일 compile

- 상위 언어에서 하위 언어로 번역

- 최종 결과는 기계어

 

컴파일러 compiler

- 컴파일 하는 프로그램

 

빌드 build

- 컴파일 + 링킹해서 최종 프로그램을 만드는 전 과정

 

컴파일러 만들기

- 문법 정의가 필요

-> 대표적으로 BNF(backus-naur form) 베커스 나우어 형식

 

BNF

- 문법 체계가 있는 간단한 규칙 표현

 

BNF 예시

- ::= 은 프로그래밍 언어의 =처럼 우변을 좌변에 대입

- |은 또는

- <>는 확장

-> 문장에 대해 BNF로 아래처럼 정의

<문장> ::= <주어> <서술어>.
       | <주어> <목적어> <서술어> .
       | <문장> <접속사> <문장>.

 

BNF 정의 추가

- <>이 없는 경우 종결 기호

-> BNF 모든 규칙은 종결기호로 결과가 나옴

<주어> ::= <명사> <조사>
       | <명사>
      
<서술어> ::= <부사> <동사>
       | <동사>
      
<목적어> ::= <명사> <조사>
      
<명사> ::= 내 | 너 | 그
<동사> ::= 가다 | 오다
<부사> ::= 빨리 | 늦게
<조사> ::= 을 | 를 | 이 | 가
<접속사> ::= 그리고 | 그러나 | 그런데 | 하지만

 

BNF로 만들 수 있는 문장

내가 가다.
내가 오다.
너가 가다.
너가 오다.
그가 가다.
그가 오다.
내가 가다. 그리고 너가 오다. 그러나 그는 가다.

 

BNF 언어 설계

<program> ::= <block-list>
//프로그램은 하나의 블록 리스트

<block-list> ::= <ident>(<ident-list>) {<decl> <statement>}
              | <block-list> <ident> (<ident-list>) {<decl> <statement>}
/*
<ident> : 블록 이름
<decl> : 변수/상수 선언
<statement> : 연산/ 제어부분
*/

<ident-list> ::= <ident>
				| <ident-list>, <ident>

/*
ident-list 예시
       * ,를구분자로 사용
a, b, c, d, .., g
this_is_param
*/

<ident> ::= <ident> <ident-letter>
          | <ident> <digit>
          | <ident-letter>


/*
- ident의 예시
a
abbb
adasfwq53163
*/


<ident-letter> ::= a | b | c | ... | z | A | B | ... | Z
<digit> ::= 1 | 2 | 3 | ... | 9 | 0

<decl> ::= <def-decl> <var-decl>
		| <decl> <def_decl> <var-decl>

<def-decl>  ::= <ident> <number>

<var-decl> ::= <ident-list>;
		| <var-assignment-list>;
/*
  변수 선언부
<ident-list>; -> 변수명만 쓰고 ;로 끝냄
<var-assignment-list>; -> 변수명, 변수명, ... 변수명;
*/

<var-assignment-list> ::= <ident>=<number>
			| <var-assignment-list>, <ident>=<number>
/*
 변수 선언 문법
a=10
a=10, b=20, c=30
*/

<number> ::= <number> <digit>
// number : 십진수의 연속

<statement> ::= <ident>=<expression>	//a=3, c=a+b
            | <ident>(<ident-list>)		//func(), func(a, b, c, d, e)
            | (<statement-list>)
            | if <condition> then <statement>
            | while <condition> do <statement>

<statement-list> ::= <statement>
                  | <statement-list>; <statement>

<ident>=<expression>

<expression> ::= <term>
             | <adding-operator> <term>
             | <expression> <adding-operator> <term>

<adding-operator> ::= + | -

<term> ::= <factor>
        | <term> <multiplying-operator> <factor>

<multiplying-operator> ::= * | /

<factor> ::= <ident>
          | <number>
          | (<expression>)
          
<codition> ::= not <expression>
            | <expression> <relation> <expression>

<relation> ::= = | <> | < | > | <= | >= | ==


/*

if A > B then
C = A - B;
if A <= B then
C = B - A;
위 if문은 어셈블러어로 아래와 같이 컴파일 된다.
*/

if:
CMP A, B
BGT sub_a_b
BLET sub_b_a
sub_a_b:
SUB C, A, B
B end_if
sub_b_a:
SUB C, B, A
B end_if
end_if:
:

 빌드 과정

1. 컴파일러는 BNF 정의에 따라 소스코드 파싱(구문분석)

2. 최적화 된 어셈블리어로 번역 -> 고급언어의 결과 파일

3. 어셈블러가 오브젝트 파일로 변환

4. 링커가 오브젝트 파일 결합 -> 바이너리 완성

300x250
728x90

opcode의 한계

- opcode는 기계어와 1:1 대응 -> 모든 프로그램 작성 가능

- 프로그래밍 언어의 변수, 함수 같은 요소를 못써 과정이 매우 불편

 

어셈블리어

- Assembly language

- opcode보다 상위 프로그래밍 언어

- 어셈블리코드 -> opcode -> 기계어

 

어셈블리어의 추상화

- 추상화 정도가 낮은 경우 -> opcode와 유사 -> 기계어로 바로 번역

 

어셈블러

- asembler

- 에셈블리어를 기계어로 번역하는 프로그램

- 어셈블리어는 어셈블러에 종속됨 -> 에셈블러에 따라 문법이 다름

 

opcode와 어셈블러

- opcode는 cpu 제조사에서 정함 -> 특정 cpu의 opcode는 어셈블러와 상관없이 모두 똑같음.

- 어셈블러 개발사가 어셈블리 문법을 정함.

 

어셈블리어의 복잡도

- 문법의 정의에 따라 복잡 or 단순

- (추상화 수준을 낮춤) 단순 해질수록 opcode와 유사

- (추상화 수준을 높임) 복잡 해질수록 프로그래밍 언어에 가까워지며, 어셈블러 구현 힘듬

 

CPU 확장(데이터 버스를 16비트에서 32비트로)

- 접근 가능 메모리 용량이 32KB(2^16) -> 4GB(2^32)로 증가

- 여유 비트가 증가 -> 다양한 opcode 정의 가능

- 레지스터 확장 가능 : A, B, PC 3개 -> 16개(이 중 4개는 데이터 저장, 연산이 아닌 특수 용도)

 

레지스터 추가

- LR(Link register) : 하위 함수나 보조 루틴에서 작업을 마친 뒤 호출 위치로 복귀해야할때 호출 지점의 위치를 저장

- SP(Stack pointer) : 스택 레지스터 - 현재 사용하는 스택의 메모리 주소

- ST(Status) : 상태 레지스터 - ALU의 연산 결과를 저장하는 레지스터로 연산 결과와 같이 새 opcode에 사용

 

상테 레지스터(Status Register)

- 32비트 중 LSB 방향의 4비트만 사용

- 연산 결과가 32비트를 넘을 시 오버플로(overflow)에 1이 쓰임.

- 덧셈 or 곱셈 연산으로 자리넘김이 발생 시 캐리에 1을 씀.(ALU의 carry out 핀이 직접 연결됨)

- 연산 결과가 0일때 Zero에 1 써짐(ALU 출력 핀 전체가 연결된 32-input-NAND 게이트에 연결)

- 연산 결과가 음수일때 Negative에 1을 쓰기

특수 레지스터와 범용 레지스터

- 레지스터 16개 중 특수 목적의 LR, SP, ST, PC을 제외한 12개 레지스터는 데이터 처리용 

- 범용 레지스터의 이름은 A ~ L

 

어셈블리어 정의

- 이후 고급언어를 다룰것이므로 추상화 저수준 어셈블리어를 다룸

 

이동 명령

- MOV Rd, {Rs | Value}

- Rd : 데이터가 들어갈 레지스터

- Rs : 원본 데이터가 있는 레지스터

- Value : 그냥 값

- 이동 명령은 즉시 주소 지정 방식만 사용하므로 레지스터 이름이나 값을 직접 사용해야함.

*{A | B} 는 A나 B 둘중 하나를 선택

 

산술 명령

- 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산 5가지

- 주소 지정 방식을 어디까지 허용할 것인지 정해야 함

- ADD Rd, R1, {R2 | Value}

- SUB Rd, R1, {R2 | Value}

- MUL Rd, R1, {R2 | Value}

- DIV Rd, R1, {R2 | Value}

- MOD Rd, R1, {R2 | Value}

- 레지스터 끼리 or 레지스터와 값을 계산

- Rd는 값이 저장되는 레지스터

ex) ADD B, C, D => B = C + D

 

* 로드/스토어

로드 : SRAM -> 레지스터

스토어 : 레지스터 -> SRAM

 

로드/스토어 명령

- LDR Rd, { Rs | #Rs | [Rs] | [#RS] | Address | #Address | [Address] | [#Address] }

- STR Rd, { Rs | #Rs | [Rs] | [#RS] | Address | #Address | [Address] | [#Address] }

- 로드/스토어 명령에는 모든 주소 지정방식이 가능하도록 순서대로 지정

1. 레지스터 직접 주소 지정 방식

2. 레지스터-프로그램카운터 연관 직접주소지정방식

3. 레지스터 간접 주소지정방식

4. 레지스터-프로그램카운터 연관 간접주소지정방식

5. 단순 직접 주소 지정 방식

6. 프로그램 카운터 연관 직접 주소 지정방식

7. 단순 간접 주소 지정방식

8. 프로그램 카운터 연관 간접 주소 지정방식

 

로드/스토어 명령 예시

1. LDR A, [B] (레지스터 B에 0x2324가 저장 됨)

-> 주소 0x2324의 데이터를 읽어 레지스터 A에 저장

2. STR A, [B] (레지스터 B에 0x2000가 저장 시)

-> 레지스터 A의 값을 B의 값이 주소인 메모리(0x2000 번지)에 저장

 

논리 연산 명령

- AND Rd, R1, {R2 | Value}

- OR Rd, R1, {R2 | Value}

- XOR Rd, R1, {R2 | Value}

- Not Rd, {Rs | Value}

- 논리 연산은 즉시 주소 지정방식만 사용

- R1과 R2/Value을 연산하여 결과를 Rd에 저장

 

비트 시프트 명령

SHL Rd, R1, {Rc | Count}

SHR Rd, R1, {Rc | Count}

- 비트 시프트 명령도 즉시 주소 지정 방식만 사용

- R1의 데이터를 Rc 레지스터 혹은 count 만큼 왼쪽/오른쪽 시프트

 

* 이후 상태 레지스터를 사용하는 명령

 

비교 명령

- CMP R1, {R2 | Value}

- 연산 결과가 상태 레지스터에 저장 -> Rd, Rs 쓰지 않음

- CMP 명령으로 R1-R2가 0이 되거나 음수 인 경우 상태레지스터의 zero/negative 비트가 1이 됨

* SUB 명령 연산 결과에 따라 상태 레지스터는 변하지 않음

 

분기 명령의 종류

- BR { Reg | #Reg | [Reg] | [#Reg] | Address | #Address | [Address] | [#Address] }

- BSUB { Reg | #Reg | [Reg] | [#Reg] | Address | #Address | [Address] | [#Address] }

- BEQ { Reg | #Reg | [Reg] | [#Reg] | Address | #Address | [Address] | [#Address] }

- BGT { Reg | #Reg | [Reg] | [#Reg] | Address | #Address | [Address] | [#Address] }

- BLT { Reg | #Reg | [Reg] | [#Reg] | Address | #Address | [Address] | [#Address] }

- BGET { Reg | #Reg | [Reg] | [#Reg] | Address | #Address | [Address] | [#Address] }

- BLET { Reg | #Reg | [Reg] | [#Reg] | Address | #Address | [Address] | [#Address] }

 

분기 명령

- 분기 명령은 프로그램 카운터 레지스터의 값을 바꾸는 명령

 -> 주기억 장치 메모리 주소 만큼 데이터 처리가 필요

 -> 8개 주소 지정 방식 모두 사용

- BR : 조건 없는 분기. 해당 메모리 주소로 PC 값 변경

- BSUB : 분기 전 당시 PC 값을 링크 레지스터에 저장

 * 분기 명령은 함수 호출 등 구현에 자주 사용. 함수 처리 후 원래 위치 돌아갈때 그 원래 위치를 기억(링크 레지스터)

- BEQ : CMP 명령에서 R1, R2가 같을 때 분기 -> Status Reg : Zero bit 1 or Negative Bit 0

- BGT : R1이 R2보다 클때 분기 -> Status Reg : Zero bit 0 and Negative Bit 0

- BLT : R1이 R2보다 작을 때 분기 -> Status Reg : Zero bit 0 and Negative Bit 1

- BGET : R1이 R2보다 같거나 클때 분기 -> Status Reg : Zero bit 1 or Negative Bit 0

- BLET : R1이 R2보다 같거나 작을때 분기 -> Status Reg : Zero bit 1 or Negative Bit 1

 

 

*** 이전의 내용은 opcode 연관 어셈블리어 문법 ****

순수 어셈블리어 문법

- 상수 선언, 변수 선언, 레이블 정의 (분기 문법은 고급 언어에서 구현 예정)

 

상수 선언 문법

- 기호와 값을 정의 -> 어셈블리가 기호를 값으로 변경

- DEF symbol content

- content에 레지스터 이름, opcode, 다른 기호나 주소가 될 수 있음

 

변수 선언 문법

- BYTE symbol 초기값 : 1바이트 선언문

- WORD symbol 초기값: 4바이트 선언문

- STRING symbol "초기값" : 문자열 변수

- 상수 선언은 기호를 content로 변경, 변수 선언은 메모리 특정 위치에 변수 값이 저장

- 변수의 symbol이 변수 값이 저장된 메모리 주소 표현

 

레이블

- symbol:

- 어셈블러가 알아서 해당 위치 주소로 변경

 

어셈블러와 어셈블리어의 발전

1. (최초)기계어로 어셈블러 구현

2. 어셈블러로 어셈블리어 구현

3. 어셈블리어로 어셈블러 구현 ...

 

심벌 테이블(symbol table)

- 변수와 레이블 처리를 위해 어셈블러 수준에서 심벌 테이블을 만들어야 함.

 

심벌 테이블 만들기

- 어셈블리어 코드 한줄씩 읽기 -> 기계어로 변환

- 기호 정보(변수, 레이블) 만남 -> 기호 이름과 주소 오프셋 위치 심벌 테이블에 기록 -> 끝까지 읽어 심벌 테이블 완성

- 심벌 테이블의 참조 정보를 이용해 실제 값/주소로 대치하여 기계어 완성

 

심벌 테이블

- 기호 이름으로 구분 + 대치할 값이나 주소 등록

- 기호를 참조 위치 주소 오프셋은 ref에 기록

- 여러 번 참조 가능하므로 ref가 여려개 일수 있음

심벌 테이블 사용

- DEF symbol content -> content 값 자체로 대치

- [레이블] symbol : ->코드 영역 메모리 주소로 대치

 

메모리 영역 활용과 어셈블러

- BYTE, WORD, STRING으로 선언되는 변수는 메모리의 데이터 영역

- opcode가 어셈블러로 기계어로 번역되는 데이터는 메모리의 코드 영역으로 구분 필요

- 메모리에서 코드 영역과 데이터 영역을 어떻게 배치할 것인지 정책 필요.

 

메모리에 변수 영역 배치 방법

1. 변수 선언부에 두기

- 변수 선언부에 데이터 영역 배치

- 어셈블리어 코드 중간마다 변수 선언 시 코드 영역과 데이터 영역이 섞임 

 

2. 데이터 영역을 한 곳에 모으기

- 코드 영역의 앞이나 뒤 가능

- 코드 끝난 후 데이터 영역 배치시 중간 마다 변수 선언 되어도, 변수 선언 전에 참조되어도 상관 없음

- 변수 선언과 함께 심벌 테이블에 등록 순간에 실제 메모리 주소를 알 수 없다.

-> 코드 영역 번역 후 데이터 영역 할당 완료 후 심벌 테이블의 주소 공간 값 등록

어셈블러 동작

- 상수/변수 선언을 지나 코드 영역 만나면 opcode를 기계어로 번역

- 기호 참조시 심벌 테이블에서 해당 기도의 참조 위치 목록에 opcode의 프로그램 카운터 값을 넣음 

 -> 심벌 테이블 완성 후 참조 위치 목록 찾아 실제 값 넣음

 

two-pass 어셈블러

- 선언이 코드 보다 늦게 해석 -> 코드 해석시 심벌 테이블에 기호 정보가 없어 참조 위치 등록 불가

- 대부분 어셈블러는 두번 해석

- 첫 해석에서 코드는 무시하고, 데이터 정보만 해석하여 테이블 구성

 

two-pass 어셈블러 심벌 테이블 구성

1. opcode 건너 뛸때마다 어셈블러 내부 PC를 opcode 길이 만큼 늘림

2. opcode 건너 뛴 간격 만큼 데이터 영역 주소가 확정 -> 완전한 심벌 테이블

 

two-pass 어셈블러로 해석 예시

DEF   abc   50

BYTE  bbb  0xFF

 

MOV  A, abc

MOV  B, 0x33

 

ADD   C, A, B

STR    C, [bbb]

 

WORD nnn    0x10EF

 

LDR    A, [bbb]

CMP   A, C

BEQ    im_label2

 

im_label1:

LDR   D, #nnn

LDR   E, [#D]

CMP  D, E

SUB   F, D, E

BLET  im_label2

BGT   im_label1

 

im_label2:

SUB   F, E, D

SHR   G, F, 0x4

STR   G, [nnn]

STR   G, [#nnn]

 

첫 해석 후 심벌 테이블

two-pass 어셈블러 첫 해석

1. DEF abc는 값 50을 등록

2. 데이터 영역은 코드 영역 다음에 두므로 BYTE bbb의 주소로 0x44가 등록

3. nnn은 bbb 다음인 0x45로 주소가 등록

4. 레이블 im_label1/2는 코드 영역 주소 그대로 등록

5. 이후 주소, 갑, 해당 기호 참조 주소 기록 필요

* 주의) 명령어도 데이터 공간을 차지하므로 참조 주소의 값이 각 명령어의 시작 주소가 아님

 

심벌 테이블 완성하기

- 명령어는 32비트 -> 4바이트

- 명령어는 아래와 같이 분할되며 심벌 테이블에 참조 주소들이 등록됨

 

two-pass 어셈블러의 두 번째 해석

- 변수, 상수 등 기호 정보는 무시하고 기계어로 번역

- 기호 정보를 사용한 명령어를 만날시 심블 테이블에서 값/주소 찾아 사용

- 심벌 테이블에 없는 기호 사용 -> 에러 발생

어셈블러 처리 후 주소 배치

300x250

'컴퓨터과학 > 컴퓨터, OS' 카테고리의 다른 글

os만들기 - 1. 바이너리 에디터  (0) 2020.07.28
오브젝트 파일 ~ 고급 언어  (0) 2020.05.01
주소 지정방식  (0) 2020.04.29
Nand2Tetris 2 - 불 연산  (0) 2020.04.29
NAND2Tetris 1 - 불 논리  (0) 2020.04.25
728x90

폰 노이만 아키텍처에서 컴퓨터의 동작

- 데이터를 주기억장치에서 R/W 반복

-> 메모리 주소영역에 접근이 중요

but 아래의 회로에선 PC로 SRAM에 순차적으로만 접근 가능 -> 다른 주소 지정 방식 필요

폰 노이만 아키텍처 컴퓨터 회로

 

Opcode의 인자로 SRAM 주소 접근

- LDA 0x50(8비트 opcode 명령과 데이터)을 레지스터 말고 SRAM 주소에 저장

 * PC/SRAM 사이 Mux와 SRAM-레지스터 사이에 4출력 디먹스 사용

 

SRAM의 주소에 접근하기

- Demux(SRAM)에 sel0과 sel1이 둘다 0일때(NOR)

 -> Mux(PC)의 sel에 1 입력되도록 제어기 수정

 => PC가 가리키는 주소 뿐만이 아닌 SRAM에 임의(random) 접근 가능해짐 

 

접근 가능 주소 범위

- 현재 접근 가능 범위는 명령어 영역(8비트)+데이터 영역(8비트)이므로 0x00 ~ 0xFF까지만 가능

- 지금 SRAM은 64KB -> 전체 주소 영역이 0x0000 ~ 0xFFFF으로 전체 주소 접근 불가

 

주기억 장치 전체 주소 접근 방법

1. 데이터 접근의 지역성 이용 

2. 16비트 주소 값을 어드레스 디코더에 직접 입력

 

데이터 접근의 지역성

- 주로 접근하는 데이터는 실행 중인 메모리 위치 주변이 됨

- PC가 가리키는 곳의 근처 데이터를 자주 읽음

 

PC기준 8비트로 접근 가능 범위

- 8비트로 -128 ~ 127까지 가능

ex) PC가 0x3F20가리키는 경우

0x3F12, 0x3F16, 0x3F24, 0x3F28 ... 앞 뒤로 해당 범위 까지 접근가능

 

PC 중심으로 주소 값을 수정할 수 있는 회로

- SRAM DEMUX를 PC 16bit Adder 향해 입력 전달

- 8비트 이상 범위에 접근 불가

 

메모리 전체 주소 지정

- 현재 SRAM 회로 출력은 16비트이나 상위 8비트는 기계어로 사용되어

- 하위 8비트만으로 16비트 메모리 직접 지정이 불가

-> 16비트 출력 값이 모두 SRAM 디코더에 들어가도록 회로 변경이 필요

 => 8비트(기계어) + 8비트(데이터) or 16비트(주소 데이터)

 

제어기 확장

- (기존) 스위치 회로 -> (확장) 비교기 + 보조기억장치 + 8bit SRAM + 제어기 스위치 박스

- 동작

 1. 전원 연결시 보조 기억 장치의 데이터가 제어기 SRAM에 저장

 2. 주기억 장치에서 전달받은 상위 8비트 기계어는 비교기 거쳐 특정 값 출력

 3. 제어기 SRAM의 해당 주소에 저장된 값이 스위치 박스로 전달

 4. 컴퓨터 회로 제어

- 개선 : 스위치 회로를 복잡하게 구성할 필요가 없어짐 

메모리 주소 지정 이유

- 해당 메모리 값을 읽거나 쓰기 위함

 

즉시 주소 지정 방석(immediate addressing)

- 메모리의 주소를 지정하지 않음. 주로 레지스터에 값을 쓸 때 사용.

 

MOV

- move의 약어

- opcode : MOV 레지스터, 상수

- 상수 값을 레지스터에 저장한다.

- MOV A, 0x90 -> 레지스터 A에 0x90을 쓴다.

 

직접 주소 지정 방식(direct addresing)

- 1) PC에 8비트 값을 더하거나 빼서 메모리 주소를 구하거나

- 2) 직접 8비트 주소를 지정하는 방식 

 

단순 직접 주소 지정 방식(simple direct addressing)

- opcode의 인자로 사용한 값을 그대로 메모리 주소로 지정

프로그램 카운터 연관 직접 주소 지정 방식(PC relative direct addresing)

- PC 카운터에 opcode 인자를 더한 값을 주소로 지정

*로드, 스토어

로드 : 주기억장치에서 값을 읽어 레지스터에 저장

스토어 : 레지스터의 값을 주기억장치에 저장

 

opcode 추가

- LDR(Load register) : 레지스터에 값을 로드 

- STR(Store register) : 레지스터에서 값을 스토어

- 프로그램 카운터 연관 직접 주소 지정 방식 : #를 붙임

 

 예시

- LDR A, #0x34(현재 PC 값이 0x0046)

- 레지스터 A에 0x7A번지(0x0034 +0x0046) 데이터가 저장, PC는 0x0046유지

 

레지스터 직접 주소 지정 방식(register direct addressing)

- 레지스터 출력 값을 SRAM 주소로 전달되는 방식

- 레지스터 크기가 16비트로 SRAM의 주소 크기와 같으므로 전체 영역에 주소 지정 가능

- 레지스터에 미리 주소값을 넣어두어야 함.

 

예시

- MOV B, 0x34

- LDR A, B

 

레지스터-프로그램 카운터 연관 주소 지정방식(Register PC relative direct addressing)

- 레지스터와 PC값을 더해서 SRAM 주소 지정

-> PC 중심으로 전체 메모리 영역 접근 가능

 

간접 주소 지정 방식

- 주소 지정을 간접적으로 하는 방식

- 직접 주소 지정 방식으로 메모리에 주소 지정. 그 주소에서 출력된 SRAM 값을 주소로 다시 지정

 

전체 회로도

- 스위치에서 주소 지정 방식 처리가능한 CPU 회로

- 하드웨어를 제어하기 위해 기계어가 나오고 더 편하게 쓰기 위해 opcode가 나옴

 

 

300x250

'컴퓨터과학 > 컴퓨터, OS' 카테고리의 다른 글

오브젝트 파일 ~ 고급 언어  (0) 2020.05.01
어셈블리어 ~ 심벌 테이블  (0) 2020.05.01
Nand2Tetris 2 - 불 연산  (0) 2020.04.29
NAND2Tetris 1 - 불 논리  (0) 2020.04.25
NAND2Tetris 0 - 소개  (0) 2020.04.25
728x90

* 집에서 작성하다가 임시 저장을 하지 않고 꺼버려 첫 부분을 날려버렸습니다.. 날라간 부분은 대충 pass

 

2진수

 

32비트 컴퓨터

- 한번에 32비트씩 처리

 

2진수 덧셈

 

부호 있는 2진수

- MSB가 1인 경우 음수

반 가산기(Half adder)

- 입력 : a, b

- 출력 : s(합), c(캐리)

- 이전 연산으로부터 자리올림 입력받지 못함

 

 

전 가산기 (Full adder)

- 반가산기 2개와 or게이트로 구현

- 이전 연산으로부터 자리올림 c를 전달음

- 입력 : a, b, c(캐리)

- 출력 : s(합), c(캐리)

 

 

16비트 가산기

- 전가산기 16개를 이음 -> 16비트 수를 덧셈

inc16

- 16비트 이진수에 +1 연산

 

ALU

- 산술 논리 연산 장치

 

Hack ALU

- 입력 : 16비트 입력 2개, 제어 비트(6비트)

- 출력 : 16비트 출력

* 제어비트가 6비트 인 경우 최대 64가지의 연산 가능. Hack ALU는 16가지 연산 가능

https://georgefabish.com/the-alu/

 

- zx가 0이면 x/ 1이면 0 -> nx가 0이면 그대로/ 1이면 부정(y 동일)

- x와 y or/and 연산 후 f에 따라 or/and 선택

- f 결과와 f 결과 부정을 입력으로 받는 먹스 f에 따라 선택 -> out

- 16비트 전체가 0이면(or16way) zr = 0 아니면 1

- out의 최상위 비트가 1이면(음수) ng = 1/ 아니면 0

 * IsNeg 회로 사용 : out[15] & true = neg -> 먹스로 neg가 1이면 true, 0이면 false

 

- 후기

고향에 다녀오면서 잠깐 정리도 못하고 많이 해맸습니다.

확실히 챕터 1과는 다르게 어려웠던 점은

챕터 1의 회로는 그래도 진리표 대로 정리해가면서 구현해 갈순 있었는데

ALU를 구현할때

if zx 인 1 경우를 어떻게하라.. 처럼

조건문을 어떻게 회로상으로 구현해야할지 정말 막막했지만

다행이 다른 분들이 올리신 글보고 많은 참고가 되었습니다.

 

- hdl을 구현할때 게이트만 입력으로 가능한줄 알았는데 true, false도 가능한 점

- 16비트 x와 false 먹스16 연산시 false가 1비트가 아니라 16비트 false로 되서 출력이 되는 점

- 영 여부 확인할때 N way Or 게이트를 사용하면 된다.

- 음수 여부 확인 시 최상위 비트 체크하면 된다

 

이 외에도

Hardware simulator를 사용하면서 자잘한 에러들이 많았습니다.

 

아직 챕터 2장까지 밖에 못했는데 마무리 할수있을지 걱정됩니다 ㅠㅜ

 

참고 사이트

https://github.com/havivha/Nand2Tetris

https://github.com/sake92/nand2tetris

https://georgefabish.com/the-alu/

 

300x250

'컴퓨터과학 > 컴퓨터, OS' 카테고리의 다른 글

어셈블리어 ~ 심벌 테이블  (0) 2020.05.01
주소 지정방식  (0) 2020.04.29
NAND2Tetris 1 - 불 논리  (0) 2020.04.25
NAND2Tetris 0 - 소개  (0) 2020.04.25
기계어~OPCODE  (0) 2020.04.25
728x90

모든 디지털 장비

- 컴퓨터, 폰, 라우터 등 정보 저장하고 처리하는거 전부다

- 칩 구성은 다 다르지만. 논리 게이트로 만들어짐

 

논리 게이트

- 다른 물질로 만들거나 만드는 방법은 다르더라도 모든 컴퓨터에서 똑같이 논리 연산을 수행

- NAND를 주로 사용

 

불 게이트(Boolean gate)

- 부울 함수를 따름.

 

부울 대수(Boolean Algebra)

- 부울 대수는 Boolean(이진) 값을 처리함

- 2진 입력을 받아 2진 출력을 보냄

 

진리표(Truth Table)

- 입력에 대한 부울 연산 결과를 들을 보여 줌

 

기본 부울 연산자(boolean operator)

- And, Or, Not

 

AND(논리 곱)

- 둘다 1이면 1

 

OR(논리 합)

- 둘중 하나면 1이면 1

 

NOT(부정)

- 1이 입력되면 0, 0이 입력되면 1 -> 반전

 

기본 부울 연산의 수학적 표현

 

불 함수

- 부울 연산자를 조합한 함수

 

불 함수의 예시와 진리표

 

표준 형식(Canonical Representation)

- 위 불 함수의 경우 1인 경우들만 모아 다음의 표준 형식으로 정리할 수 있음.

2입력 부울 함수 정리


논리 게이트

- 게이트는 부울 함수를 물리적으로 구현한 장치

- 스위치 역활을 하는 트랜지스터로 만들어짐

 

기본 논리 게이트

 

조합 논리 게이트

- 기본 논리 게이트를 조합하여 만들 수 있음.

하드웨어 기술 언어

- HDL(Hardware Description Langauge) = VHDL(Virtual HDL)

- 하드웨어 설계자들은 실제 게이트를 조립하지 않고 HDL로 설계함.

- HDL 프로그램을 시뮬레이션에 입력하여 결과를 구함.

 

Xor 게이트 만들기

- Xor(a,b) = Or(And(a,Not(b)), And(Not(A),B))

 

HDL 작성하기

- HDL 칩 정의는 헤더와 파츠 부분으로 나뉨

- 헤더는 칩 인터페이스를 정의 -> 칩의 이름과 입력 출력 핀

- 파츠에서는 저수준 파츠의 구성과 이름 등을 정의함.

 

Vscode Nand2Tetris 하이라이팅 설치

- VScode에서 Nand2Tetris를 위한 문법 하이라이팅 제공하고 있다.

 

 

Xor 게이트 구현

- Xor.hdl : 헤더에 Xor 게이트 칩 인터페이스 정의, Parts 섹션에 파츠 연결관계 정리

- Xor.tst : 하드웨어 시뮬레이터에서 사용할 테스트 데이터

- Xor.out : Xor.tst에 따라 시뮬레이션 테스트 결과 

Nand2Tetris 하드웨어 시뮬레이션 수행 결과

NAND Gate 구현 및 실험

 

먹스(Multiplexor)

- 입력 : a, b 입력과 둘중 하나를 출력으로 보내는 선택 비트 3개로 이루어짐

- 먹스 진리표에 따라 회로를 다음과 같이 정리 할 수 있음.

먹스 시뮬레이션

 

디먹스(DeMultiplexor)

- 입력으로 in과 sel을 받아 sel이 0이면 a, sel이 1이면 b로 보내는회로

 

디먹스 시뮬레이션

16비트 Not

 

And16

 

Or16

 

Mux16

 

Or8way

 

Mux4way16

- 우선 4-way-mux 구현

- 이후 4-way-mux 16개를 이음

 

Mux8way16

- 우선 8-way-mux 구현

- 이후 8-way-mux 16개를 이음

* 이 코드는 동작은 잘하는데 문제는 너무 길다. 다른사람들이 한걸 보니 MUX16을 구현 후 4 입력을 처리해주더라..

 

DMux4Way

 

 

 

DMux8Way

 

300x250

'컴퓨터과학 > 컴퓨터, OS' 카테고리의 다른 글

주소 지정방식  (0) 2020.04.29
Nand2Tetris 2 - 불 연산  (0) 2020.04.29
NAND2Tetris 0 - 소개  (0) 2020.04.25
기계어~OPCODE  (0) 2020.04.25
ALU~보조기억장치  (0) 2020.04.24

+ Recent posts