기본 논리게이트에 대한 내용 (NOT, AND, OR, NAND, NOR XOR)
https://insoobaik.tistory.com/576
가산기
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;
}
}
}
'Embedded > STM32, Arduino' 카테고리의 다른 글
STM32 - GPIO 레지스터에 대하여 (MODER ~ AFRH) (0) | 2024.05.22 |
---|---|
STM32 - (GPIO 구동용 함수 분석 / Board Select & MCU/MPU 차이) (0) | 2024.05.19 |
STM32 - HAL Driver / 프로잭트 생성 / GPIO (+실습) (0) | 2024.05.17 |
디지털 타이머 - (아두이노, C언어(포인터)) (0) | 2024.05.10 |
기본 논리 게이트 설계 (아두이노 IC Chip, Code 구현, C언어 Code 구현) (0) | 2024.04.05 |