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

나빌레라의 이미지

AND 게이트는 트랜지스터를 조합해서 만든다. 이름이 AND 게이트인 이유는 트랜지스터를 조합한 회로가 불리언 AND 연산과 동일한 동작을 하기 때문이다.

AND 게이트{ height=45% }

위 그림은 AND 게이트를 트랜지스터 두 개로 만든 것이다. A와 B가 입력이다. A, B 입력에 따라 OUT 출력이 바뀐다. 입력에 따라 바뀌는 출력은 다음 표와 같다.

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

입력에 따른 출력 결과가 불리언 AND 연산과 정확히 일치한다. 전기 회로로 수학적 불리언 연산을 할 수 있다는 뜻이다. 실세계에서 AND 게이트를 트랜지스터 조합으로 만들 수 있으므로 앞장에서 만든 트랜지스터 모델을 조합해서 AND 게이트를 모델링 할 수 있다.

{caption="and_gate.rs | AND 게이트 모델"}
use crate::transistor;
 
pub struct Andgate {
    pub conn_a: bool,
    pub conn_b: bool,
    pub conn_out: bool,
 
    tr1: transistor::Transistor,
    tr2: transistor::Transistor,
}
 
impl Andgate {
    pub fn new() -> Andgate {
        Andgate {
            conn_a:false,
            conn_b:false,
            conn_out:false,
            tr1:transistor::Transistor::new(),
            tr2:transistor::Transistor::new(),
        }
    }
}
 
impl Andgate {
    pub fn proc(&mut self, input_a: bool, input_b: bool) -> bool {
        self.conn_a = input_a;
        self.conn_b = input_b;
 
        self.tr1.conn_c = true;
        self.tr2.conn_c = self.tr1.proc(input_a);
        self.conn_out = self.tr2.proc(input_b);
 
        return self.conn_out;
    }
}

AND 게이트 회로를 그대로 코드로 모델링한 것이다. 3번째 줄에서 10번째 줄까지가 AND 게이트 모델의 구성 요소를 선언한 코드다. 신호선이 3개고 트랜지스터가 두 개다. 신호선은 외부에서 연결 가능하므로 public으로 선언했고 트랜지스터 두 개는 내부 요소이므로 private이다. 러스트에서는 아무 지시자를 붙이지 않으면 구조체 멤버 변수는 private다.

12번째 줄에서 22번째 줄은 AND 게이트 객체를 생성하는 생성자 함수다. 신호선 세 개는 기본값이 false이고 트랜지스터 두 개에 객체를 생성했다.

24번째 줄에서 34번째 줄이 AND 게이트 동작이다. 30번째 줄에 tr2의 conn_c의 입력으로 tr1.proc() 메소드 결과를 넣었다. 이 코드가 AND 게이트 회로 그림에서 첫 번째 트랜지스터의 E와 두 번째 트랜지스터의 C가 연결된 그림을 모델링한 코드다.

AND 게이트 회로의 결과는 두 번째 트랜지스터의 E 신호선 값이다. 그래서 31번째 줄과 33번째 줄을 보면 tr2.proc() 메소드의 결과를 conn_out에 넣어서 리턴한다.

제대로 모델이 동작하는지 테스트한다. 테스트 방법은 앞장의 인버터와 트랜지스터 테스트 방법과 같다. main() 함수에서 모델의 동작 결과를 출력해서 눈으로 확인해 보는 것이다.

{caption="main.rs | AND 게이트 모델 테스트"}
mod and_gate;
 
fn main() {
 
// ...생략...
 
    let mut and_gate = and_gate::Andgate::new();
    println!("Test AND Gate, (0, 0) -> {}", and_gate.proc(false, false));
    println!("Test AND Gate, (0, 1) -> {}", and_gate.proc(false, true));
    println!("Test AND Gate, (1, 0) -> {}", and_gate.proc(true, false));
    println!("Test AND Gate, (1, 1) -> {}", and_gate.proc(true, true));
}

불리언 AND 연산의 진리표에 맞게 동작하는지 확인하는 코드다. 그래서 입력 A, B에 true, false 입력 조합을 모두 넣었다. 출력 결과가 불리언 AND 연산의 진리표와 일치하면 모델이 제대로 동작하는 것이다.

$ cargo run
... 생략 ...
Test AND Gate, (0, 0) -> false
Test AND Gate, (0, 1) -> false
Test AND Gate, (1, 0) -> false
Test AND Gate, (1, 1) -> true

테스트를 실행한 결과를 보면 불리언 AND 연산의 진리표와 일치한다. AND 게이트 모델이 제대로 동작함을 확인했다.

AND 게이트 기호{ width=50% }

AND 게이트를 회로도에 그릴 때는 위 기호를 사용한다.

File attachments: 
첨부파일 크기
Image icon and-gate-tr.png16.33 KB
Image icon and-gate-symbol.png4.1 KB

댓글

나빌레라의 이미지

앞에서 만들었던 트랜지스터 객체를 사용해서 AND 게이트를 만들었습니다.
다음편은 OR 게이트입니다.

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

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.