반응형

이번에는 시퀀스 카운터에 대해 알아볼께요


SEQUENCE COUNTER SEGMENT에 들어갑니다.


그럼 다음과 같은 화면이 나올거에요

인풋값은 하나인데 아웃풋은 2개인데다가 인풋값보다 짧군요.

지문을 읽어보도록 하죠

SEQUENCES ARE ZERO-TERMINATED

READ A SEQUENCE FROM IN

WRITE THE SUM TO OUT.S

WRITE THE LENGTH TO OUT.L

해석해보자면

0을 기준으로 하나의 출력값을 만듭니다.

IN값을 받아서

OUT.S에는 더한 값을 출력하고 

OUT.L에는 더한 갯수를 출력하세요.

군요


이제 이 로직을 어떻게 만들까에 대해서 생각해보도록 하죠.

우선 0이 들어오기 전까지의 갯수를 카운트 하는 모듈이 하나 필요하고 

그다음은 0이 들어오기전까지 값을 더하는 모듈이 하나 필요 할듯하네요.

그리고 0이 여러번 들어왔을때의 처리방법도 생각해둬야 겠네요.


그런 끝에 만들어진 로직이 다음과 같습니다.

뛰어넘는 구간이 많고 조잡해보이지만 이 로직을 참고로만 보신다면 더 줄일 수 있으실겁니다.

물론 무조건 줄인다고 좋다는건 아니지만 말이죠


잡설은 그만하고 코드분석을 하도록 하죠.

첫라인의 값들은 인풋으로 들어온 값을 좌,우,아래로 보내주는 역활을 하고있습니다.

매우 심플합니다.

그 다음 라인을 보죠

첫번째 모듈부터 보도록 하겠습니다.


입력값을 받아서 ACC에 저장합니다.

0인지 비교하여 0이면 ZERO: 로 넘어가고 아니면 아래 로직을 실행합니다.

SWP  BAK과 ACC값을 바꿉니다.

오른쪽에서 들어오는 값을 저장합니다.

END로 이동합니다.

0일 경우 이후 로직이 수행됩니다.

BAK과 ACC 값을 바꿉니다.

ACC의 값을 아래로 보낸 후 0으로 초기화합니다.

이후 END: 로직으로 BAK값을 ACC로 돌려둡니다.


첫번째 모듈은 0값을 기준으로 입력값을 누적하는 모듈입니다.


두번째 모듈을 보죠

위에서 보내온 값을 받습니다.

0인지 확인 합니다.

0일 경우 ZERO: 로 이동합니다.

그렇지 않을경우 ACC의 값을 왼쪽으로 이동합니다.

그 후 1을 오른쪽으로 이동합니다.







두번째 모듈은 ACC의 값을 가지고있다가 0이 필요할때 보내주고 갯수를 증가해주는 부분입니다.

여기서는 따로 처리하는 부분이 크지않습니다.

입력값을 보내던가 갯수를 추가하기위한 값을 보내는 정도라서 다시 잘 수정한다면 이 로직은 없어도 될거같은 부분이네요.

일단 지금까지는 합을 구하는 부분까지만 나왔으니 다음 모듈이 갯수를 구하는 모듈이라는 것을 짐작하실수 있을겁니다.


그럼 세번째 모듈을 보도록 하죠

위에서 값을 받아 ACC에 저장합니다.

0인지 확인하여 0이면 ZERO로 이동합니다.

아닐경우 BAK 값과 ACC값을 바꿉니다.

그리고 왼쪽에서 오는 값을 더합니다.

END로 이동합니다.

0일 경우 다음로직을 수행합니다.

BAK값과 ACC값을 바꿉니다.

ACC값을 아래로 보냅니다.

ACC값을 0으로 초기화합니다.

BAK값과 ACC값을 바꿉니다.


첫번째 모듈과 비교를 해보면 달라진 부분이업습니다.

네 똑같아요

단지 왼쪽으로 받느냐 오른쪽으로 받느냐의 차이뿐입니다.

마지막 세번째 라인은 해당값을 OUT으로 보내는 것 뿐이네요.


이상으로 SEQUENCE COUNTER를 마치도록 하겠습니다.


반응형
반응형

이번에는 시퀀스 발생기를 알아볼께요.

시퀀스는 최소값과 최대값이 정해지면 해당 값안에서 자동으로 번호가 매겨지는 것을 말합니다.

이 시퀀스를 만들기 위한 발생기를 만들거에요.


우선 SEQUENCE GENERATOR SEGMENT를 들어가보겠습니다.

세그먼트 접속!!


접속 후 다음화면을 볼 수 있습니다.

두개의 입력을 받아서 출력한 후에 0을 한번 더 출력해주네요.

지문을 읽어보도록 하죠

SEQUENCES ARE ZERO-TERMINATED

READ VALUES FROM IN.A AND IN.B

WRITE THE LESSER VALUE TO OUT

WRITE THE GREATER VALUE TO OUT

WRITE 0 TO END THE SEQUENCE

음음

그렇군요.

그렇답니다 ㅎㅎ


좋아요 해석해보도록 하죠

해당 시퀀스는 0에서 끝나는 시퀀스입니다.

IN.A 와 IN.B를 읽은 후 

작은 값을 먼저 출력

그 후 큰값을 출력하고 

0을 출력한뒤 끝내는 시퀀스입니다.

....

참쉽죠??

말로만 하면 뭐든 못할까요.. 후...

로또 1등도 당첨될듯 한 기분이네요 

그럼 우선 어떻게 풀었는지 한 번 보도록 하죠

보시는 바와같이 한녀석만 매우 열심히 일을 하고있습니다.

간단하게 설명을 하자면 IN.A의 값과 IN.B의 값을 받아서 비교를 하고 작은 순서부터 받아서 아래로 내리는 로직입니다.

코드로 볼까요?


이상으로 시퀀스 발생기를 마치겠습니다.

반응형
반응형

이번에는 멀티플렉서에 대해 알아보도록 할께요.

멀티플렉서란?

최선의 유효이용을 꾀하기 위하여 각 통신로(채널)의 필요 성분을 재배치하는 장치

-네이버 지식백과-

즉 여러개의 입력값이 들어왔을때 나에게 필요한 데이터로 입력값을 재정리하는 것을 말하는 겁니다.

이제 시작해보도록 하죠.

SIGNAL MULTIPLEXER SEGMENT로 들어가주세요.


네 이렇게 생긴녀석입니다.

들어가면 다음 화면이 뜰거에요.

확인을 해보면 입력값을 3개를 받고 출력값이 하나네요.

출력값을 보면 어떨때는 IN.A 값을, 어떨때는 IN.B값을 어떤때는 전혀 다른값을 출력합니다.

전혀다른 값이 어떤값인지를 알기위해서 문제를 읽어봐야 할 것 같군요.

READ VALUES FROM IN.A AND IN.B

READ A VALUE FROM IN.S

WRITE IN.A WHEN IN.S = -1

WRITE IN.B WHEN IN.S = 1

WRITE IN.A + IN.B WHEN IN.S = 0

IN.A 값과 IN.B의 값들을 받습니다.

그리고 IN.S의 값을 받아서 

IN.S의 값이 -1이면 IN.A, IN.S의 값이 1이면 IN.B, IN.S의 값이 0이면 IN.A+IN.B의 값을 출력하는 군요.

즉 전혀다른 어떤값은 IN.A+IN.B의 값이었습니다.


위의 문제를 보면 IN.S의 값에 의해서 IN.A값인지 IN.B의 값인지 혹은 두 값을 더하는 건지가 결정 되는 것을 볼 수 있습니다.

이것에 유의해서 코드를 작성하면 다음과 같은 코드를 만들 수 있을거에요.

IN.S 만 일을 하는 코드입니다.

IN.A 와 IN.B는 입력된 값을 모두 IN.S로 넘겨주기만 하면 됩니다.

그리고 IN.S에서 일어나는 코드에 대해서 자세하게 보도록 하죠.

MOV UP,ACC // IN.S의 값을 ACC에 저장합니다.

JEZ EZ // ACC의 값이 0인지 확인하고 0이면 EZ: 로 이동합니다.

JGZ GZ // ACC의 값이 1ㅇ상인지 확인하고 1이상이면 GZ: 로 이동합니다.

MOV LEFT,DOWN // -1이하일경우 IN.A의 값을 아래로 보냅니다.

MOV RIGHT,NIL //IN.B의 값은 NIL 즉, NULL주소로 보내버립니다. (IN값 동기화를 위한 처리)

JRO -13 // 처음으로 이동합니다.

GZ: MOV RIGHT,DOWN //1이상일 경우에 시작되는 위치입니다. IN.B의 값을 아래로 보냅니다.

MOV LEFT,NIL // IN.A의 값은 NIL로 보냅니다.

JRO -13 //처음으로 이동합니다.

EZ:MOV LEFT,ACC //0일경우에 시작되는 위치입니다. IN.A값을 ACC에 넣습니다.

ADD RIGHT //IN.B의 값을 더합니다.

MOV ACC,DOWN //IN.A + IN.B 가 된 ACC값을 아래로 보냅니다.


이상으로 멀티플렉서에 대한 설명을 마치도록 하겠습니다.


반응형
반응형

이번에는 신호비교기에 대해 알아보도록 할께요.

비교기란?

어떤 정보의 두 개의 표현 방식(transcription)을 비교하여 크기, 순서, 특성 등에 차이가 있는지 없는지 또 컴퓨터 내의 기억 형태(storage), 산술 연산(arithmetic operation) 등의 정확도도 체크하는데, 체크 결과는 출력 신호(outputsignal)의 형태로 통지한다. 전자공학에서는 콤퍼레이터는 복수의 신호(signal)를 평가(evaluate)하고, 이 신호들이 어떤 특정한 규칙으로 일치(match)하는지를 표시하는 회로라 생각하고 있다. 이 경우 일치는 「h」(high) 상태이고, 불일치는 「l」(low) 상태로 표시하는 것이 보통이다.

-네이버 지식백과-

즉 두개의 신호를 비교하여 원하는 조건에 따라서 true를 출력할지 false를 출력할지를 나타내는 것을 말하는 겁니다.

이제 시작해보도록 하죠

SIGNAL COMPARATOR SEGMENT 에 접속해주세요.

위의 이미지랑 동일한 녀석을 누르시고 Create  new program 을 누르시면 됩니다.


그럼 다음과 같은 화면 이 나옵니다.

입력되는 값이 1개인데 출력되는 값이 3개나 있네요.

출력값은 1과 0 뿐이고 같은 라인에서 1이 2개이상 나오는 일은 없어보입니다.


추론은 그만하기로 하고 문제를 읽어보도록 하죠

READ A VALUE FROM IN

WRITE 1 TO OUT.G  IN > 0

WRITE 1 TO OUT.E  IN = 0

WRITE 1 TO OUT.L IN < 0

WHEN A 1 IS NOT WRITE TO AN OUTPUT, WRITE A 0 INSTEAD

해석을 해보자면 

in값을 입력받아서 

OUT.G에는 입력값이 0이상일때, OUT.E에는 입력값이 0일떄, OUT.L에는 입력값이 0이하일때 1을 입력합니다.

먄약 1이 출력되지 않았을때는 0을 출력합니다.


어떻게 만들어지는지 결과부터 보시죠

다음과 같은 코드가 나왔네요.

한줄씩 풀어보도록 하죠 

처음 위에서 값을 아래로 내려오는 부분까지는 간단합니다.

그후 아래의 출력되기 직전 부분부터 코드가 복잡해지는데요 

원리는 간단합니다.

우선 입력된 값을 acc에 넣습니다.

그리고 동일한 값을 오른쪽에 보내주는 거죠

이유로는 하나의 입력값으로 3개의 출력을 내보내야 하는데 동일한 값을 가지고 서로 다른 비교를 하기 때문입니다.(다른방법도 있어요 ㅇㅇ)

그 후 첫번째는 JGZ 즉 0보다 클때, BIG으로 뛰어넘고 그렇지 않으면 아래 코드를 실행합니다.

즉 0 보다 클때는 MOV 1,DOWN이 실행되고 END: 라벨은 실행할 코드가 없으므로 처음으로 돌아갑니다.

만약 0 이하일 경우 MOV 0,DOWN이 실행되고 JMP END 가 실행됩니다.

JMP의 경우 조건에 상관없이 해당 라벨로 이동하라는 의미입니다.

따라서 JMP END가 실행되면 END: 라벨로 넘어가는데 해당 라벨이후 실행할 코드가 없으므로 처음으로 돌아갑니다.

이러한 로직을 3개의 모듈에 모두 넣어주면 정상적으로 출력되는 것을 볼수있습니다.

JMP 대신 JRO를 사용하는 방법도 있습니다만 그건 다음기회에 알아보도록 하죠.


이상으로 신호비교기에 대해 알아보았습니다.

멀티플렉서에 대해 알아보도록 하겠습니다.


반응형
반응형

이번에는 차등변환기를 알아보도록 할께요 

차등변환기란 두개 이상의 값이 있을 때 서로의 값의 차이로 변환하는것을 말합니다.


한마디로 A와 B의 값이 있으면 A-B 혹은 B-A의 값을 출력하는거죠

그럼 이제 시작해보도록 하죠 

DIFFEFRENTIAL CONVERTER의 세그먼트에 들어가주세요.

위 이미지랑 동일한 녀석을 찾으면 됩니다.

참고로 nominal 이라고 나오는 부분은 클리어시에 나옵니다. 

클리어를 안했으면 나오지않아요! 


해당 세그먼트에 접속을 하면 다음과 같은 화면이 출력됩니다.

입력값으로 IN.A, IN.B 를 받네요

출력값으로는 OUT.P 와 OUT.N이 있습니다.

OUT.P 의 값을 보면 IN.A - IN.B 와 같고

OUT.N 의 값을 보면 IN.B - IN.A 와 같네요.


그래도 혹시모르니 문제를 읽어보도록 하죠.

READ VALUES FROM IN.A AND IN.B

WRITE IN.A - IN.B TO OUT.P

WRITE IN.B - IN.A TO OUT.N

해석을 하자면 IN.A 와 IN.B의 값을 읽은 후

OUT.P에는 IN.A - IN.B의 값을 쓰고 OUT.N에는 IN.B - IN.A의 값을 쓰라는군요.


가장 먼저 떠오르는 방법은 A의 값을 B에 줘서 B-A를 하고 B의 값을 A로 넘겨줘서 A-B를 하는 방법입니다.

하지만 이렇게 되면 값을 저장하고 관리해줄 필요가있습니다.

귀찮아보이네요...

그러니 좀 더 쉽게 가봅시다.

A-B 와 B-A는 순서만 바뀌었다뿐이고 서로가 서로를 빼준다는것을 볼수있습니다.

따라서

A-B = X

(A-B) * -1 = X *-1

-A+B = -X, B-A = -X

즉 A-B =X , B-A = -X 가 됩니다. 결과값에 -1을 곱한값과 동일하게 된다는 거죠

그리고 명령어를 보면 양수를 음수, 음수를 양수로 변환하는 명령어인 NEG 가 존재하는것을 볼수있습니다.

그럼 위의 수식을 토대로 코드를 작성을 해보도록 하죠

다음과 같은 코드가 작성됩니다.

처음 모듈에서 ACC에 A값을 저장한 후, B의 값을 빼주고 그 값을 아래로 보냅니다.

출력전에 A-B한 값을 ACC에 넣어주고 OUT.P에는 ACC의 값을 출력

OUT.N은 양수를 음수, 음수를 양수로 변환한 후 출력해줍니다.


이렇게 차등변환기에 대해서 알아보았습니다.

혹시 더 좋은 방법이 있다면 댓글로 남겨주세요~

반응형
반응형

증폭기

이번에는 signal amplifier 즉 신호증폭기를 해볼께요.

우선 증폭기란 무엇인가에 대해서 설명해 드릴께요.

증폭기란?

입력된 신호의 출력을 키워서 내보내는 장치들을 의미한다. 전기신호 이외에도 빛이나 자기장 같은 신호도 증폭시키면 앰프라고 할 수 있다.  - 출처 나무위키 -

한마디로 1이란 신호를 2로 값을 증가시키는걸 증폭기라고 한다고 보면 되겟네요.


그럼 이제 실제로 코딩을 해보도록 하죠 
먼저 Signal Amplifier segment를 create new program으로 들어갑니다.

위 이미지랑 동일한거 찾으면 되요.

그러면 다음과 같은 화면이 나옵니다.

IN.A 값이 있고 OUT.A 값이 있는걸보면 IN값을 받아서 OUT으로 출력하라는 거 같네요

왼쪽에 결과가 출력된것을 보면 딱 IN값의 2배가 되어있는것을 볼 수 있습니다.

문제를 읽지않아도 결과만 보고 문제를 유추할 수 있지만 그래도 문제를 한번 읽는편이 더 도움이 될거같으니깐 번역을 해보죠

READ A VALUE FROM IN.A

DOUBLE THE VALUE

WRITE THE VALUE TO OUT.A

IN.A 값을 읽어서 해당값을 두배로 만든후 OUT.A로 출력하세요 라는군요.


여러가지 방법이 있겠지만 값이 두배가 된다는 점에서 입력받은 값을 한번 더 더해주면 된다는 사실을 알게 되었습니다.

ADD명령어는 ACC를 더할수 있으므로 해당값을 ACC에 저장한 후 ADD를 하면 값이 두배가 된다는 것을 알수있겟네요 

4배라면 ADD ACC를 한번 더 해주면 되지만 만약 3배가 증폭된다고 하면 좀 더 생각해봐야할거같습니다.


그래서 결과적으로 나온 코드는 이 것

매우 단순해 보이는 코드입니다.

실제로도 단순하고요

MOV UP,ACC (IN.A 값을 ACC에 저장합니다.)

ADD ACC(ACC값에 ACC 값을 더합니다. ACC+ACC=2ACC)

MOV ACC,DOWN(ACC값을 아래로 내립니다. 그리고 OUT 까지 이동합니다.)


ACC에 값이잇을때 새로운값을 MOV UP,ACC를 하게된다면 들어오는 값을 ACC에 덮어쓰기를 한다는 뜻입니다.

따라서 ACC의 값을 초기화 할 필요가 없습니다.

반응형

+ Recent posts