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

나빌레라의 이미지

XOR 연산을 하는 게이트다. XOR 게이트는 트랜지스터 조합으로 만들지 않고 게이트 조합으로 만든다. NAND나 NOR 게이트를 조합해서 XOR 게이트를 만들 수 있다. XOR 게이트를 만드는 여러 조합 중에 이 글에서는 NAND 게이트 4개로 만드는 조합으로 XOR 게이트를 모델링한다.

XOR게이트 구성

위 그림처럼 NAND 게이트를 연결하면 XOR 게이트가 된다. 위 그림에서 보이는 그대로 코드를 작성하면 모델을 만들 수 있다. 왼쪽 NAND 게이트부터 위, 아래, 오른쪽 순서로 각각 nand1, nand2, nand3, nand4라고 부르겠다. 즉, 입력 A는 nand1과 nand2에 들어가고 입력 B는 nand1과 nand3에 들어간다. 최종 출력은 nand4의 출력이다.

{caption="gates.rs | XOR 게이트 모델링"}
// ... 생략 ...
 
pub struct XorGate {
    nand1: NandGate,
    nand2: NandGate,
    nand3: NandGate,
    nand4: NandGate,
}
 
// ... 생략 ...
 
impl XorGate {
    pub fn new() -> XorGate {
        XorGate {
            nand1: NandGate::new(),
            nand2: NandGate::new(),
            nand3: NandGate::new(),
            nand4: NandGate::new(),
        }
    }
}
 
// ... 생략 ...
 
impl GateInterfaces for XorGate {
    fn proc(&mut self, input_a: bool, input_b: bool) -> bool {
        let out_nand1 = self.nand1.proc(input_a, input_b);
        let out_nand2 = self.nand2.proc(input_a, out_nand1);
        let out_nand3 = self.nand3.proc(input_b, out_nand1);
        return self.nand4.proc(out_nand2, out_nand3);
    }
}

XorGate 구조체 선언을 보면 멤버 변수로 NandGate 변수 4개를 선언했다. 이 4개 변수에 NandGate 객체를 할당하는 코드를 생성자 함수에 작성했다. 중요한 내용은 proc() 인터페이스 함수 구현이다. NAND 게이트 4개로 구성한 XOR 회로와 proc() 함수 내부 구현을 비교해가면서 보자. 입력 A는 nand1과 nand2로 들어간다. 27번째 줄과 28번째 줄에 input_a를 nand1.proc()과 nand2.proc()에 파라메터로 넘겼다. 입력 B는 nand1과 nand3으로 들어간다. 27번째 줄과 29번째 줄에 input_b를 nand1.proc()과 nand3.proc()에 파라메터로 넘겼다. nand2와 nand3은 각각 입력 A, B를 받고 공통으로 nand1의 출력을 입력으로 받는다. 28번째 줄과 29번째 줄을 보면 공통으로 out_nand1 변수 값을 nand2.proc()과 nand3.proc()에 넘기는 것이 보인다. 마지막으로 nand4의 입력은 각각 nand2와 nand3의 출력이다. 30번째 줄에 out_nand2와 out_nand3을 nand4.proc()에 파라메터로 넘긴 코드가 해당 회로 연결을 모델링한 코드다.

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

위 표는 XOR 연산의 진리표다. 테스트 결과가 위 진리표를 만족하면 XOR 게이트 모델을 제대로 구현한 것이다. XOR 모델 구현은 NAND 게이트를 활용했을 뿐 큰 틀에서 NAND, NOR 게이트를 모델링하는 방법과 크게 다르지 않다. 테스트 방법도 같다. main() 함수에 출력을 작성해서 확인한다.

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

출력 코드만 추가했기 때문에 바로 빌드해서 실행한다. 실행 결과는 다음과 같다.

Test XOR Gate, (0, 0) -> false
Test XOR Gate, (0, 1) -> true
Test XOR Gate, (1, 0) -> true
Test XOR Gate, (1, 1) -> false

실행 결과가 진리표를 만족한다. XOR 모델을 완성했다.

File attachments: 
첨부파일 크기
Image icon xor-gate-nand.png18.56 KB

댓글

나빌레라의 이미지

슬슬 유닛 테스트를 추가하는 작업이 지저분해지고 있습니다.
유닛 테스트를 깔끔하게 추가할 수 있도록 작업을 해야 합니다.

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

댓글 달기

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