Rust로 작성해 보는 컴퓨터 구조 (5) - NAND 게이트

나빌레라의 이미지

NAND 게이트

NAND 게이트는 NOT-AND 게이트의 약자다. AND 게이트의 반대라는 뜻이다. 반대라는 말은 AND 게이트의 진리표와 결과가 반대라는 말이다. AND 게이트의 출력이 0일 때 NAND 게이트는 1이다. 반대로 AND 게이트 출력이 1이면 NAND 게이트 출력은 0이다. 따라서 진리표는 다음과 같다.

입력 A 입력 B 출력
0 0 1
0 1 1
1 0 1
1 1 0

트랜지스터 두 개를 잘 배치해서 NAND 게이트를 만들 수 있다. 하지만 더 쉬운 방법이 있다. AND 게이트 끝에 인버터를 붙이는 것이다. 인버터의 동작이 입출력을 반대로 바꾸는 것이므로 위 진리표를 만족하는 결과를 만들게 된다.

그래서 NAND 게이트의 회로도 심볼도 AND 게이트에 동그라미를 붙인 모양이다. 게이트 회로도에서 동그라미만 있으면 인버터라는 의미다.

NAND 게이트 기호

위 그림이 NAND 게이트의 심볼이다. 이 심볼 자체가 NAND 게이트를 모델링하는 모습이다. 위 심볼을 그대로 코드로 옮기면 된다. AND 게이트 객체, 인버터 객체를 선언하고 AND 게이트 객체 출력을 인버터 객체에 넣으면 된다.

{caption="gates.rs | NAND 게이트 모델 추가"}
use crate::transistor;
 
// ... 생략 ...
 
pub struct NandGate {
    andgate: AndGate,
    inv: NotGate,
}
 
// ... 생략 ...
 
impl NandGate {
    pub fn new() -> NandGate {
        NandGate{
            andgate: AndGate::new(),
            inv: NotGate::new(),
        }
    }
}
 
// ... 생략 ...
 
impl GateInterfaces for NandGate {
    fn proc(&mut self, input_a: bool, input_b: bool) -> bool {
        return self.inv.proc(self.andgate.proc(input_a, input_b))
    }
}

앞 장과 중복되는 코드는 생략했다. 5번째 줄에서 8번째 줄이 NAND 게이트 모델의 구조체다. NAND 게이트 심볼처럼 AND 게이트와 인버터를 가지고 있는 구조체다. 12번째 줄에서 19번째 줄이 NAND 게이트 모델 객체를 생성하는 코드다. AND 게이트 모델 객체는 앞 장에서 작성한 생성자 함수를 사용한다. 인버터 모델 객체는 생성자 함수를 만들지 않았으므로 인버터 객체를 직접 생성한다. 23번째 줄에서 27번째 줄이 proc() 인터페이스 함수를 구현한 코드다. 기존에 이미 만들어 놓은 모델을 재사용했기 때문에 한 줄 짜리로 매우 간단한 코드로 동작을 구현했다. 동작 자체도 NAND 게이트 심볼의 모습을 그대로 옮겼다. AND 게이트 모델 객체의 proc() 함수 결과를 인버터 모델 객체의 proc() 함수에 입력으로 넣었다. 그리고 인버터 모델 객체의 proc() 함수의 리턴값이 최종적으로 NAND 게이트 모델의 출력이 된다.

모델을 구현했으니 제대로 동작하는지 확인한다. 방법은 기존과 같다. main() 함수에 출력 코드를 넣어서 진리표와 출력이 일치하는지 확인한다.

{caption="main.rs | NAND 모델 테스트"}
mod transistor;
mod gates;
 
use gates::GateInterfaces;
 
fn main() {
//... 생략 ...
 
    let mut nand_gate = gates::NandGate::new();
    println!("Test NAND Gate, (0, 0) -> {}", nand_gate.proc(false, false));
    println!("Test NAND Gate, (0, 1) -> {}", nand_gate.proc(false, true));
    println!("Test NAND Gate, (1, 0) -> {}", nand_gate.proc(true, false));
    println!("Test NAND Gate, (1, 1) -> {}", nand_gate.proc(true, true));
}

같은 패턴으로 이어서 테스트를 작성했다. 코드에 새로운 기능이나 요소를 추가하지 않았기 때문에 위 코드만 추가하고 바로 빌드한다. 빌드 후 실행하여 NAND 게이트의 진리표와 같은지 비교한다.

... 생략 ...
Test AND Gate, (0, 0) -> false
Test AND Gate, (0, 1) -> false
Test AND Gate, (1, 0) -> false
Test AND Gate, (1, 1) -> true
... 생략 ...
Test NAND Gate, (0, 0) -> true
Test NAND Gate, (0, 1) -> true
Test NAND Gate, (1, 0) -> true
Test NAND Gate, (1, 1) -> false

NAND 게이트의 진리표와 결과가 일치한다. 그리고 AND 게이트 모델의 결과와 비교했을 때 결과값이 반대다. NAND 게이트 모델을 완성했다.

File attachments: 
첨부파일 크기
Image icon nand-gate-symbol.png4.25 KB

댓글

나빌레라의 이미지

트랜지스터 조합으로 NAND 게이트를 만들 수도 있으나, 모델링해보는게 목적이라서 그냥 AND 게이트에 NOT 붙여서 만들었습니다.

트랜지스터 조합으로 NAND 게이트 만드는 건 저의 오래전 아주 오래전 글이나 저의 안팔리지만 명저인 "컴퓨터 아나토미"를 참고해 주세요.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

파이썬3의 이미지

이야 믄지 모르지만 그냥 넋놓고 봤네유;;;
머찝니다~!!!

[크롬북에서 적었어유~]

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.