반도체 Study/아두이노

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

잇(IT) 2024. 4. 5. 20:45
728x90

- 실습 과제명 : 기본 논리 게이트를 이용한 아두이노 IC Chip 설계 및 Code 구현

- 실습 인원 : 1명

- 실습 목표 : 아두이노, IC Chip, 아두이노 IDE를 이용하여 기본 논리 게이트 구현

- 사용 장비 및 기술 : 아두이노, IC Chip, 아두이노 IDE


목차

 

NOT 게이트 (아두이노)

AND 게이트 (아두이노)

OR 게이트 (아두이노)

NAND 게이트 (아두이노)

NOR 게이트 (아두이노)

XOR 게이트 (아두이노)

C언어를 이용한 기본 논리게이트 구현 (NOT, AND, OR, NAND, NOR, XOR)


 

1. NOT 게이트 (7404) (SN74HC04N)

 

Datasheet

Datasheet를 통해 0을 입력하면 1을 출력하고 1을 입력하면 0을 출력하는 것을 확인할 수 있다.

 

추가로 SN74HC04N를 확인해보면 해당 칩의 입력 핀(A)을 통해 신호를 입력하면 출력 핀(Y)을 통해 반대의 결과값을 내보내 준다는 것을 확인할 수 있다.

Pspice를 이용하여 NOT게이트를 구현한 전자 회로와 파형은 위와 같다.

 


아두이노와 IC Chip을 이용한 NOT 게이트 구현 및 확인

스위치 ON(1)일 때 NOT Gate로 인해 LED에 OFF(0)이 전달되어 LED에 불빛이 들어오지 않는 것을 확인 할 수 있다. 

반대로 스위치 OFF(0)일 때 NOT Gate로 인해 LED에 ON(1)이 전달되어 LED에 불빛이 들오는 것을 확인 할 수 있다.


NOT_Gate Code

int VCC = 8;
int LED_INPUT = 7;
int LED_OUTPUT = 4;

void setup()
{
	Serial.begin(9600);
	pinMode(VCC, OUTPUT);
	pinMode(LED_INPUT, INPUT);
	pinMode(LED_OUTPUT, OUTPUT);
}

void loop()
{
	digitalWrite(VCC, HIGH);
	int a = digitalRead(LED_INPUT);
	if(a == 0){
		digitalWrite(LED_OUTPUT, HIGH);
		Serial.println("LED : ON");
	} else {
		digitalWrite(LED_OUTPUT, LOW);
		Serial.println("LED : OFF");
}

7번 (INPUT) Pin으로 들어가는 값의 반대 값을 4번 (OUTPUT) Pin으로 출력하게 되면 스위치 ON(1)일 때 LED가 꺼지고, 스위치 OFF(0)일 때 LED에 불이 들어오는 것을 확인할 수 있다. 


2. AND 게이트 (7408) (SN74L08L)

 

Datasheet

AND 게이트 (7408) (SN74L08L) 의 Datasheet는 위와 같이 제시되어 있다.

2개의 입력 신호를 통해 출력 신호를 내보내며, 2개의 입력 신호가 전부 High(1)일 경우 출력 신호를 High(1)로 내보내는 것을 확인할 수 있다.

2개의 입력 신호 중 하나라도(하나 이상) Low(0)일 경우 출력 신호로 Low(0)를 내보내는 것을 확인할 수 있다.

IC Chip의 A, B가 입력 신호 Pin에 해당하고 둘의 신호에 대한 출력은 Y Pin을 통해 전달 받는다.

Pspice를 이용하여 AND 게이트를 구현한 전자 회로와 파형은 위와 같다.


아두이노와 IC Chip을 이용한 AND게이트 구현 및 확인

2개의 스위치가 ON(1)일 때 LED에 불이 들어오는 것을 확인 할 수 있다.

2개의 스위치 중 하나만 ON(1)이거나, 2개의 스위치 전부 OFF(0)일 경우 LED의 불빛이 들어오지 않는 것을 확인할 수 있다.


AND_Gate Code

int input1 = 12;
int input2 = 7;
int output1 = 2;

void setup()
{
  Serial.begin(9600);
  pinMode(input1, INPUT);
  pinMode(input2, INPUT);
  pinMode(output1, OUTPUT);
}

void loop()
{
  int a = digitalRead(input1);
  int b = digitalRead(input2);
  if(a == 1 && b == 1){
    digitalWrite(output1, HIGH);
    Serial.println("LED : HIGH");
  } else if(a == 0 && b == 1){
    digitalWrite(output1, LOW);
    Serial.println("LED : LOW");

  } else if(a == 1 && b == 0){
    digitalWrite(output1, LOW);
    Serial.println("LED : LOW");

  } else {
    digitalWrite(output1, LOW);
    Serial.println("LED : LOW");
  }
}

 

슬라이드 스위치를 통해 ON(1), OFF(0) 값을 12, 7 (INPUT)으로 신호를 전달하고 AND 게이트 조건에 맞게 ON(1), ON(1)일 때 LED에 불이 들어고 나머지 경우에는 LED에 불이 들어오지 않는다.


3. OR 게이트 (7432) (GD74HC32)

 

Datasheet

 

OR 게이트 (7432) (GD74HC32) 의 Datasheet는 위와 같이 제시되어 있다.

OR 게이트의 경우 2개의 입력 신호에 대해 출력 신호를 전달하는데, 2개의 신호 중 하나 이상의 신호가 High(1)일 경우 출력 신호를 High(1)를 전달한다.

2개의 입력 신호가 전부 Low(0)일 경우 출력 신호 또한 Low(0) 신호를 내보내는 것을 확인 할 수 있다.

2개의 입력 신호 Pin은 A, B에 해당하고 출력 Pin은 Y에 해당한다.

Pspice를 이용하여 OR 게이트를 구현한 전자 회로와 파형은 위와 같다.


아두이노와 IC Chip을 이용한 OR게이트 구현 및 확인

OR Gate의 경우 2개의 INPUT의 신호가 0,1 / 1,0 / 1,1의 신호가 들어올 경우 LED에 불빛이 들어온다.

2개의 INPUT의 신호가 0,0일 때 LED에 불빛이 들어오지 않는 것을 확인할 수 있다.


OR_Gate Code

int input1 = 12;
int input2 = 7;
int output1 = 2;

void setup()
{
  Serial.begin(9600);
  pinMode(input1, INPUT);
  pinMode(input2, INPUT);
  pinMode(output1, OUTPUT);
}

void loop()
{
  int a = digitalRead(input1);
  int b = digitalRead(input2);
  if(a == 1 && b == 1){
    digitalWrite(output1, HIGH);
    Serial.println("LED : HIGH");
  } else if(a == 0 && b == 1){
    digitalWrite(output1, HIGH);
    Serial.println("LED : HIGH");

  } else if(a == 1 && b == 0){
    digitalWrite(output1, HIGH);
    Serial.println("LED : HIGH");

  } else {
    digitalWrite(output1, LOW);
    Serial.println("LED : LOW");
  }
}

슬라이드 스위치를 통해 ON(1), OFF(0) 값을 12, 7 (INPUT)으로 신호를 전달하고 OR게이트 조건에 맞게 OFF(0), OFF(0) 경우에 LED에 불이 들어오지 않고, 나머지 경우에 전부 LED에 불빛이 들어오는 것을 확인할 수 있다.


4. NAND 게이트 (7400) (HD74LS00P)

 

Datasheet

NAND 게이트 (7400) (HD74LS00P)  의 Datasheet는 위와 같이 제시되어 있다.

NAND 게이트는 2개의 입력 신호의 결과에 따라 출력 신호를 내보낸다.

NAND 게이트이 경우 모든 입력이 High(1)이어야 출력이 Low(0)이 되는 것을 제외하고는 모든 조건에서 출력이 High(1)이다.

IC Chip의 2개의 입력 Pin은 A, B에 해당하고, 출력 Pin은 Y에 해당한다.

Pspice를 이용하여 NAND 게이트를 구현한 전자 회로와 파형은 위와 같다.


아두이노와 IC Chip을 이용한 NAND게이트 구현 및 확인

하나 이상의 입력 신호가 High(1)인 경우 출력 신호가 Low(0)이기 때문에 LED에 불빛이 들어오지 않는 것을 확인할 수 있다.

입력 신호가 전부 Low(0)일 경우 출력 신호가 High(1)가 되기 때문에 LED에 불빛이 들어오는 것을 확인할 수 있다.


NAND_Gate Code

int input1 = 12;
int input2 = 7;
int output1 = 2;

void setup()
{
  Serial.begin(9600);
  pinMode(input1, INPUT);
  pinMode(input2, INPUT);
  pinMode(output1, OUTPUT);
}

void loop()
{
  int a = digitalRead(input1);
  int b = digitalRead(input2);
  if(a == 1 && b == 1){
    digitalWrite(output1, LOW);
    Serial.println("LED : LOW");
  } else if(a == 0 && b == 1){
    digitalWrite(output1, HIGH);
    Serial.println("LED : HIGH");

  } else if(a == 1 && b == 0){
    digitalWrite(output1, HIGH);
    Serial.println("LED : HIGH");

  } else {
    digitalWrite(output1, HIGH);
    Serial.println("LED : HIGH");
  }
}

12, 7번 Pin의 입력이 전부 Low(0)일 때 LED에 불빛이 들어오는 것을 확인할 수 있고, 12, 7번 Pin 중 하나 이상 High(1) 신호를 전달하면 LED에 불빛이 들어오지 않는 것을 확인할 수 있다.


5. NOR 게이트 (7402) (GD74HC02)

 

Datasheet

NOR 게이트 (7402) (GD74HC02) 의 Datasheet는 위와 같이 제시되어 있다.

2개의 입력 신호의 조합을 통해 출력 신호를 전달한다.

NOR 게이트의 경우 모든 입력이 Low(0)이어야 출력이 Higj(1)이 되는 것을 제외하고는 모든 조건에서 출력이 Low(0)이다.

IC Chip의 경우 2개의 입력은 A, B에 해당하고, 출력은 Y에 해당한다.

 

Pspice를 이용하여 NOR 게이트를 구현한 전자 회로와 파형은 위와 같다.


아두이노와 IC Chip을 이용한 NOR게이트 구현 및 확인

2개의 입력 신호 중 하나라도 High(1) 신호가 전달되면 출력 신호로 Low(0)를 전달하기 때문에 LED에 불빛이 들어오지 않는 것을 확인할 수 있다.

2개의 입력 신호가 전부 Low(0)일 경우 출력 신호로 High(1)를 전달하기 때문에 LED에 불빛이 들어오는 것을 확인할 수 있다.


NOR_Gate Code

int input1 = 12;
int input2 = 7;
int output1 = 2;

void setup()
{
  Serial.begin(9600);
  pinMode(input1, INPUT);
  pinMode(input2, INPUT);
  pinMode(output1, OUTPUT);
}

void loop()
{
  int a = digitalRead(input1);
  int b = digitalRead(input2);
  if(a == 1 && b == 1){
    digitalWrite(output1, LOW);
    Serial.println("LED : LOW");
  } else if(a == 0 && b == 1){
    digitalWrite(output1, LOW);
    Serial.println("LED : LOW");

  } else if(a == 1 && b == 0){
    digitalWrite(output1, LOW);
    Serial.println("LED : LOW");

  } else {
    digitalWrite(output1, HIGH);
    Serial.println("LED : HIGH");
  }
}

 

12, 7번 Pin의 입력이 전부 Low(0)일 때 LED에 불빛이 들어오는 것을 확인할 수 있고, 12, 7번 Pin 중 하나 이상 High(1) 신호를 전달하면 LED에 불빛이 들어오지 않는 것을 확인할 수 있다.


6. XOR 게이트 (7486) (IN74LS86N)

 

Datasheet

XOR 게이트 (7486) (IN74LS86N) 의 Datasheet는 위와 같이 제시되어 있다.

2개의 입력 신호의 조합을 통해 출력 신호를 전달한다.

XOR 게이트의 경우 2개의 신호 중 단 하나의 신호만이 High(1)일 경우 출력 신호로 Low(0)를 전달한다.

2개의 입력 신호 Pin는 A, B를 통해 전달하고 출력 신호 Pin은 Y를 통해 출력 신호를 전달한다.

Pspice를 이용하여 XOR 게이트를 구현한 전자 회로와 파형은 위와 같다.


아두이노와 IC Chip을 이용한 XOR게이트 구현 및 확인

2개의 입력 신호 중 하나의 신호만이 High(1)일 경우 출력 신호로 High(1)를 전달하기 때문에 LED에 불빛이 들어오는 것을 확인할 수 있다.

 

그 외, 2개의 입력 신호가 전부 High(1)이거나 Low(0)일 경우 출력 신호로 Low(0)를 전달하기 때문에 LED에 불빛이 들어오지 않는 것을 확인할 수 있다.


XOR_Gate Code

int input1 = 12;
int input2 = 7;
int output1 = 2;

void setup()
{
  Serial.begin(9600);
  pinMode(input1, INPUT);
  pinMode(input2, INPUT);
  pinMode(output1, OUTPUT);
}

void loop()
{
  int a = digitalRead(input1);
  int b = digitalRead(input2);
  if(a == 1 && b == 1){
    digitalWrite(output1, LOW);
    Serial.println("LED : LOW");
  } else if(a == 0 && b == 1){
    digitalWrite(output1, HIGH);
    Serial.println("LED : HIGH");

  } else if(a == 1 && b == 0){
    digitalWrite(output1, HIGH);
    Serial.println("LED : HIGH");

  } else {
    digitalWrite(output1, LOW);
    Serial.println("LED : LOW");
  }
}

12, 7번 Pin을 통해 입력 신호를 전달하고, 스위치를 통해 둘 중 하나의 입력 신호에만 High(1) 신호를 전달했을 때 LED에 불빛이 들어오고, 그 외 2개의 입력 신호가 전부 High(1)이거나 Low(0)일 경우 LED에 불빛이 들어오지 않는 것을 확인할 수 있다.

 


C언어를 이용한 기본 논리게이트 구현

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

void if_not(bool a, bool b) {
    bool outA, outB;
    outA = !a;
    outB = !b;
    printf("IF - NOT a의 값은 %d\n", outA);
    printf("\n");
    printf("IF - NOT b의 값은 %d\n", outB);
}

void if_and(bool a, bool b) {
    bool out;
    if (a && b) {
        out = true;
        printf("IF - a AND b의 값은 %d\n", out);
    }
    else {
        out = false;
        printf("IF - a AND b의 값은 %d\n", out);
    }
}

//OR
void if_or(bool a, bool b) {
    bool out;
    if (a || b) {
        out = true;
        printf("IF - a OR b의 값은 %d\n", out);
    }
    else {
        out = false;
        printf("IF - a OR b의 값은 %d\n", out);
    }
}
//NAND
void if_nand(bool a, bool b) {
    bool out;
    if (a && b) {
        out = false;
        printf("IF - a NAND b의 값은 %d\n", out);
    }
    else {
        out = true;
        printf("IF - a NAND b의 값은 %d\n", out);
    }
}
//NOR
void if_nor(bool a, bool b) {
    bool out;
    if (a || b) {
        out = false;
        printf("IF - a NOR b의 값은 %d\n", out);
    }
    else {
        out = true;
        printf("IF - a NAND b의 값은 %d\n", out);
    }

}
//XOR
void if_xor(bool a, bool b) {
    bool out;
    if (a ^ b) {
        out = true;
        printf("IF - a XOR b의 값은 %d\n", out);
    }
    else {
        out = false;
        printf("IF - a XOR b의 값은 %d\n", out);
    }
}

void sc_not(bool a, bool b) {
    switch (a) {
    case 0:
        printf("SC - NOT a는 1입니다.\n");
        break;
    case 1:
        printf("SC - NOT a는 0입니다.\n");
        break;
    }
    switch (b) {
    case 0:
        printf("SC - NOT b는 1입니다.\n");
        break;
    case 1:
        printf("SC - NOT b는 0입니다.\n");
        break;
    }
}

void sc_and(bool a, bool b) {
    switch (a) {
    case 0:
        switch (b) {
        case 0:
            printf("SC - a AND b의 값은 0입니다.\n");
            break;
        case 1:
            printf("SC - a AND b의 값은 0입니다.\n");
            break;
        }
    case 1:
        switch (b) {
        case 0:
            printf("SC - a AND b의 값은 0입니다.\n");
            break;
        case 1:
            printf("SC - a AND b의 값은 1입니다.\n");
            break;
        }
    }
}

void sc_or(bool a, bool b) {
    switch (a) {
    case 0:
        switch (b) {
        case 0:
            printf("SC - a OR b의 값은 0입니다.\n");
            break;
        case 1:
            printf("SC - a OR b의 값은 1입니다.\n");
            break;
        }
    case 1:
        switch (b) {
        case 0:
            printf("SC - a OR b의 값은 1입니다.\n");
            break;
        case 1:
            printf("SC - a OR b의 값은 1입니다.\n");
        }
    }
}

void sc_nand(bool a, bool b) {
    switch (a) {
    case 0:
        switch (b) {
        case 0:
            printf("SC - a NAND b의 값은 1입니다.\n");
            break;
        case 1:
            printf("SC - a NAND b의 값은 1입니다.\n");
            break;
        }
    case 1:
        switch (b) {
        case 0:
            printf("SC - a NAND b의 값은 1입니다.\n");
            break;
        case 1:
            printf("SC - a NAND b의 값은 0입니다.\n");
        }
    }
}

void sc_nor(bool a, bool b) {
    switch (a) {
    case 0:
        switch (b) {
        case 0:
            printf("SC - a NOR b의 값은 1입니다.\n");
            break;
        case 1:
            printf("SC - a NOR b의 값은 0입니다.\n");
            break;
        }
    case 1:
        switch (b) {
        case 0:
            printf("SC - a NOR b의 값은 0입니다.\n");
            break;
        case 1:
            printf("SC - a NOR b의 값은 0입니다.\n");
            break;
        }
    }
}

void sc_xor(bool a, bool b) {
    switch (a) {
    case 0:
        switch (b) {
        case 0:
            printf("SC - a XOR b의 값은 0입니다.\n");
            break;
        case 1:
            printf("SC - a XOR b의 값은 1입니다.\n");
            break;
        }
    case 1:
        switch (b) {
        case 0:
            printf("SC - a XOR b의 값은 1입니다.\n");
            break;
        case 1:
            printf("SC - a XOR b의 값은 0입니다.\n");
        }
    }
}

void main() {
    int a, b;
    bool A, B;

    printf("a에 0 또는 1 값을 입력하세요 : ");
    scanf("%d", &a);
    A = (a == 0) ? false : true;

    printf("b에 0 또는 1 값을 입력하세요 : ");
    scanf("%d", &b);
    B = (b == 0) ? false : true;

    printf("\n");
    if_not(A, B);
    printf("\n");
    if_and(A, B);
    printf("\n");
    if_or(A, B);
    printf("\n");
    if_nand(A, B);
    printf("\n");
    if_nor(A, B);
    printf("\n");
    if_xor(A, B);
    printf("\n");
    printf("a값의 NOT은 %d입니다.\n", !A);
    printf("\n");
    printf("b값의 NOT은 %d입니다.\n", !B);
    printf("\n");
    printf("a AND b는 %d입니다.\n", A & B);
    printf("\n");
    printf("a OR b는 %d입니다.\n", A | B);
    printf("\n");
    printf("a NAND b는 %d입니다.\n", !(A & B));
    printf("\n");
    printf("a NOR b는 %d입니다.\n", !(A | B));
    printf("\n");
    printf("a XOR b는 %d입니다.\n", A ^ B);
    printf("\n");
    sc_not(A, B);
    printf("\n");
    sc_and(A, B);
    printf("\n");
    sc_or(A, B);
    printf("\n");
    sc_nand(A, B);
    printf("\n");
    sc_nor(A, B);
    printf("\n");
    sc_xor(A, B);
}

 

위 C언어 코드는 IF문, Switch ~ Case문, 비트 연산자를 이용하여 기본 논리게이트 NOT, AND, OR, NAND, NOR, XOR를 구현한 코드다.

 

a, b의 값이 0, 0일 때

a, b의 값이 1, 0일 때

a, b의 값이 0, 1일 때

a, b의 값이 1, 1일 때

작성한 C언어를 가지고 작성한 기본 논리 게이트 값은 위와 같은 결과를 출력한다.

728x90