제어/전자HW설계

Introduction to Nios II

KAU 2020. 9. 7. 21:50

 

Nios II

소프트 프로세서 FPGA device 위에 CPU를 만든것이죠 

 

Introduction to the Altera Nios II Soft Processor 

Nios II Processor Reference Handbook 

DE1-SoC Computer System with Nios II

 

위의 메뉴얼을 참고해서 강의를 할것이며 참고해서 보면 됩니다.

 

 

Overview

RISC 프로세서다 ==>(Arm)

인스트럭션의 갯수가 작다라고 의미한다. 

instruction set 갯수가 작기 때문에 

하드웨어 개발을 할 때 편합니다.

==>덜 복잡하다. 발열이 덜 일어나고 심플하고,, 모바일에 좋고 

<==>

CISC 아키텍쳐 (==>Intel x86)

복잡합니다. 

하지만 복잡한 만큼 

복잡한 일을 잘할 가능성이 크다 

 

Arm은 코어만 팔아요. ==> 손정희가 최대 주주라고 하네요. 팔려고 한다는데요? 

 

데이터는 메모리와 레지스터 사이에서 왔다 갔다 합니다.

모든 Instruction이 CPU에서 이루어지고 

타겟이 되어야 하는 놈은 레지스터가 되어야 합니다.

 

CPU에는 ALU가 있는데 핵심적인 연산을 합니다. 

연산을 하려면 A+B해서 C에 저장한다고 하면 

A와 B 데이터가 있어야하고 C도 있어야겠죠 

ALU입장에서는 어디에 있어야 하느냐?

그 데이터를 저장하는 공간이 Register입니다. 

빠른 메모리라고 생각하면 되고 

Nios II에서는 레지스터 하나가 32bit 입니다. 

word란 무엇인가

의미를 가지고 있는 데이터를 처리하는 단위라고 생각하면 됩니다. 

word의 길이는 컴퓨터마다 다른데 

우리 수업시간에서는 32-bit라고 생각하면 됩니다. 

고정되어있는 값입니다. 

모든 데이터는 워드 단위로 움직이니다. 

모든 레지스터는 32비트이다. 

32bit = 4bytes 

옛날에는 8bit를 1byte라고 했어요 

 

이게 하나의 유닛이었는데 워드나 바이트나 똑같다고 생각을 했어요.

16비트 32비트 64비트 이렇게 발전을 했는데 

 

 

Harvard architecture 

데이터와 프로그램 메모리가 논리적으로 분리되어두개의 버스를 가지고 있는 구조

 

instruction이랑 data가 분리가 되어있다는 뜻 

 

폰 노이만 아키텍쳐 

데이터와 프로그램 메모리가 구분되어 있지 않고 하나의 버스를 가지고 있는 구조

폰 노이만 아키텍쳐에서는 CPU-MEM가 필수적입니다. 메모리가 만만한게 아니에요

CPU-MEM

메모리에는 두가지가 들어가는데 

Instruction = 컴퓨터가 해야할 일을 명령어를 주는것 

명령어를 한줄 한줄 읽어서 메모리에서 CPU로 가면 

CPU에 있는 레지스터에 저장이 된다.

==>CPU에서 동작하게 된다

Data = 필요하면 메모리에서 가져다가 레지스터에 잠깐 저장했다가 CPU에서 쓴다.

 

Byte-addressable memory 

메모리는 한줄 한줄이 데이터가 저장되는데

1byte 단위로 저장하는것이 메모리 입니다.

바이트 단위로 한바이트 한바이트 저장할 수 있는것이다.

컴퓨터도 메모리를 읽어올 때 주소값을 가지고 찾는다. 

2진수 혹은 16진수로 표현을 합니다.

주소값 하나에 한 바이트가 맵핑이 되어 있습니다. 

4바이트 한 워드를 읽으려면 4개 address를 읽거나 쓰는게 한 워드를 

가져오거나 쓰는겁니다. 

instruction은 읽기만 가능하고 (R)

Darta는 읽기도 하고 쓰기도 합니다. (R/W)

 

instruction bus와 data bus를 따로 분리해서 관리를 해서 

구조도 심플하게 하고 효율도 올리는것이 하버드 아키텍쳐 입니다.

 

fast:빠르다 standard:보통 economy:좋지 않음

Endianness

어드레스 하나당 한 바이트만 저장할 수 있습니다.

레지스터는 32bit인데 한 바이트씩 읽어옵니다.

레지스터에서 최상위 바이트가 메모리에서 최하위 어드레스 일 때 Big-endian<=>Little-endian

Nios II는 Little-endian이다. 

 

Supervisor mode & User mode

하드웨어 밑에 있는것을 건드리게 되면 전반적으로 문제가 될 수 있어서

일반적인 어플리케이션을 이용하는 사람들이면 User mode를 이용하는데 

critical한 일을 해야하는 경우 supervisor mode로 접근 권한을 높여서 

작업을 하고 다시 돌아오는 형태로 작업을 한다.

Supervisor mode는 거의 모든 작업을 할 수 있고

User mode는 일부 instruction에 대한 접근이 제한되어 있다.

 

Nios II는

레지스터가 어떻게 생겼는지

instruction이 어떻게 생겼는지 

알면 모두 배운것 이라고 생각하면 된다.

 

Register는 CPU안에 있는 빠른 메모리 라고 생각하면 되는데 

그 크기가 32bit 이며 4byte의 하나의 워드로 구성 

general-purpose 범용 레지스터가 있고

special-purpose register가 있다. 

 

넓이는 32bit이고 세로로 32개 있다. 

메모리는 어드레스로 접근하지만 

레지스터는 이름이 저장되어있어요.

r0 r1 r2 r3 ~~ r31까지 저장이 되어있습니다.

 

이 레지스터를 가지고 무엇을 하느냐?

프로그래밍을 할 때 필요한거 가져다가 쓰면 되요 

r3에 저장하고 r4와 더해서 r5에 저장하는등 

읽거나 쓰거나 하는게 범용 프로세서에요. 

 

r0

r0 는 zero 레지스터라고 하는데 

이것은 값을 변경시킬 수가 없고 항상 zero가 입력되어있어요

0이 필요한 일들이 종종 있어서 

r0에서 0값을 가져오면 됩니다. 

 

r1

r1 같은 경우 at로 줄여서 Assembler Temporary 입니다. 

원래는 한줄 한줄이 하나의 기능을 수행하게 되는데 

하나 처럼 구성되어있고 우리가 느끼기에는 한줄이긴 하지만 

컴파일러가 여러줄로 바꿔서 처리하는 것이? 있는데

그것을 여러개로 나눠서 

메모리 공간이 필요해서 사용하는것이 r1입니다.

 

r2~r23

r2~r23까지가 정말로 우리가 원하는대로 사용할 수 있는 범용 레지스터이고 

r24부터는 또 여러가지 기능이 있습니다. 

 

r31

r31은 Return Address 입니다. 

C에서 말하는 function 같은 것이 있는데 

원래 function은 function에 가서 return 값을 받잖아요?

다시 돌아오는 그 장소의 위치를 적어놓고 가야되는데

이 위치를 저장해 놓을 공간이 필요한데 이게 바로 ra입니다.

이거 함부로 잘못 변경하면 큰일납니다. 못돌아오니까..

 

r29 r30
ea ba 

Exception return address 이상한 일이 발생하면 

function call 하는것과 비슷하게 급하게 일을 처리해주고

다시 돌아오는 형태

 

Breakpoint 

디버그 돌릴 때 찍어 두고 하잖아요? 

그게 ba에요  ==> 특정 숫자를 맵핑한것을 외울 필요는 없답니다. 

 

r26 ~ r28

어디에 있는지 알려주는것이 포인터 였죠?

그 위치를 저장해놓고 있어야 하니까 

주소값을 저장해줘야되요 

각각의 위치를 저장해주는거에요. 

 

Global Pointer

함수 C에서 변수들이 대부분 local변수인데 global로 저장해주는 공간을 가르켜 주는것이 글로벌 포인터에요

 

Stack Pointer

스택구조에서 맨 위에 있는 위치가 s.p가 됩니다.

 

스택이 무엇인가? ==> LIFO 나중에 들어간놈이 처음 튀어나오는거에요.

스택이 말이죠 맨날 쓰는것은 주변에 있잖아요?

맨날 쓰는 데이터가 위에 있는게 좋잖아요? 

그래서 스택 구조를 사용하면 좋아요

 

Queue는 ?==> FIFO 처음 들어간놈이 처음 튀어나오는겁니다. 그냥 줄서기에요

 영국에서는 줄서기를 큐라고 한다고 해요

 

Frame Pointer

스택 구조에서 밑 바닥에 있는것을 Frame Pointer라고 합니다.

 

r24 ~ r25

하드웨어에서 임시공간이 필요할 때 et bt를 사용하게 되는데 

직접적으로 사용하는 경우는 없습니다.

 

제어에 관련된 control register를 알아볼것입니다.

6개의 basic control register 만을 알면 된다. 

레지스터의 하나의 크기는 32bit이고 

basic control 레지스터에서 가장 많이 쓰는 0개는 

ctl0~ctl5까지 정해져있고 이름도 정해져있다. 

 

status

상태를 기록해주는 레지스터 주로 읽기를 합니다 레지스터 크기가 32비트이만 하위비트 2개만 사용합니다.

b1은 유저모드인가 아닌가 

b0는 인터럽트를 쓸것인가 말것인가를 정해주는 것이다.

인터럽트란? 뒤에서 얘기하구요

 

estatus

exeption이 발생했을 때의 status

 

bstatus

break가 발생했을 때의 status를 저장해 주는공간

 

cpuid 

Unique processor identifier 

CPU 코어가 여러개 있으면 

각각의 CPU를 사용하는지 안하는지

이러한 것들을 알려주는것 우리는 직접적으로 사용하지는 않습니다.

 

ienable 

Interrupt가 동작이 가능하냐?

각각의 비트가 인터럽트 아이오 포트랑 연결되있어서 

각각 핀들이 인터럽트를 쓸지 안쓸지를 결정하는것이다. 

 

ipending

Pending이라는 것은 임시로 수용하는 이런 느낌인데 

각각 핀이 지금까지 인터럽트가 발생했는지 안했는지를 

확인해주는것이다.

 

컨트롤 레지스터를 사용할 때는 슈퍼바이저 모드를 사용하게 되는데 

 

rdctl 

wrctl 

위 두가지 명령어를 이용해서 

컨트롤 레지스터를 읽거나 쓰거나 할 수 있다.

 

General register에서는 아래 명령어를 사용한다.

ld

st

범용 reg<-> 외부 mem에서 데이터가 왔다 갔다 하는것

==>자세한 설명은 뒷부분에서

 

ALU에서 메모리나 IO등 외부에 있는 데이터들을 읽어오려 할텐데 

왼쪽이 인스트럭션 오른쪽이 데이터와 관련된것이죠 

하버드 구조죠?

프로그램 카운터는 인스터럭션들이 있으면 

한줄 한줄 실행을 할텐데 지금까지 

현재 수행하고 있는곳의 위치를 저장하는것이 

프로그램 카운터에요

주소값이 4씩 증가할거에요

 

General purpose register는 데이터와 관련된 경우가 많죠

그래서 우측에 general purpose register가 있고 

 

양쪽에 Tightly coupled memory가 있다.

 

Cache

중간 중간 에 cache가 있는데 

캐쉬는 cpu core mem가 있는데 메모리에 있는 데이터를 읽어와서 사용하고 back하고 

하는데 register는 책상이고 메모리는 엄청 멀리있는놈이죠(도서관 같은)

모든 데이터를 책상 앞에 펼쳐 둘 수는 없는데 

그래서 캐쉬라는것을 만들어 뒀는데 작은 책 꽂이라고 생각하면 되요.

cpu내부에 있어서 임시로 데이터를 저장할 수 있고 빠르게 access할 수 있다는 장점이 있다.

캐시는 주소값이 없어요 ==>사용하려면 전부다 찾아와야됩니다. 

 

fast모드에서는 Intruction 캐쉬와 data 캐쉬가 둘 다 있어요.

인스트럭션 캐쉬가 더 효율적입니다. 

대부분의 경우 한줄 처리하고 다음줄 처리하는 식으로 줄줄이 처리하게 되는데

캐쉬에서 데이터를 발견할 확률이 굉장히 높습니다. 

hit rate가 굉장히 높습니다. <=> 데이터 캐쉬는 좀 떨어집니다.

 

캐쉬를 넣음으로써 퍼포먼스가 향상되는경우가 굉장히 많습니다.

 

CPU의 성능은 

코어수 클락수가 높은경우

클락수는 올리는게 한계가 왔어요

코어수는 좀 늘긴 했는데 

요즘은 캐쉬 사이즈에서 성능 차이가 나게 됩니다.

 

캐쉬는 내가 조절하는것이 아닙니다.

캐쉬는 없어도 사실 문제는 없어야 합니다.

 

TCM 

CPU에 메모리가 있는데 주소값도 있고 

같은 방식으로 access합니다. 

훨씬 빨리 저장하고 가져올 수 있죠 

TCM은 메모리이기 때문에 

 

한정된 공간에서 쥐어짜기 때문에 

자주 자주 사용하는 데이터들이 무엇인지 알아야 

==>TCM에 몰아 넣어야 

임베디드 엔지니어는 TCM을 활용하는 실력에 따라서 성능차이가 많이 납니다.

 

Load / Store instruction

메모리에 데이터를 accesse하기 위해서 사용을 한다.

 

'제어 > 전자HW설계' 카테고리의 다른 글

[전자HW설계] LAB3  (0) 2020.09.30
[전자HW설계] LAB2  (0) 2020.09.22
[전자HW설계] 3-1 [Nios II 이론 마무리]  (0) 2020.09.14
[전자HW설계] 2-2  (0) 2020.09.10
[전자HW설계] [1-1]  (0) 2020.09.01