반도체 Study/아두이노

디지털 논리회로 설계 - 가산기, 인코더, 디코더, 멀티플렉서, 7_Segment

잇(IT) 2024. 4. 25. 22:29
728x90

기본 논리게이트에 대한 내용 (NOT, AND, OR, NAND, NOR XOR)

https://insoobaik.tistory.com/576

 

기본 논리 게이트 설계 (아두이노 IC Chip, Code 구현, C언어 Code 구현)

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

insoobaik.tistory.com


가산기

4bit 병렬 가산기 (7483)

전감산기

디코더 (74138)

인코더

Multiplexer

7-Segment

가산기, 감산기, 디코더, 인코더, 멀티플렉서, 7_Segment (C언어)


가산기

 

가산기 : 숫자나 다른 이진수를 더하는데 사용되는 디지털 논리 회로다. 일반적으로 이진수를 더하는 용도로 사용되며, 덧셈 연산을 수행한다.

 

Sum : A와 B의 합을 나타낸다. XOR 게이트로  A와 B를 입력받아 결과를 출력한다.

Carry : A와 B를 더했을 때 발생하는 올림 값을 나타낸다. AND 게이트로 A와 B를 입력받아 결과를 출력한다.

 

PSPICE

 

진리표

A B Cin S Co
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1

 

아두이노


4bit 병렬 가산기 (7483)

 

4bit 병렬 가산기는 4개의 입력 비트(A, B)를 받고, 덧셈 결과인 4bit의 합(Sum)과 올림(Carry)을 출력하는 가산기다.

각 비트마다 전가산기(Full Adder)를 사용하여 합과 올림을 계산한다. 전가산기는 두 입력 비트와 이전 단계에서 받은 올림을 입력으로 받는다.

 

PSPICE

 

Datasheet (7483)

 

진리표

C0 A4 A3 A2 A1 B4 B3 B2 B1 C4 sum4 sum3 sum2 sum1
0 0000 0011 0 0011
0 0011 1000 0 1011
0 1000 1010 1 0010
0 1010 1111 1 1001
0 1111 0001 1 0000
1 0001 0101 0 0111
1 0101 0111 0 1101
1 0111 1011 1 0011
1 1011 1110 1 1010
1 1110 0001 1 0000

 

아두이노


전감산기

 

전감산기는 두 개의 이진수를 뺄셈하는 디지털 논리 회로다. 기본적으로 감산기는 두 개의 이진수(A와 B)를 받아 차와 빌림을 계산한다.

 

차 : A에서 B를 뺀 결과를 나타낸다.

빌림 : B가 A보다 큰 경우, 빌림은 1이 되며 뺄셈 과정에서 A로부터 빌림을 받는다.

 

전감산기의 경우 세 개의 입력(A, B, Borrow-in)을 받아 차와 새로운 빌림을 출력한다.

 

PSPICE

 

 

진리표

A B Bi D Bo
0 0 0 0 0
0 0 1 1 1
0 1 0 1 1
0 1 1 0 1
1 0 0 1 0
1 0 1 0 0
1 1 0 0 0
1 1 1 1 1

 

아두이노


 디코더

디코더는 입력선에 나타나는 n비트 2진 코드를 최대 2^n까지 정보로 바꿔주는 조합논리회로다.

 

PSPICE

 

Datasheet (74138)

 

진리표

Enable C B A 출력
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
G1 = 1
G2A = 0
G2B = 0
0 0 0 0 1 1 1 1 1 1 1
0 0 1 1 0 1 1 1 1 1 1
0 1 0 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1
1 0 0 1 1 1 1 0 1 1 1
1 0 1 1 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 0

 

아두이노 

 

2x4 디코더

3x8 디코더 


인코더 (74148)

 

인코더는 디코더의 반대 기능을 수행하여 2^n개의 서로 다른 정보로 입력 신호로부터 n개의 출력신호를 만드는 조합 논리 회로이다.

2^n개 중 활성화된 하나의 1비트 입력 신호를 받아서 그 숫자에 해당하는 n비트 2진 정보를 출력한다.

 

PSPICE

 

Datasheet (74148)

 

아두이노


Multiplexer

멀티플렉서는 디지털 입력 신호 중 하나를 선택하여 선택된 입력을 하나의 라인에 전달하는 디지털 논리 회로다.

SEL 값에 따라 입력선이 선택된다.

 

PSPICE

 

Datasheet

 

진리표

입력 데이터 선택 신호 X(출력)
D0 D1 D2 D3 S1 S2
1 0 1 0 0 0 1
1 0 0 1 0 0 1
1 0 1 0 0 1 0
1 0 0 1 0 1 0
1 0 1 0 1 0 1
1 0 0 1 1 0 0
1 0 1 0 1 1 0
1 0 0 1 1 1 1
0 1 1 0 0 0 1

 

아두이노

 


7-Segment

 

7-세그먼트 7개의 획으로 이루어진 숫자를 나타내는 표시 장치이며 FND라고 불린다.

 

PSPICE

 

Datasheet

 

진리표

핀 번호 7-세그먼트 마디
a b c d e f g DOT
1 0 0 0 0 1 0 0 0
2 0 0 0 1 0 0 0 0
3 0 0 0 0 0 0 0 0
4 0 0 1 0 0 0 0 0
5 0 0 0 0 0 0 0 1
6 0 1 0 0 0 0 0 0
7 1 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0
9 0 0 0 0 0 1 0 0
10 0 0 0 0 0 0 1 0

 

아두이노

 


가산기, 감산기, 디코더, 인코더, 멀티플렉서, 7_Segment (C언어)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

void add() {

	int A;
	int B;
	int C;

	bool a;
	bool b;
	bool c;
	bool a_xor_b;
	bool a_and_b;
	bool a_xor_b_and_c;

	bool sum;
	bool cout;

	printf("가산기 A값을 입력하세요.(0 or 1) : ");
	scanf("%d", &A);
	a = (A == 0) ? false : true;
	printf("가산기 B값을 입력하세요.(0 or 1) : ");
	scanf("%d", &B);
	b = (B == 0) ? false : true;
	printf("가산기 올림(Carry)값을 입력하세요.(0 or 1) : ");
	scanf("%d", &C);
	c = (C == 0) ? false : true;

	a_xor_b = a ^ b;
	a_and_b = a && b;
	a_xor_b_and_c = a_xor_b && c;

	sum = a_xor_b ^ c;
	cout = a_xor_b && a_xor_b_and_c;

	printf("\n");
	printf("A, B, Carry값을 가산기로 연산한 Sum : %d / Cout : %d\n", sum, cout);
}

void sub() {

	int A;
	int B;
	int BI;

	bool a;
	bool b;
	bool bi;
	bool Not_a;
	bool not_a_And_b;
	bool a_Xor_b;
	bool Not_a_xor_b;
	bool not_a_xor_b_And_bi;
	bool not_a_and_b_Or_not_a_xor_b_and_bi;
	bool a_xor_b_Xor_bi;

	bool d;
	bool bo;

	printf("감산기 A값을 입력하세요.(0 or 1) : ");
	scanf("%d", &A);
	a = (A == 0) ? false : true;
	printf("감산기 B값을 입력하세요.(0 or 1) : ");
	scanf("%d", &B);
	b = (B == 0) ? false : true;
	printf("감산기 BI값을 입력하세요.(0 or 1) : ");
	scanf("%d", &BI);
	bi = (BI == 0) ? false : true;

	Not_a = !a;
	not_a_And_b = Not_a && b;
	a_Xor_b = a ^ b;
	Not_a_xor_b = !a_Xor_b;
	not_a_xor_b_And_bi = Not_a_xor_b && bi;
	not_a_and_b_Or_not_a_xor_b_and_bi = not_a_And_b || not_a_xor_b_And_bi;
	a_xor_b_Xor_bi = a_Xor_b ^ bi;

	d = not_a_and_b_Or_not_a_xor_b_and_bi;
	bo = a_xor_b_Xor_bi;

	printf("\n");
	printf("A, B, BI값을 감산기로 연산한 D : %d / BO : %d\n", d, bo);
}

void decoder() {
	int A;
	int B;

	bool a;
	bool b;
	bool Not_a;
	bool Not_b;

	bool y0;
	bool y1;
	bool y2;
	bool y3;

	printf("2x4 디코더 A값을 입력하세요.(0 or 1) : ");
	scanf("%d", &A);
	a = (A == 0) ? false : true;
	printf("2x4 디코더 B값을 입력하세요.(0 or 1) : ");
	scanf("%d", &B);
	b = (B == 0) ? false : true;

	Not_a = !a;
	Not_b = !b;

	y0 = Not_a && Not_b;
	y1 = a && Not_b;
	y2 = Not_a && b;
	y3 = a && b;
	printf("\n");
	printf("A, B 입력에 의한 디코더 값은\nB\tA\t\n%d\t%d\t\ny3\ty2\ty1\ty0\t\n%d\t%d\t%d\t%d\t 입니다.\n",B, A, y3, y2, y1, y0);
}

void incoder() {
	int D0, D1, D2, D3, D4, D5, D6, D7;
	bool d0, d1, d2, d3, d4, d5, d6, d7;
	bool b0, b1, b2;

	printf("8x3 인코더 D0값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D0);
	d0 = (D0 == 0) ? false : true;
	printf("8x3 인코더 D1값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D1);
	d1 = (D1 == 0) ? false : true;
	printf("8x3 인코더 D2값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D2);
	d2 = (D2 == 0) ? false : true;
	printf("8x3 인코더 D0값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D3);
	d3 = (D3 == 0) ? false : true;
	printf("8x3 인코더 D4값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D4);
	d4 = (D4 == 0) ? false : true;
	printf("8x3 인코더 D5값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D5);
	d5 = (D5 == 0) ? false : true;
	printf("8x3 인코더 D6값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D6);
	d6 = (D6 == 0) ? false : true;
	printf("8x3 인코더 D7값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D7);
	d7 = (D7 == 0) ? false : true;

	b0 = d1 || d3 || d5 || d7;
	b1 = d2 || d3 || d6 || d7;
	b2 = d4 || d5 || d6 || d7;

	printf("\n");
	printf("D0~D7 입력에 의한 인코더 값은\nD7\tD6\tD5\tD4\tD3\tD2\tD1\tD0\n%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\nB2\tB1\tB0\n%d\t%d\t%d\n", d7, d6, d5, d4, d3, d2, d1, d0, b2, b1, b0);
}

void mux() {
	int D0, D1, D2, D3;
	int S1, S2;
	bool d0, d1, d2, d3;
	bool s1, s2;
	bool and0, and1, and2, and3, or1, or2, or3;
	bool out;

	printf("mux D0값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D0);
	d0 = (D0 == 0) ? false : true;
	printf("mux D1값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D1);
	d1 = (D1 == 0) ? false : true;
	printf("mux D2값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D2);
	d2 = (D2 == 0) ? false : true;
	printf("mux D3값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D3);
	d3 = (D3 == 0) ? false : true;
	printf("mux S1값을 입력하세요.(0 or 1) : ");
	scanf("%d", &S1);
	s1 = (S1 == 0) ? false : true;
	printf("mux S2값을 입력하세요.(0 or 1) : ");
	scanf("%d", &S2);
	s2 = (S2 == 0) ? false : true;

	and0 = d0 && !s1 && !s2;
	and1 = d1 && !s1 && s2;
	and2 = d2 && s1 && !s2;
	and3 = d3 && s1 && s2;

	or1 = and0 || and1;
	or2 = and2 || and3;
	or3 = or1 || or2;

	out = or3;

	printf("D0~D3, S1,S2 입력에 의한 멀티플렉서 out의 값은\nD0\tD1\tD2\tD3\n%d\t%d\t%d\t%d\nS1\tS2\n%d\t%d\nOUT = %d\n", d0, d1, d2, d3, s1, s2, out);
}

void segment() {
	int A, B, C, D;
	int sum;
	bool a, b, c, d, e, f, g;

	printf("seg A값을 입력하세요.(0 or 1) : ");
	scanf("%d", &A);
	printf("seg B값을 입력하세요.(0 or 1) : ");
	scanf("%d", &B);
	printf("seg C값을 입력하세요.(0 or 1) : ");
	scanf("%d", &C);
	printf("seg D값을 입력하세요.(0 or 1) : ");
	scanf("%d", &D);

	sum = D * 8 + C * 4 + B * 2 + A;

	switch (sum) {
	case 0:
		a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 1;
		break;
	case 1:
		a = 0, b = 0, c = 0, d = 1, e = 1, f = 1, g = 1;
		break;
	case 2:
		a = 0, b = 0, c = 1, d = 0, e = 0, f = 1, g = 0;
		break;
	case 3:
		a = 0, b = 0, c = 0, d = 0, e = 1, f = 1, g = 0;
		break;
	case 4:
		a = 1, b = 0, c = 0, d = 1, e = 1, f = 0, g = 0;
		break;
	case 5:
		a = 0, b = 1, c = 0, d = 0, e = 1, f = 0, g = 0;
		break;
	case 6:
		a = 1, b = 1, c = 0, d = 0, e = 0, f = 0, g = 0;
		break;
	case 7:
		a = 0, b = 0, c = 0, d = 1, e = 1, f = 1, g = 1;
		break;
	case 8:
		a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0;
		break;
	case 9:
		a = 0, b = 0, c = 0, d = 1, e = 1, f = 0, g = 0;
		break;
	case 10:
		a = 1, b = 1, c = 1, d = 0, e = 0, f = 1, g = 0;
		break;
	case 11:
		a = 1, b = 1, c = 0, d = 0, e = 1, f = 1, g = 0;
		break;
	case 12:
		a = 1, b = 0, c = 1, d = 1, e = 1, f = 0, g = 0;
		break;
	case 13:
		a = 0, b = 1, c = 1, d = 0, e = 1, f = 0, g = 0;
		break;
	case 14:
		a = 1, b = 1, c = 1, d = 0, e = 0, f = 0, g = 0;
		break;
	case 15:
		a = 1, b = 1, c = 1, d = 1, e = 1, f = 1, g = 0;
		break;
	}

	printf("\n7_segment A, B, C, D 값에 의한 a, b, c, d, e, f, g의 값은\n\nD\tC\tB\tA\n%d\t%d\t%d\t%d\t\n\na\tb\tc\td\te\tf\tg\n%d\t%d\t%d\t%d\t%d\t%d\t%d\n", A, B, C, D, a, b, c, d, e, f, g);

}


void main() {
	
	while (true) {
		int num;
		printf("1. 전가산기\t2. 전감산기\t3. 디코더\t4. 인코더\t5. 멀티플렉서\t6. 7_segment\t0. 종료\n");
		printf("원하는 연산 게이트를 입력하세요 : ");
		scanf("%d", &num); 
		switch (num) {
		case 1:
			add();
			printf("\n");
			break;
		case 2:
			sub();
			printf("\n");
			break;
		case 3:
			decoder();
			printf("\n");
			break;
		case 4:
			incoder();
			printf("\n");
			break;
		case 5:
			mux();
			printf("\n");
			break;
		case 6:
			segment();
			printf("\n");
		case 0:
			break;
		}
		if (num == 0) {
			break;
		}
	}
}

728x90