Rust로 작성해 보는 컴퓨터 구조 (1) - 트랜지스터

나빌레라의 이미지

트랜지스터는 여러 용도로 쓸 수 있는 전자 소자다. 그 중에서 트랜지스터의 스위치 작용만 이용하는 트랜지스터 모델을 만들 것이다. 이 글에서는 트랜지스터의 여러 반도체 소자 특성은 생략하고 스위치 대용으로 트랜지스터를 쓸 것이기 때문이다.

트랜지스터

위 그림은 회로도에서 쓰는 트랜지스터 기호다. 트랜지스터 동작과 원리에 대한 자세한 설명은 생략한다. 모델을 만드는데 필요한 내용만 설명한다. 위 그림에 B, C, E로 표시한 신호선이 있다. C에 전기 신호를 준 상태에서 B에 아무 입력을 주지 않으면 E로 출력이 나가지 않는다. B에 신호를 줄 때만 E에 출력이 나간다. 쉽게 말해 C에 신호가 들어가 있는 상태에서 스위치를 누르면(B에 신호를 주면) E로 출력 신호가 나간다고 이해해도 된다. 트랜지스터 모델을 만드는데는 이 정도 설명이면 충분하다.

{caption="transistor.rs | 트랜지스터 모델"}
 
pub struct Transistor {
    pub conn_c: bool,
    pub conn_e: bool,
    pub conn_b: bool,
}
 
impl Transistor {
    pub fn new() -> Transistor {
        Transistor {
            conn_c: false,
            conn_e: false,
            conn_b: false,
        }
    }
}
 
impl Transistor {
    pub fn proc(&mut self, input: bool) -> bool {
        self.conn_b = input;
 
        self.conn_e = false;
 
        if self.conn_c && self.conn_b {
            self.conn_e = true;
        }
 
        return self.conn_e; 
    }
}

직관적으로 이해 가능한 쉬운 코드다. 트랜지스터는 신호선이 세 개다. 첫번째 줄에서 5번째 줄이 신호선을 정의한 코드다. 7번째 줄에서 15번째 줄은 C++로 치면 일종의 생성자다. 엄밀히는 팩토리 패턴에서 스테이틱 인스턴스 제네레이터에 가깝지만 러스트에서는 기본값을 넣어서 인스턴스를 생성하는 많이 쓰는 코드 스킬이다. 18번째 줄에서 27번째 줄이 트랜지스터 모델의 동작을 구현한 코드다. B, C, E 신호선의 관계를 코드로 그대로 옮겼다. C와 B에 true 신호가 있을 때만 E에 true에 출력한다. 그 외에는 E에 false를 출력한다.

트랜지스터 모델을 테스트하는 코드를 main.rs에 작성한다. 방법은 인버터를 테스트할 때와 같다. 트랜지스터 모델 인스턴스를 선언하고 각 신호선에 true와 false를 넣어보고 출력값을 확인한다. 출력값이 기대하는 출력값과 같으면 제대로 모델링 한 것이다.

{caption="main.rs | 트랜지스터 모델 테스트"}
 
mod transistor;
 
fn main() {
    let mut tr = transistor::Transistor::new();
    tr.conn_c = false;
    println!("Test transistor, c=false, (true) -> ({})", tr.proc(true));
    println!("Test transistor, c=false, (false) -> ({})", tr.proc(false));
    tr.conn_c = true;
    println!("Test transistor, c=true, (true) -> ({})", tr.proc(true));
    println!("Test transistor, c=true, (false) -> ({})", tr.proc(false));
}

첫 번째 줄에 transistor 모듈을 선언한 코드를 추가했다. 그리고 4번째 줄에서 10번째 줄이 트랜지스터 모델을 테스트하려고 작성한 코드다. 4번째 줄에서 트랜지스터 모델의 인스턴스를 선언했다. 5번째 줄에서 신호선 C에 false를 입력했다. 그러면 신호선 B에 뭘 입력하든 출력은 항상 false여야 한다. 8번째 줄에는 신호선 C에 true를 입력했다. 따라서 신호선 B에 true를 입력하면 true를 출력하고 false를 입력하면 false를 출력해야한다. 빌드하고 실행해서 확인한다.

Test transistor, c=false, (true) -> (false)
Test transistor, c=false, (false) -> (false)
Test transistor, c=true, (true) -> (true)
Test transistor, c=true, (false) -> (false)

위는 실행 결과다. 기대했던 결과를 출력했다. 따라서 트랜지스터 모델이 정상 동작함을 확인했다.

File attachments: 
첨부파일 크기
Image icon transistor.png10.05 KB

댓글

나빌레라의 이미지

러스트를 공부해 보려고 연습삼아 코딩하다가 그나마도 제가 게을러서 하다 말고를 반복했습니다. 그래서 조금이라도 내제적 동기 부여를 하려고 코드에 설명을 썼습니다. 쓰다보니 분량이 어느정도 되었지만, 이것 마져도 안쓰고 펜(키보드?)를 꺽은지 반년이 넘었습니다. 아마도 이대로 끝을 보지 않고 그냥 버릴 글이 될것 같습니다. 그래도 써놓은 글이 아까워 KLDP에 올립니다. 제가 다시 어디선가 동기 부여받아서 다시 글을 이어서 쓸지 혹시 모르니까요.

그리고 정작 Rust 언어의 많은 기능을 쓰지도 연습하지도 않게 되더라구요.. 총체적으로 실패한 프로젝트...ㅋㅋㅋ

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

댓글 달기

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