제어/전자HW설계

[전자HW설계] LAB2

KAU 2020. 9. 22. 23:07

32개 비트 중에서 1이 몇번 연달아서 나오느냐?

가장 간단한것은 for문 돌리는거겠죠?

계속 1일 때 까지 모니터링하다가 1나오면 스탑하고

그것이 max면 비교해서 갈아치우고?

for문 돌리면 몇번 돌아가는가?

0~31까지 32번 루프가 돌게 되어있다.

 

r9에 NUM을 집어 넣습니다. 

0x 뒤에 있는 애가 16진수다라는 말입니다. 

알파벳 하나가 4개의 비트를 표현합니다. 

32비트면 4개가 8개 있어야겠죠?

 

16진수로 적는 이유는 사람들이 읽기 편하니까

r9에 들어가게 되는데 r9에 있는 2진수 중에서 

비트1이 몇번 나오는지 카운트 할것이다.

 

r10은 결과를 저장시키기 위한 레지스터

r9에는 3fabedef 들어가 있다.

 

 

srli r11, r9, 0x01

shift right logical i

 

1만큼 오른쪽으로 밀어서 r11에 저장해라

로지컬에서는 비는곳을 0으로 채운다.

 

 

and r9,r9,r11

r11이랑 r9를 and한다는것은 

두 비트가 둘다 1이면 1이된다.

 

addi r10, r10, 0x01

r10에 1을 증가시켰다.

 

한텀 한텀 내려가면서 1이 연속으로 있는 애들만 살아남는다. 

 

beq r9,r0,END

r9가 0이니까 END 시켜버린다. 

 

 

shift를 활용한 알고리즘은 naive한 알고리즘보다 훨씬 간단하다.

 

더보기
7번
8번
8번

 

인풋 레지스터로 r4에 타깃이 되는 데이터를 집어넣을것이다. 

call ONES 열심히 안에서 계산해서 

r10을 리턴한다.

ONES안에 몇번 1이 연속으로 나오는지 r2로 반환을 한다.

 

원스는 너무 간단하니까 메인을 작성하세요.

결과값을 도출해주는데 딱 한번만 합니다.

input은 r4에 결과값은 r2에 들어간다. 

두번째 NUM을 리턴할것이다.

더보기

.global _start

_start:
ldw r2, TEST_NUM(r0) /* Load the data into r9 */
mov r4, r0 /* r10 will hold the result */

LOOP: beq r2, r0, END 
call ONES


ONES:
beq r2, r0, END
srli r11, r2, 0x01 /* Count the 1s by shifting the number and */
and r2, r2, r11 /* ANDing it with the shifted result */
addi r4, r4, 0x01 /* Increment the counter */

br ONES

END: br END /* Wait here */

TEST_NUM: .word 0x3fabedef /*example*/ 

.end




 

ZEROS: 0이 몇번 들어가는지 카운트 하는것

ALTERNATE:왔다 갔다 하는것==>번갈아가면서 왔다 갔다 하는것 

==>01010101 이런식 

 

세개의 서브루틴을 만들어야 합니다.

 

ZEROS

ZERO는 사실은 뒤집어서 ONES를 찾으면 됩니다.

 

굉장히 많이 쓰이는 트릭// 기억해 두자

MIPS에서는 NOT을 지원하지 않아서 ==>XOR을 사용한다.

계산을 한번 더 하는거라서 계산하는 입장에서는 좋지 않지만

==>구현하기는 굉장히 편합니다.

 

ALTERNATE

alternate도 XOR을 사용합니다. 

한번 쉬프트 시킨다음에 

오리지널이랑 XOR하면 

 

         1010 

         0101

XOR   ------

         1111

==>ONES를 다시 한번 써먹는다.

32비트라고 생각해봤을 때

ONES는 서브루틴 하나 돌면 끝날텐데 

ZEROS는 1 XOR을 사용해서 뒤집는다.

 

call ones하지 마세요?

 

서브루틴 안에서 call ones를 하면 

좋지 않습니다. ==>스택을 만져줘야 되서 이렇게 하지 마세요

그니까 ONES 코드를 그냥 가져와서 붙이는게 제일 좋습니다.

 

 

7개의 작대기가 있는데 

7개의 비트가 할당이 되어있다.

BIT_CODES에 적어놨다. 

한 바이트 단위를 사용하게 되는거죠

 

 

 

정해진 어드레스에 정해진 비트에 0을 쓰는가 1을 쓰는가에 따라서 세그먼트의 불빛이 바뀐다.

 

add r15,r15,r4 

r4만큼 더해서 어떤 숫자를 출력할지 정한다.

 

ldb r2,(r15)

r2에 로딩을 해둬서 무엇을 정할지까지 정해준다.

 

stw를 해야 눈에 보인다.

 

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

Lab4  (0) 2020.10.12
[전자HW설계] LAB3  (0) 2020.09.30
[전자HW설계] 3-1 [Nios II 이론 마무리]  (0) 2020.09.14
[전자HW설계] 2-2  (0) 2020.09.10
Introduction to Nios II  (0) 2020.09.07