2012 ds c2 06

13
project#6 2-비트 덧셈기 설계

Upload: seonhyung

Post on 12-Jun-2015

322 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: 2012 Ds C2 06

조장 : 20093460 김정훈

조원 : 20073446 김선형

20113284 김지환

20113309 이태구

project#6

2-비트 덧셈기 설계

Page 2: 2012 Ds C2 06

순 서

1. 프로젝트 설명

2. 선행 학습 내용

3. 일 정

4. 업무분담

5. 알고리즘

6. 최종 소스

Page 3: 2012 Ds C2 06

a b c d e f g0 0 0 0 0 0 00 0 0 1 0 0 10 0 1 0 0 1 00 0 1 1 0 1 10 1 0 0 0 0 10 1 0 1 0 1 00 1 1 0 0 1 10 1 1 1 1 0 01 0 0 0 0 1 01 0 0 1 0 1 11 0 1 0 1 0 01 0 1 1 1 0 11 1 0 0 0 1 11 1 0 1 1 0 01 1 1 0 1 0 11 1 1 1 1 1 0

1. 프로젝트 설명

다음 표와 같은 일을 수행하는 2비트 덧셈기를 설계하라.

ex) 1 0

0 1

결과:0 1 1

2. 선행 학습 내용

boolean expression(부울 대수)

부울 대수는 임의의 명제가 참인지를 판명하기 때문에 논리 대수라고도 한다

논리 회로를 설계할 때, 부울 대수를 이용하면 복잡한 논리회로를 정확하고 간결하게 표현할 수 있다.

1. 부울 대수의 기본 법칙

교환법칙

교환법칙은 입력 순서가 변경되더라도 논리연산의 결과는 동일하게 출력된다

AㆍB=BㆍA

A+B=B+A

위의 식은 순서가 변경되어도 AND연산과 OR연산의 결과가 동일하다는 것을 보여준다

결합법칙

Page 4: 2012 Ds C2 06

결합법칙은 세 개의 입력이 동일한 논리연산을 수행할 때 입력의 순서가 바뀌어 연산이 수행되어도 결과는 동

일하게 나타난다

Aㆍ(BㆍC)=(AㆍB)ㆍC

(A+B)+C=A+(B+C)

분배법칙

Aㆍ(B+C)=AㆍB+AㆍC

다중 부정

다중 부정은 부울 대수식에 논리 부정이 여러 번 수행되는 것이다

= A

2. 드모르강의 법칙

논리 변수의 논리합 전체를 부정하면 그것은 원래의 논리변수를 각각 부정한 것을 논리 곱한 것과 같고, 또

여러 논리 변수의 논리곱 전체를 부정하면 그것은 원래의 논리 변수를

각각 부전한 것을 논리 합한 것과 같다는 것을 나타내는 정리다.

·

·

3. 부울 대수의 기본 정리

출처:http://blog.naver.com/3542995/70118605083

disjunction of minterms(최소항의 논리합)

1단계 : 곱의 항(AND항)으로 구성됨

2단계 : 합의 항(OR항)으로 만들어진 논리식으로 구성

최소항의 표현(곱의 합)

출처:http://blog.naver.com/3542995/70118711284

Page 5: 2012 Ds C2 06

complete set of operations(완전집합의 연산자)

임의의 불 함수를 나타내기 위해 필요한 최소한의 연산자집합. 논리곱(AND)과 부정(NOT), 논리합(OR)과 NOT,

부정 논리곱(NAND) 또는 부정 논리합(NOR)만으로 임의의 불

함수를 나타낼 수 있으므로 (AND, NOT), (OR, NOT), (NAND), (NOR)는 완전 집합이다.

출처:http://terms.naver.com/entry.nhn?docId=854703

Karnaugh maps(카르노맵)

카르노맵 이란?

부울함수를 표준형으로 표현할 수 있는 모든 가능한 방법들중의 한가지로 보통 3변수 이상 6변수 이하의 불

함수에서 사용한다.

왜 카르노맵이 필요한가?

부울함수에 대한 간략화 방법중의 하나인 카르노 맵은 지금 상태에서는 어렵게 느껴지실 텐데요.

왜 그럼 더 어려운 카르노맵을 배워야 하는 걸까요?

보통 논리식이 주어진다면 카르노맵보다는 부울함수나 드모르간의 정리를 이용하는 쪽이 쉽습니다.

허나 논리식이 주어지지 않는다면?

보통의 설계(어렵게 생각하시는 도면류가 아닙니다.)에서는 입력값과 출력값만 있게 됩니다.

이 말이 먼뜻인고 하니 입력값 즉 주어지는 값은 정해져 있고

출력값 즉 내가 나타내고자 하는 값 역시 고정적이죠. (내가 생각하는 조건이니까요)

이 두가지만 가지고 논리식을 만들고 간단히 하고 하면 그 과정이 보통이 아닐겁니다.

이걸 쉽게 도와주는 것이 바로 카르노맵인 것이지요.

카르노맵의 표현 순서

1. 변수의 갯수를 파악후 변수의 갯수가 n개이면 2^n의 사각형을 그리자.

2. 변수 값을 채우자.

3. 2^n으로 값을 묶자.

4. 묶은 값을 읽자.

1. 변수의 갯수와 카르노맵의 사각형

Page 6: 2012 Ds C2 06

이게 입력값을 넣는 순서 입니다.

어려우시죠? 처음 접하시는거라 그러실수 있지만

4변수일때를 잘 보시면 2변수, 3변수는 그냥 따라오실 겁니다.

4변수일때만 익히시면 2,3변수는 종합세트로 따라온다는거죠~ 후후~

2변수야 쉬운편이니 생략하고 3변수를 보면요.

4변수 안에 있는게 보이실겁니다. 그럼 옆의 변수값만 유의하시면... 후후

2. 값을 채우기?

값을 채운다라.. 먼말일까요? 바로 출력값을 카르노맵에 표시 한다는 겁니다.

방법은 여러가지 인데요. 일단 가장 쉬운 진리표를 작성후 값채우기를 알아보겠습니다.

진리표란 게이트에서 보신것과 같이 입력값에 따른 출력값을 적은 표입니다.

4변수의 진리표

음.. 먼가 보이시나요? 카르노맵의 위치가 바로 변수의 값을 10진수로 읽은 값입니다. 참고하시면 좋아요.

3. 2^n으로 값을 묶는다.

카르노맵에 값을 채우신 후에는 출력값을 2^n인 사각형 형태로로 묶는대요.

특이한 경우가 존재합니다.

바로 위아래가 연결, 좌우가 연결된다는 것이죠.

Page 7: 2012 Ds C2 06

지도를 생각하시면 이해 가실겁니다. 지금 배우는것도 맵!! 지도지요.

잘 이해 안가시면 선생님께 다시 질문하시면 좋아요.

4변수를 예로 묶어 보겠습니다. (그나마 크니까요)

그림이 잘 보이실지 모르겟네요.

만약 위와 같은 출력을 가지게 될 경우 2^n의 사각형 즉 2, 4, 8, 칸의 사각형으로 묶어줍니다.

위아래 좌우가 연결 되있다고 하니 위 그림처럼 묶으면 되겠네요. 중복 되는건 상관이 없으나 묶을수 없는 경

우를 빼고 안묶으시는건 별로 안좋습니다.(결과적으로 식이 복잡하게 됩니다.)

4. 묶은 값을 읽자

방금 위에서 묶은 그림입니다.

읽어볼까요? 먼저 색갈별 사각형을 따로 따로 읽어 보겠습니다.

- 빨간색 사각형

앞쪽으로 보시면 AB의 입력값이 11과 10 입니다.

이말은 A입력은 1일때 B입력은 0과 1일때란 말입니다.

카로노맵에선 0과 1 모두를 가지는 변수는 적지 않습니다.

그럼 A만 적으면 되겠네요.

다음 위로 쭉 올라가서 보시면 01과 11입니다.

C가 0과1 일때 D가 1일때 이네요.

C는 생략 하고 D만 적습니다.

그럼 빨간색 사각형을 논리식으로 하면 AD입니다.

- 녹색 사각형

AB측 입력을 보시면(←쪽 입력을 읽는다는 말입니다.) 00, 10 입니다.

그럼 A는 생략 가능 하겟죠? 다음 B가 0일때 라는 말인데요 이건 B의 부정 즉 B' 로 표현합니다.

CD측 입력을 보시면(↑쪽 입니다) 00, 01 입니다.

C는 0이니 C' 이구요 D는 생략 되겠네요.

그런 녹색 사각형의 논리식은 B'C' 입니다.

Page 8: 2012 Ds C2 06

- 파란색 사각형

AB측 입력이 00 이네요 A'B' 입니다. (이제 감이 오시죠?)

CD측 입력은 00, 10 입니다. C는 생략되고 D'만 남습니다.

그럼 파란색 사각형의 논리식은 A'B'D' 이겠네요.

이걸 전체적인 논리식으로 하면

출력 = 빨간색사각형 + 녹색사각형 + 파란색사각형 이고요,

F = AD + B'C' + A'B'D' 로 나타낼수 있습니다.

출처:http://blog.naver.com/undust2/100036700628

binary device(바이너리 디바이스)

전기적 스위치가 on 혹은 off의 두 가지 상태를 기록하는 장치. 각종 데이터를 2진 형태로 기록하거나 또는

읽는 장비.

출처:http://terms.naver.com/entry.nhn?docId=816318

logic gates(논리 게이트)

디지털 논리회로는 크게 두 부분으로 나눌 수 있습니다.

첫째는 조합형 논리회로(Combinational Logic)이고 둘째는 순차형 논리회로(Sequencial Logic)입니다.

조합형 논리회로의 기본요소는 게이트이고 순차형 논리회로의 기본요소는 플립플롭(Flip-flop)입니다.

조합형 논리회로의 기본요소인 게이트에 대해 먼저 살펴 보겠습니다.

기본 게이트는 AND, OR, Inverter(NOT), NAND, NOR 정도 일 것입니다.

그 외에 EX-OR(Exclusive-OR 또는 XOR), EX-NOR(Exclusive-NOR 또는 XNOR)가 있습니다.

하나씩 살펴 봅시다.

1. Inverter(NOT)

입력이 반전된 출력을 가지는 게이트입니다.

즉, 입력이 "1"이면 출력은 "0"이되고 입력이 "0"이면 출력이 "1"이되는 게이트입니다.

Inverter를 불식으로 표현하면 Y = A' 또는 A에 Overbar를 붙여 표시합니다.

2. AND 게이트

AND 게이트는 2개 이상의 입력과 하나의 출력을 가집니다.

AND 게이트는 모든 입력이 "1"인 경우만 출력이 "1"이 되는 게이트입니다.

Page 9: 2012 Ds C2 06

위 그림은 두 개의 입력을 가지는 AND 게이트의 회로기호와 진리표를 보여줍니다.

그리고, 뒤에서 나올 불식을 이용하여 AND 게이트를 표시하면

출력은 입력들의 곱의 형태로 표현됩니다.

즉, Y = AB가 됩니다.

중요하니 꼭 기억합시다.

3. OR 게이트

OR 게이트도 AND 게이트 처럼 2개 이상의 입력과 하나의 출력을 가집니다.

입력 중 하나라도 "1"이 있으면 출력이 "1"이 됩니다.

위 그림은 OR 게이트의 회로기호와 진리표입니다.

그리고, OR 게이트는 불식으로 표현하면 출력이 입력들의 합 형태로 표현됩니다.

즉, Y = A + B 가 됩니다.

입력이 A, B, C 3개인 OR 게이트라면, Y = A + B + C 가 되겠죠.

4. NAND 게이트

NAND 게이트는 AND 게이트의 출력에 Inverter를 추가한 것입니다.

따라서 진리표는 AND 게이트의 출력을 반전시킨 형태가 됩니다.

앞서 말한대로 디지털에서 버블이 반전을 의미하므로

AND 게이트 출력에 버블을 붙인 형태를 회로 기호로 사용합니다.

Page 10: 2012 Ds C2 06

불식으로 표현하면 AND 게이트의 식에 반전을 나타내는 Overbar를 붙이거나 Y = (AB)'로

표시합니다.

특히, NAND 게이트는 뒤에 설명할 NOR 게이트와 함께 범용 게이트 (Universal Gate)라고 합니다.

5. NOR 게이트

NOR 게이트는 OR 게이트의 출력을 반전시킨 것입니다.

따라서, OR 게이트의 회로기호에 반전을 나타내는 버블 기호를 붙여 사용합니다.

진리표도 OR 게이트의 출력을 반전시킨 형태가 되죠.

불식 표현도 Y = (A+B)' 또는 A+B 전체에 Overbar를 붙여 표시합니다.

지금까지 살펴 본 5개의 게이트를 정리하면 아래와 같습니다.

앞으로는 수식으로 회로를 표현합니다.

출처:http://blog.naver.com/seo0511/10107424118

Page 11: 2012 Ds C2 06

이 름 분 담 내 용

김선형 보고서 작성 및 프로젝트에 필요한 자료 조사

김정훈 알고리즘을 바탕으로 한 소스작성 및 코딩

김지환 알고리즘 구상과 알고리즘 문제점 검토

이태구 이산수학 학습에 필요한 자료 조사 및 아이디어 제공

3. 일정

일 정 내 용

12. 05. 30 조원별 업무 분담 및 계획 작성

~ 12. 06. 06 짜온 알고리즘에 대한 서로의 의견 나누기

알고리즘을 바탕 으로 한 코딩 작업

~ 12. 04. 08 최종 보고서 보충 및 제출

4.업무분담

Page 12: 2012 Ds C2 06

5.알고리즘

2bit-adder의 구조 half-adder의 구조

부울 수식으로 e, f, g를 전개하면

e=

f=

g=

6. 최종 소스#include <stdio.h>

#include <stdlib.h>

int main(){

int a=0,b=0,c=0,d=0,e=0,f=0,g=0;

for(;;){

printf("2진수입력a b ex)1 0: ");

scanf("%d %d",&a,&b);

printf("\n");

if((a<0||a>1) && (b<0||b>1))

printf("Error\n");

else

break;

}

d

a

c

b

Page 13: 2012 Ds C2 06

for(;;){

printf("2진수입력c d ex)1 0: ");

scanf("%d %d",&c,&d);

printf("\n");

if((c<0||c>1) && (d<0||d>1))

printf("Error\n");

else

break;

}

e=a*c||b*d*(a||c);

f=b*d*(!a*!c||a*c)||(a*!c||!a*c)*(!b||!d);

g=(b*!d)||(!b*d);

printf("2진수 가산결과: %d %d %d\n",e,f,g);

printf("\n");

system("pause");

}