Rust로 작성해 보는 컴퓨터 구조 (2) - 인버터

나빌레라의 이미지

인버터는 입력 신호를 반대로 출력하는 소자다. 입력이 1이면 출력은 0이고, 반대로 입력이 0이면 출력이 1이다. 더 설명할 수 없는 단순한 물건이다.

회로도에서 쓰는 인버터 기호는 이렇다.

인버터

삼각형이 있고 꼭지점에 동그라미가 붙은 모양이다. 삼각형 기호는 사실 버퍼를 의미한다. 전기 신호가 삼각형 기호를 통과하는 동안 딜레이가 있다는 의미다. 동그라미 기호가 실제로 신호를 반전한다는 의미다. 그래서 버퍼가 없는 인버터는 동그라미 한 개만 쓰기도 한다. 일단 모델에서는 딜레이를 처리하지 않는다. 나중에 필요하면 모델을 수정하면 되므로 지금은 단지 신호를 반전하는 인버터 모델만 만든다.

인버터는 여러가지 방법으로 만들 수 있다. 앞 장에서 스위치 동작을 하는 트랜지스터를 모델링했으므로 이 모델을 활용할 수 있는 방법으로 인버터 회로를 구현하면 아래 그림과 같다.

인버터 트랜지스터 회로

입력신호 IN은 트랜지스터의 B 신호선이다. 출력신호 OUT은 전원 V와 풀업(pull-up) 연결되어 있다. 따라서 아래 스위치 역할을 하는 트랜지스터가 열려 있으면 OUT은 true다. 입력 신호 IN에 true가 들어가면 스위치가 닫히는 것과 동일한 동작을 하므로 전압 V가 접지로 들어가 OUT은 false가 된다. 즉, 입력 IN이 false일 때 OUT은 true이고 입력 IN이 true일 때 OUT은 false가 된다. 입력 신호의 반대 값이 출력으로 나가게 된다.

이 인버터를 소프트웨어로 구현해 보자. 인버터는 Not 게이트라고도 부른다. 그리고 앞으로 게이트를 계속 모델링 할 것이므로 gates.rs 파일을 만들고 NotGate라는 이름으로 인버터를 모델링한다.

{caption="gates.rs | 인버터 모델"}
use crate::transistor;
 
pub struct NotGate {
    pub conn_in:bool,
    pub conn_out:bool,
    tr: transistor::Transistor,
}
 
impl NotGate {
    pub fn new() -> NotGate {
        NotGate {
            conn_in: false,
            conn_out: false,
            tr: transistor::Transistor::new(),
        }
    }
 
    pub fn proc(&mut self, input: bool) -> bool {
        self.tr.conn_c = true;
        self.conn_out = true;
 
        self.tr.proc(input);
        if self.tr.conn_e {
            self.conn_out = false;
        }
        return self.conn_out;
    }
}

쉬운 코드다. NotGate 클래스는 트랜지스터 모델 객체를 변수로 가지고 있다. proc() 메소드가 인버터 동작을 수행한다. 파라미터 input은 bool 타입이다. 19, 20번째 줄은 전원 V가 트랜지스터의 C 신호선에 연결된 것과 출력 OUT이 풀업 연결된 것을 표현한 것이다. 22, 23, 24번째 줄이 트랜지스터의 B 신호선에 true를 입력했을 때 동작을 표현한 것이다. 트랜지스터 스위치가 닫히면 tr.conn_e가 true로 모델링했다. 따라서 이 경우에 출력 conn_out을 false로 바꿔주는 것이다.

인버터 모델의 구현은 이정도로 충분하다. 실물이 간단한 물건이기 때문에 프로그램으로 모델링 해도 간단하다. 테스트 방법도 간단하다. true를 proc()에 넣었을 때 false가 나오면 되고, false를 proc()에 넣었을 때 true가 나오면 된다. main.rs를 수정해서 Inverter 객체를 테스트한다.

{caption="main.rs | Inverter 모델 테스트"}
mod gates;
 
fn main() {
// ...생략...
 
    let mut inv = gates::NotGate::new();
    println!("Test inverter (true) -> ({})", inv.proc(true));
    println!("Test inverter (false) -> ({})", inv.proc(false));
}

Inverter 객체의 인스턴스 inv를 생성했다. 그리고 proc() 메소드에 true를 입력해서 리턴 값을 출력하고 false를 입력해서 리턴 값을 출력한다. 기대하는 결과는 입력과 출력이 반대로 나오는 것이다. 위 코드를 빌드해서 실행하면 아래처럼 나온다.

$ cargo build
\ \ \ Compiling programming_coms v0.1.0 (programming_coms)
\ \ \ Finished dev [unoptimized + debuginfo] target(s) in 0.40s
$ cargo run
\ \ \ Finished dev [unoptimized + debuginfo] target(s) in 0.01s
\ \ \ Running target/debug/programming_coms
Test inverter (true) -> (false)
Test inverter (false) -> (true)

cargo build 명령으로 빌드하고 cargo run 명령으로 실행한다. 실행하면 main() 함수에서 작성한 println!() 함수가 실행된다. 제일 아래 두 줄이 결과다. true 입력에 대해 false가 출력으로 나왔고 false 입력에 대해 true가 출력으로 나왔다. 이렇게 간단히 인버터 모델을 테스트 했다.

File attachments: 
첨부파일 크기
Image icon inverter.png3.18 KB
Image icon inverter-tr.png7.87 KB

댓글

나빌레라의 이미지

1편에서 만든 트랜지스터를 부품으로 사용했습니다.

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

댓글 달기

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