a65614aa1f06b3679234254958c12a3ae31061529cdd2b03ec2d25c3




대부분의 사람들은 이진법이 뭔지는 몰라도 들어본 적은 있을 것이다.


컴퓨터공학에서 이진법을 쓴다는 것 까지는 아는 사람이 많은데,


왜 이진법을 쓰는지는 잘 모르는 경우가 많다.


좀 아는 사람들은 반도체의 전기신호가 0 또는 1로만 구성되기 때문이라고 대답 할 것이다.


이 글에선 논리연산을 반도체, 그리고 논리회로를 통하여 설명할 것이다.








24b0d768f5dc3f8650bbd58b36837c6d0f79




우선 이진법이 컴퓨터반도체와 논리회로에서 어떻게 쓰이는지 이해하려면


부울 대수라는 것에 대해서 알아야 한다.


위의 표는 참고용으로 올린 것이니, 다 이해하려 하지 않아도 된다. 어차피 전공생들도 자주 까먹는다.



쉽게 말해서 부울 대수란, 연산체계라고 생각하면 된다.


우리가 십진법의 연산체계를 사용하듯이, 반도체는 0 또는 1의 경우만 존재하므로


이진법을 표현 하는데 매우 적절하고


부울 대수로 연산하기 매우 적절하다.


예를 들어보자


1+1 = 2 이다.


하지만 부울 대수에서는 1+1 = 1 이다.


왜냐? 전기 신호가 있는 곳에 전기 신호를 또 줘봤자 달라지는 건 없기 때문이다.




7ce8877fb7816ff637eb82e3449f2e2dd2fd21fcdadc3b751dee2c57


"엥? 전기 신호를 2배로 주면 크기가 2배가 되지 않습니까?"



맞는 말이다. 하지만 반도체 입장에선 그런 건 의미가 없다.


있느냐 ? 없느냐 ? 그것만 중요하다.


전압이 8볼트든 10볼트든 100볼트든 그냥 1인것이다. 전기가 들어와 있기 때문에.





저 논리를 이해했다면 부울 대수의 법칙에 대해 이해하기가 훨씬 편할 것이다.





그럼 부울 대수와 반도체의 관계에 대해서 알아보자.





7fee8203b3f36bf13be780e435807c1f5d5b90b1c6bd00dd7d7900218f1d3d2e30

(이것은 논리연산소자 기호인데, 글을 읽으면서 보면 된다. 외울 필요 없다)








7fed8275b5856af151ed84e54781767365290aa9dd3e51747a0ab32b014f38

이것은 반도체 두 개를 직렬연결 한 것이다.


이것은 부울 대수에서 곱셈에 해당한다.


왜일까?


생각 해 보자.


A 소자가 1이고, B 소자가 0이라고 쳐보자.



A 소자에는 전기가 흘러서 B로 향할 것이다.


하지만 B는 0이기 때문에 전류가 흐를 수 없다. 즉, 결과는 0이다


마찬가지로 0 / 1이라면?

A에 전류가 흐를 수 없어서 B에 도달할 수 없다. 즉, 결과는 0이다



즉, 부울 대수에서의 곱셈과 정확하게 일치한다.




이러한 반도체 배열을 공학자들은 AND 게이트라고 명명했다.







7fed8275b5856af151ed84e54284737336c0abf1eb7025683530676427fda6




또 다른 예로 이번엔 병렬 연결을 생각 해 보자.



A나 B 둘 중 하나만 1이기만 한다면, 전기는 흘러서 결과값이 1이 될 것이다.


반면에 둘 다 0이라면 전기가 통과하지 못 해 결과가 0이 될 것이다



이는 부울 대수에서의 덧셈과 완벽하게 일치한다.


이를 OR 게이트라고 한다.






자 그럼 정리해보자



부울 대수라는 것이 있고, 이는 연산체계이다.


그런데 반도체를 병렬 직렬 연결 해보니까, 부울 대수에서의 덧셈 곱셈과 정확하게 똑같은 결과다.


이러한 배열을 AND 와 OR 게이트 라고 명명했다.



그러면, 여기서는 원리를 생략하겠지만 NOT 게이트 (부정연산) 와 AND , OR  를 합쳐서


저기 나오는 부울 대수의 모든 연산을 수행 가능하다.


궁금하면 한 번 검색 해보길 바라고 예시 사진을 첨부하겠다.





a16711aa372a76b660b8f68b12d21a1dd185d933



(XOR 게이트의 회로 모습이다. 이렇듯이 AND , OR , NOT 세 개 조합으로 저 위의 표에 나온 모든 연산이 가능하다. 궁금하면 한 번 계산 해 보길 바란다)





지금까지 내용의 핵심은




1. 반도체를 병렬 직렬 연결하면 부울 대수에서의 합연산 곱연산과 일치하며


2. 이 두 연산과 NOT 연산을 조합하면 부울 대수에 나오는 모든 연산을 수행 가능하다. 즉, 어떠한 계산도 할 수 있다


3. 그렇다면 우리는 이제 부울 대수로 현실의 문제를 해석하면 반도체를 이용하여 구현할 수 있다!



말인 즉, 현실의 문제를 부울 대수로 해석 해 낼 수만 있다면,


반도체로 얼마든지 표현 할 수 있다는 것이다.


이제 그 해석하는 방법에 대해서 알아볼 것이다.








만일 3개의 신호가 있고, 이를 abc 라고 정해보자.


그럼 나올 수 있는 경우의 수는 8가지 일 것이다.


000 / 001 / 010 / 011 .... / 111



그런데 우리는, 다른거 말고 딱 5일때만 불이 들어오게 하고 싶다.


그럼 어떡해야 할까?



011 일 때만 불이 들어오고



000 / 001 .... / 111 과 같은 나머지 모든 경우는 불이 안들어오면 된다.



그러면 a가 0 / b가 1 / c가 1일때만 불이 들어와야 하는데,


역으로 말하면 a의 역이 1이고 b가 1이고 c가 1일때 불이 들어와야 한다는 소리다



a의 역수 x b x c 인 경우가 우리가 구하고자 하는 경우가 된다.




논리소자로 구현하면 이렇게 될 것이다.




a17d2cad2f1b782a99595a48fa9f3433f728bd6f6b8abd3f675eabfa

(병신같이 그린건 이해좀)










자, 그럼 좀 더 어려운 문제로, 우리가 만약 4개의 신호가 있고, 이를 abcd 라고 정해보자.


그럼 나올 수 있는 경우의 수는 16가지 일 것이다.


0000 / 0001 / 0010 / .... / 1111 




그러면, 짝수만 출력하는 어떤 장치를 만들고 싶다.



그럼 어떡해야 할까?



저 16개의 숫자 중에서 짝수는


0010 (2) 

0100 (4) 

0110 (6) 

1000 (8) 

1010 (10)

1100 (12)

1110 (14)


이렇게 7개이다.




1c968305b29f2b9146bbf78c3beb251521ca105be9db7a9046395b4605a142cfe29e86e181e2ccdc35200219421ff88ce977b78bca2efe2c51cb6d08b32cdc5e7278b1cacfb5a66b4b71da4ef8ba6f752ef330aee664214b4699326f161db1327248e914


"아 시발 저걸 어떻게 표현함?"






08abd528aed336a22590d2b15dfd2b3abf243ec4f928bc5dd238e1fb0a606febba46c38bbc0c052af9a3



물론 대가리 박아가서 첫번째 처럼 하나하나 싹 다 만들어도 되는데 그럼 너무 비효율적이다.


이 문제를 해결하기 위해서는 간소화 원리와


퀸-맥클러스키 방법과 카르노 맵 이라는 것에 대해 알아야 한다.


그러나 설명이 너무 길어지기 때문에 흥미가 있다면 검색해보길 바란다. 그다지 어렵지는 않다


핵심은, 저러한 문제도 아주 쉽게 구현이 가능하다는 것.



그래도 하나 예를 들자면


1과 0를 둘 다 표현하고 싶은 경우


맨 뒷자리는 고려하지 않는 것이다.


왜냐? 어차피 0이나 1이나 둘 다 표현해야 한다면, 맨 뒷자리는 0이든 1이든 상관없기 때문이다


0001 / 0000 즉, 앞 세자리가 000인 경우 뒤의 자리는 1이든 0이든 상관없다.


카르노 맵과 퀸-맥클러스키 방법은 이것이 핵심이다. 이것이 이해된다면 저 둘도 이해 할 수 있을 것이다.









앞에서 아주 간단한 두 가지 예시를 제시했다.


5만 출력하는 회로를 만드는 법


짝수만 출력하는 회로를 만드는 법



둘 다 부울 대수를 통해 논리소자로 구현할 수 있었다.





그럼 좀 더 복잡한 문제를 표현할 수는 없을까? 혹은 신호를 저장할 순 없을까?


뭐 예를 들어서


타이머라든지, 메모리 같은 것들 말이다.



하지만 우리는 여태껏 시간은 고려를 하지 않았다.


시간에 따른 변화를 표현하려면 어떻게 해야할까?




이를 위해선 플립플롭과 클락 이라는 것에 대해 알아야 한다.





3eb8c468e2db3e8650bbd58b3680766978b3



플립플롭이란 쉽게 말해서 "저장" 하는 기능을 가진 장치다


위의 움짤은 그중에서 매우매우 기본적인 SR래치 라는 것을 나타낸 것이다


움짤에서 보이듯이, 한 번 0 / 1이 저장되니까 바뀌지 않는다.



여기에다가 클락 이라는 신호를 더하면 플립플롭이 된다.


클락은 쉽게 말해 "박자" 라고 생각하면 될 것 같다.



클락이 0에서 1로 바뀌거나 1에서 0으로 바뀌는 순간마다


짤깍 짤깍 하면서 신호가 작동한다고 생각하면 된다.




1f8e9d20e9db28eb68b3d9a55b806a3a09eded8139eb4e1ee223632fb1f3



위 그림에서 clk 신호가 0이라면, R과 S는 뒤로 전달되지 못 할 것이다. 무조건 00만 전달 될 것이다


하지만 1이라면?


전달이 될 것이다.


클락은 이 원리를 이용해, 주기적으로 전달했다가 끊었다가를 반복하기 위해 있는 것이다.






자 그러면 이제 1이 주기적으로 뒤로 전달되는 장치를 만들어 보자







24b0d121e09c28a8699fe8b115ef046c65f8214a



가장 간단한 D 플립플롭으로 구현한 4비트 직렬 레지스터이다.


D플립플롭이니 뭐니 다필요없고 그냥 0이면 0, 1이면 1이 출력되는 플립플롭이라고 생각하면 된다


(shift는 무시해도 좋다)



자 한 번 보자. 클락 신호는 주기적으로 움직일 것이다


1. D3에 1이 들어가면, 첫번째 클락이 바뀌는 순간 Q3의 출력은 1이 될 것이다.


2. 그러면 그 출력이 다음 플립플롭의 입력으로 전달된다.


3. 그다음 D2에 1이 들어가면 클락이 바뀌면 Q2의 출력은 1이 될 것이다.


4. 똑같은 방법으로 D1 , D0로 전달 될 것이고, 첫 입력신호가 0으로 유지된다면,


1000 > 0100 > 0010 > 0001 



만일 주기적으로 들어왔다 안들어왔다 하면



1000 > 0100 > 1010 >0101 이 될 것이다.



이렇게 아주 간단한 메모리를 만들 수 있었다.


우리가 쓰는 컴퓨터에 들어가는 메모리 또한


저러한 레지스터들이 수십억개 모인것들 이라고 생각하면 된다.


물론 훨씬 복잡하고 난해하다.









우리는 이제 플립플롭, 앞에서 말 한 부울 대수를 통한 논리연산이라는 강력한 도구 두 가지를 안다.


이를 활용한다면 어떠한 것도 표현이 가능하다


우리 실생활에서 가장 쉽게 찾아볼 수 있는 논리연산 장치는




7cec877eb4ed69ff39e8828a4785756c1103ba0f1ebd50cfb254856f4a77c41a




바로 신호등이다.


정해진 시간동안 초록불이 들어오고, 빨간불로 바뀌었다가, 또다시 초록불


여러분도 이를 만들 수 있다


생각 해 보자. 신호 5개면 32까지 숫자가 표현 가능하므로


abcde 라고 한다면


11110 이 되는 순간 불이 바뀌면 된다.


그럼 어떡해야하나? 플립플롭 5개 연결해서 첫 번째 플립플롭에 전기신호 계속 주고 클락은 1초 주기로 바뀌면 되는 것이다.


그렇게 각 플립플롭의 출력단을 abcde 라고 한다면


a x b x c x d x e의 역수 를 해주면 되고 이는 and게이트로 구현이 가능하다.






우리는 앞에서 간단한 예시들을 통해 논리연산으로 현실의 문제들을 표현하는 방법에 대해 알아보았다


컴퓨터 또한 저러한 논리연산 소자들을 아주 작게 만들어서 집적회로에 때려박아 놓은 것이다.


현대 전자공학, 컴퓨터공학 장치들은 죄다 저 논리연산과 부울 대수를 따른다고 생각하면 된다.












요약



1. 반도체는 0 , 1 두가지 상태만 있음. 즉, 이진법을 표현하는데 적절함


2. 부울 대수는 0 또는 1로만 연산하는 연산법, 즉, 반도체로 구현하는데 적절함.


3. 현실의 문제들은 부울 대수로 표현 할 수 있다면 반도체로도 무엇이든 표현 가능함




출처 : Introduction to Logic Design, 3rd Ed., Alan B. Marcovitz