제어/전자HW설계

[전자HW설계] 3-1 [Nios II 이론 마무리]

KAU 2020. 9. 14. 17:44

Assembler Directives

.으로 시작하고 뒤에 키워드가 나옵니다. 

 

.ascii 'string"

문자열은 ""안에 넣어야 문자열이구나 하고 인식하고 알파벳 하나 하나에 해당하는 메모리에 들어간다.

 

byte나 word

뒤에 숫자를 쓰면 거기에 해당하는 형태로 초기화가 된다.

 

.data 

뒤에 있는것은 데이터이다.

 

.equ

define 하는것과 비슷함

symbol, expression이 같은것

 

.global symbol

모든 영역에서 다 보이는 변수를 지정

 

.include "filename"

c에서도 마찬가지로 헤더파일을 사용하는데

일종의 헤더파일을 설정할 때 include를 해서 사용

(equ등을 지정해놔서 include 해줄 수 있는것)

 

.org new-Ic

잘 안씀

 

.skip size

size만큼 공간을 비워 놓고 가라

=>output 결과를 저장할 때 사용한다.

 

.text 

여기서부터는 텍스트 

 

.end

여기서 종료한다.

 

Example Program

start

대부분의 프로그램은 초반에 메모리에서 레지스터로 데이터를 ld로 가져오고

마지막에 결과 값을 메모리에 저장했었죠

레이블을 맨 왼쪽 칸에 맞춰 쓰고 레이블에 해당하는 instruction을 한 탭 정도

띄워서 쓰는게 관습입니다.==>보기 좋아서. 주석도 가능합니다.

 

movia r2 AVECTOR

카피해오는것.i:숫자.a:주소

AVECTOR에 해당하는 주소를 r2에 저장을 하게 됩니다.

일종의 포인터 역할을 하게 되는것이죠

 

ldw r4,0(r4)

r4가 가르치고 있는 위치의 값==>6이 됩니다.

6을 r4에 저장한다.

 

add r5,r0,r0 

r5에 0이 들어간다.

r5는 sum이다

 

ldw r6,0(r2)

r6<=5

 

ldw r7,0(r3)

r7<=2

 

mul

r8<=r6*r7

 

addi r2,r2,4

다음 것을 가리킬 수 있도록 +4바이트 해주는것

 

subi r4,r4,1

r4를 루프가 끝낼 때 마다 1씩 줄여주고

 

bgt r4,r0,LOOP

r4>r0일 때 루프를 돌라는 의미

 

stw r5,DOT_PRODUCT(r0) 

store the result in memory

DOT_PRODUCT 어드레스에 저장을 하겠다.

 

STOP: br STOP

코드가 사라지지 않게 maintain해준다.

더보기

 

시험장에서 즉석으로 작성할줄 알아야합니다 물론 주석도 ^오^ 더 긴코드가 나올 수도 있답니다~~^ㅗ^

 

Exception Processing

예외 처리

외부 IO와 관련된 부분은 Exception으로 처리하고 있다.

main에서는 놀고 있고 exeption만 처리하는 경우로 프로그램이 바뀌는 경우도 있다.

Exception 프로세싱은 중요하다!!.. 

일반적인 마이크로프로세서에서 비슷한 형식으로 다루고 있다.

 

Software trap 인위적으로 발생시킬 수 있다.

==>우리는 운영체제를 짜는것이 아니기 때문에 잘 건드리지는 않는다.

 

Hardware interrupt 

우리가 주로 다룰 부분

 

Unimplemented instruction

모든 비트를 다쓰는것은 아니고,, 

못알아듣는 명령어가 왔을 때 exeption을 발생 시키는것 

 

CPU에서는 어떤일이 일어날까?

==>CPU내부에서 자동적으로 일어나는 일들

현재 돌고 있는 상황을 저장해 놓아야하니 카피를 한다.

status register(ctl0)를 estatus register (ctl1)에 카피를 함 

 

U bit를 클리어한다.

U bit clear==> 유저 비트를 클리어 한다는것은 슈퍼바이저 모드로 들어간다.

 

PIE clear

Process Interrupt Enabel 비트를 0으로 한다.

다른 인터럽트를 처리하지 않겠다.

 

instruction의 어드레스를 Ea register에 저장한다.

 

Exception gandeler의 주소를 Execution에 넘긴다.

 

 

Exception 핸들러의 주소는 어떻게 결정되느냐?

설계할 때 적게 된다.==>미리 정하는것입니다. 

필요에 따라서 동적으로 바꾸는것이 아니에요

 

Software trap

말 그대로 trap이라는 명령어를 사용해서 exeption을 프로그래머가 발생시키는것

O/S가 다양한 프로그램들을 왔다갔다 하면서 스케쥴링할 때 사용한다.

 

외부 시그널이 들어오면 I/O 디바이스에서 인터럽트가 뜨는것

irq0 through irq31==> 32비트에 들어감

 

어떤 interrupt-request input이 발생했는지

 

하드웨어 인터럽트는 사용자가 셋업을 해야 발생한다

PIE but는 status register에 저장되어있는데

PIE가 1로 셋 되어 있어야 발생한다.==>두꺼비 집과 같은 존재

 

interrupt-enable bit가 1로 셋팅이 되어야 한다.

 

32개의 인터럽트를 전부사용하는것은 아니잖아요?

다 열어두지는 않아요. ex)키보드, 타이머만 쓸것이다..

irqk is asserted 실제로 키보드의 해당키가 들어온다던지==>실제 이벤트를 말하는것

 

위의 세가지 조건을 만족하면 인터럽트가 발생한다.

 

32개의 다양한 인터럽트가 발생할 수 있는데

인터럽트가 발생했는데 어느 인터럽트가 발생했는지 알 수있는 방법이 있다.

어떻게 알 수 있는가

ctl4에 가서 ipending register를 읽어볼 수 있어요.

 

나머지는 0이고 해당 비트만 1로 셋팅이 되어있다.  

 

정확히 한클락에 들어오면 highest priority에 따라서 처리함

ISR:interrupt-service routine==인터럽트 핸들러

ISR로 점프해서 원래 해야하는 일들을 하게 되는겁니다.

 

 

Exception Type을 결정할 때

1.Ipending register를 봅니다. 

하드웨어 인터럽트가 발생했으면 Ipending register가 발생했을것.

 

2.Exception이 발생했을 때 

PC값의 value가 ea 레지스터의 값이 카피가 되는데 

이때의 어드레스가 +4가 ea레지스터에 저장이 되죠

-4 그 전것으로 가면 그 직전에 발생했던 인스트럭션을 알 수 있는데

그것이 만약 trap이다 그러면 software-trap이라고 생각할 수 있는것이죠.

 

1번도 2번도 아니면 unimplemented instruction이에요==>버그 같은 존재

 

하드웨어 인터럽트에 대한 예제 코드에요.

==>irq1번이 셋팅되는거

 

Exception handler>

ipending 레지스터 값을 et에 카피를 해서 

et와 r0를 비교를 하죠 

같으면 oter_exeption으로 보내버리는거죠 

0이 아니면 하드웨어 인터럽트가 되고

그때 ea레지스터를 4만큼 감소를 시켜라

exception을 처리하고 그 다음 비트로 진행하기 때문에 위에것이 제대로 수행이 안되었을테니 -4를 해줘서 다시 시작을 합니다.

et와 2와 and를 해요==> 두번째 레지스터만 1이되면 되는거죠 

이것을 r13에 저장을 하는겁니다. ==>이게 1이되면 irq1은 1로 살아남는것이죠.

 

r13이랑 r0랑 equal인지 확인을 합니다.

0이면 ==>irq1은 0이다 ==>우리가 원했던 인터럽트가 아님==>oter_in ~ 으로

1이면 calll EXT_IRQ1 ==>원래하려던 일을 합니다.

하려던일을하고 return됩니다. 

 

br END_HANDELER 

eret로 가서 끝남

하드웨어 인터럽터는 항상 마지막에는 eret으로 간다.

 

캐쉬 메모리 

멀리있는 실제 메모리의 실제 데이터를 가져오기 힘드니 중간에 캐시메모리를 두는것

 

I-cache와

8워드로 사이즈가 정해져 있다.

==>정할수 있긴하다, 외울필요는 없어요

 

D-chche가 있다

다양한 사이즈로 되어있다. ==>데이터 사이즈는 다양하니까

그리고 서로 분리되어있어요.

 

init:0으로 만드는거 

flush 데이터가 실제 메모리로 가서 쓰여지느냐?.?

==>우리는 잘 쓰지는 않는다고 합니다.

우리는 캐쉬를 잘 만지지는 않으니까 

 

Cache Bypass Methods 

CPU에서 메모리로 갈때 

메모리가 아니라 I/O모드에 대해서는 Cache는 거치지 않는 인스트럭션들이 존재한다.

뒤에 io를 붙이면 캐쉬를 건너 뛰고 바로 I/O로 Access한다.

 

CPU안에 있는 메모리

프로그래머는 외부에 있는 메모리인것처럼 다루면 됩니다. 

ldaw,,stw,,

 

좋은 엔지니어는 TCM을 잘 다루긴 해야됩니다.

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

[전자HW설계] LAB3  (0) 2020.09.30
[전자HW설계] LAB2  (0) 2020.09.22
[전자HW설계] 2-2  (0) 2020.09.10
Introduction to Nios II  (0) 2020.09.07
[전자HW설계] [1-1]  (0) 2020.09.01