This is Sue Jang
전자 하드웨어 설계 내용정리(1/2) 본문
1. Introduction to NIOS 2 Soft Processor
현대 전자 시스템의 구조
- 임베디드 시스템: 특정 기능을 수행하기 위해 특정 시스템에 내장된 general computer system
- 구성 요소:
- CPU, 메모리, 센서, 액츄에이터
- 이들 간의 연결을 위한 네트워크 인터페이스
이 수업에서 집중할 것:
- 특정 기능을 수행하도록 CPU를 Command하는 방법
- hardware system의 메커니즘을 알아야 한다
플랫폼 (Platform)
- 잘 설계된 architecture을 재사용
- 유명한 플랫폼 예시: Windows, Raspberry Pi, Arduino, Android
- 우리의 platform: DE1-SoC Computer
Stored-Program Computer
- 프로그램은 데이터와 동일하게 취급돼 메모리에 저장됨 (그래서 쉽게 다룸)
- 프로그램의 예전 정의: Component를 연결하는 작업
- 프로그램의 현재 정의: Data를 사용하는 작업
- 두 가지 주요 아키텍처:
- 폰 노이만 아키텍처: 프로그램과 데이터를 같은 메모리에 저장
- 하버드 아키텍처: 프로그램과 데이터를 별도 메모리에 저장
2. 명령어 세트 아키텍처 (ISA, Instruction Set Architecture)
- ISA는 저장 리소스와 연산 정의
- ISA 덕분에 프로그래머와 하드웨어 엔지니어가 역할 분담을 정확히 하여 설계 가능
ISA의 구성 요소
- Storage resource (저장 리소스): 레지스터(flip flop의 집합)과 메모리 포함
- 무슨 종류의 특수 목적/일반 목적 레지스터가 있는지?
- 얼마나 많은 레지스터가 프로그램에서 사용 가능한지?
- 각 레지스터는 얼마나 wide한지?
- 메모리의 주소 공간은 얼마나 큰지?
- 저장공간에 있는 데이터에 어떻게 접근하는지? = Addressing Mode
- Operations (연산)
- 아키텍처 안에서 어떤 종류의 연산이 제공되는지?
- 덧셈, 뺄셈, 로드/스토어, 소프트웨어 인터럽트
- Exception 발생 시 어떻게 행동하는지?
3. 프로그래밍 흐름
(아래 4개의 역할을 이해해야 오류 발생 시 어느 단계에서 해결 가능한지 알 수 있음)
- 컴파일러: 소스 코드를 어셈블리 코드로 변환
- 컴파일은 대상 시스템에 따라 달라짐 (x86, ARM 등)
- 어셈블러: 어셈블리 코드를 바이너리로 변환
- 링커: 바이너리 모듈과 라이브러리를 결합해 실행 파일 생성
- 로더: 실행 파일을 메모리에 로드
4. Nios II 프로세서 개요
- 32비트 RISC 소프트 프로세서로, Intel FPGA에서 사용 가능
- FPGA (Field Programmable Gate Array): 프로그래밍 가능한 집적 회로
- Nios II는 DE1-SoC platform이 사용하는 CPU 이름
Nios II의 특징
- 합성 가능한 RISC Processor
- RISC (Reduced Instruction Set Computer): CPU의 ISA
- 대표적인 RISC 프로세서
- ARM 프로세서 (스마트폰, 태블릿 등)
- MIPS (임베디드 시스템)
- Nios II (Intel FPGA 용)
- MIPS-like ISA
- MIPS: Microprocessor without Interlocked Pipeline Stages
- RISC 계열의 명령어 집합 체계
- 하버드 아키텍처 채택
- 명령어와 데이터가 별도 메모리에 저장됨
- 32-bit Processor
- 1 word = 32 bit
- instruction 당 1 word
- 각 일반 목적의 레지스터는 32bit
5. Operating Modes (운영 모드)
- Supervisor Mode (관리자 모드)
- 프로세서는 어떤 기능이든 수행 가능
- 프로세서는 초기화되면 supervised mode에서 실행됨
- User Mode (사용자 모드)
- 프로세서는 processor state에 상당한 영향을 주는 주요 기능을 수행할 수 없음
레지스터 구조
- 32개의 일반 목적 레지스터 (GPR, General Purpose Register)
- 각각 32bit (4byte) 길이
- 특수 목적 레지스터 (SPR, Special Purpose Register)
- rdctl, wrctl 명령어를 통해 접근 가능 (Supervisor Mode에서만 가능)
6. Hardware Interrupt Generation (하드웨어 인터럽트 발생)
- 외부 하드웨어에서 발생한 이벤트가 프로세서에 신호를 보내 작업을 중단
- 프로세서는 이벤트 발생 여부를 계속 확인하지 않아도 됨 (비동기적 통신 방식)
- ipending register: 현재 처리 중인 인터럽트 상태 확인
- 인터럽트 발생 여부 확인용
- ienable register: 특정 인터럽트 소스를 허용하거나 차단
- → 어떤 **IRQ (Interrupt Request)**가 발생했는지 ipending과 ienable을 통해 알 수 있음
7. Accessing Memory and I/O Devices (메모리 및 I/O 장치 접근 방식)
Load-Store Architecture
- Load (memory → register), Store (register → memory)
- 지원하는 데이터 타입
- word (32비트): 1w = 4byte = 32bit
- half word (16비트): 1h = 2byte = 16bit
- byte (8비트): 1b = 1byte = 8bit
Alignment Restriction (메모리 정렬 제한)
- Multibyte 데이터 타입은 특정 주소에서만 저장 가능
- 예: 8 byte 데이터 타입 → 8의 배수 address 위치에서만 저장 가능
Byte Order: Little Endian 방식
- 데이터를 메모리에 저장할 때, 가장 낮은 자리의 바이트(LSB)를 먼저 저장하는 형식
- Little Endian: LSB가 낮은 주소에 저장됨
Memory-Mapped I/O (MMIO)
- I/O 장치를 메모리처럼 접근 가능
- I/O는 일종의 메모리처럼 취급되며, Load-Store 명령어로 핸들링됨
Cached vs Non-Cached Memory
- Cached Memory: 프로그램의 명령어와 데이터를 저장하여 속도를 향상
- Non-Cached Memory: **Memory-Mapped I/O (MMIO)**는 캐시 사용하지 않음
Tightly-Coupled Memory
- CPU와 직접 연결된 고속 메모리
- 캐시를 통과하지 않아 고속 처리가 가능 (Load-Store Architecture와 반대 개념)
8. Instructions (명령어)
Machine Instruction Formats (기계 명령어 형식)
- 프로세서가 직접 실행 가능한 형태
- I-type, R-type 등 다양한 형식 존재 (마이크로프로세서 시간에 배운 내용과 동일)
Pseudo Instructions (유사 명령어)
- 어셈블러가 1개 이상의 관련된 machine instruction으로 변환하는 명령어
- 사용 이유
- 프로그래머 입장에서 직관적
- 하드웨어 설계자 입장에서 하드웨어 설계 요소가 줄어듦
9. Addressing Modes (주소 지정 방식)
어떤 operation을 수행하기 위해 해당 데이터를 어떻게 가져올 것인가?
데이터를 Storage (Memory, Register, …)에서 접근 (Load, Store, …)하는 5가지 방법
- Register Addressing
- 모든 Operand(피연산자)는 Register
- 예: add r1, r2, r3 → r2, r3가 피연산자
- Displacement Addressing (= Effective Addressing)
- Address = Value in a register + displacement
- Format: M[base + displacement]
- base: register에서 값 가져옴
- displacement: signed 16-bit immediate instruction
- M: external memory
- Immediate Addressing
- Immediate data가 instruction field에 직접 들어감
- Operand가 instruction 내에서 상수로 저장됨
- Register Indirect Addressing
- Register가 가리키는 메모리 위치에 있는 데이터를 사용
- Format: M[base] (Displacement 항상 0)
- Absolute Addressing (= Displacement Addressing)
- M[displacement]
- base가 항상 r0 (=0) → 절대적인 메모리 주소 사용
10. Instruction 종류
1) Data Transfer (데이터 전송 명령어)
- Load / Store Operations
- Cached Operations
- ldw, ldb, ldbu, ldh, ldhu
- stw, stb, sth
- Non-Cached Operations (Memory-Mapped I/O)
- ldwio, ldbio, ldbuio, ldhio, ldhuio
- stbio, sthio
- Syntax
- ldw rB, byte_offset(rA)
- effective_address = rA + sign_extend(byte_offset) → displacement addressing
- rB = M[effective_address]
- stw rB, byte_offset(rA)
- M[effective_address] = rB
- ldw rB, byte_offset(rA)
- Cached Operations
2) Data Processing (연산 명령어, 6종류)
- Arithmetic Operations (산술 연산)
- add, addi, sub, subi
- mul, muli, div, divu (Nios II에서는 지원 X)
- Syntax
- add rA, rB, rC: register addressing
-
addi rA, rB, immed16: immediate addressing
-
Nios II는 모든 operand가 32bit여야 해서 immed16 을 32bit로 signed extension해야됨. (왜 signed? 산술 연산 해야돼)
-
- Logical Operations (논리 연산)
- and, andi, andhi, orhi, xorhi
- Syntax
- and rA, rB, rC: register addressing
- andi rA, rB, immed16: immediate addressing
- Nios II는 모든 operand가 32bit여야 해서 immed16 을 32bit로 unsigned extension해야됨. (왜 unsigned? 논리연산이므로 부호가 딱히 중요 x
- ex) %hi(0x12345678) => 0x1234 (상위 16비트 return)
- ex) %lo(0x12345678) => 0x5678 (하위 16비트 return)
- Move Operations (데이터 이동)
- mov, movi, movui, movia
- Syntax
- mov rC, rA == add rC, rA, r0
- movi rC, immed16 == add rC, r0, immed16
- immed16은 sign extension 필요
- movia rC, LABEL == orhi rC, r0, %hi(LABEL)
- LABEL의 상위 32bit만 뽑아감
- Comparison Operations (비교 연산)
- cmpeq, cmpne, cmpge, cmpgeu, cmpgt, cmpgtu, cmple, cmpleu
- cmpeqi, cmpnei, cmpgei, cmpgeui, cmpgti, cmpgtui, cmplei, cmpleui
- Shift / Rotate Operations (시프트 및 회전 연산)
- srl, srli, sra, srai, sll, slli, ror, rol, roli
- Carry and Overflow Detection (Carry 및 오버플로우 감지)
- (overflow: 결과물의 size가 너무 커서 register에 온전히 표현되지 못함)
- addiction (A+B = C)
- unsigned overflow when C=0 & A,B<0) or (C<0 & A,B>=0)
- 아래는 overflow detection 방법
- add rC, rA, rB
- cmpltu rD, rC, rA // rC
- signed overflow when (C>=0 & A,B<0) or (C<0 & A,B>=0)
- Subtraction (A-B = C)
- unsigned overflow는 B>A일 때 detect
- signed overflow는 (C>=0 & A<0 & B>=0) or (C<0 & A>=0 & B<0)일 때 detect
- unsigned overflow when C=0 & A,B<0) or (C<0 & A,B>=0)
- addiction (A+B = C)
11. Control Instructions (제어 명령어, 4종류)
1) Branch Operations (조건부 분기)
- beq, bne
- Syntax
beq rA, rB, LABEL: Displacement addressing. LABEL은 linker 와 loader에 의해 상수로 해석되는 심볼이다. 즉, rA와 rB가 같으면 address가 LABEL로 옮겨진다.
2) Unconditional Branch Operations (무조건 분기)
- br, jmp
- Syntax
- br LABEL: Absolute addressing
- jmp rA: register addressing
3) Subroutine (함수 호출 연산)
- call, callr, ret
- Syntax
- call LABEL
- callr LA
- ra <-- PC + 4
- PC <-- rA // rA랑 ra는 다르다 (unconditional branch 와의 차이점)
o Mechanism of subroutine call
1) Place parameters in GPR
2) Transfer control to procedure
3) Acquire storage for procedure (sp(스택포인터)로 저장공간 확보)
4) Perform procedure’s operations
5) Place result in GPR for caller
6) Return to place of call
- caller: subroutine call을 부르는 주체
- callee: subroutine call 그 자체
- 만약 argument가 4개 이상이면 register 대신 memory를 통해 processing하고, performance는 줄어듦. 보통 4개의 argument까지만 사용하기에 이렇게 설계됨.
- 기타 명령어
- SPR 관련 control operations
Assembler directives (어셈블러의 지시어, 명령어)
'Engineering courses > Electronic Hardware Design' 카테고리의 다른 글
전자 하드웨어 설계 내용정리 (2/2) (0) | 2025.02.01 |
---|