본문 바로가기
# Semiconductor/[Semicon Academy]

[Harman 세미콘 아카데미] 5일차 - Demux, 코드변환기

by Graffitio 2023. 6. 23.
[Harman 세미콘 아카데미] 5일차 - Demux, 코드변환기
728x90
반응형
[Demux]

 

Demux

: 한 선의 입력을 받아 출력선들 중 하나를 선택하여 받은 정보를 전송하는 회로.

Demux

 

<Mux와 Demux의 결합>

 

8x1 Mux - 1x4 Demux
Top module

앞에서 만든 Mux와 Demux를 instance 하여 Top module에 장착

top module을 Test_bench로 보내 시뮬레이션 시행

기본 TB 작성

우리는 d에 clk들을 넣어 줄 것므로, 위와 같이 수정해준다.

 

<Test_bench 설계 sequence>

 

   1. 테스트하고자하는 모듈의 입/출력을 복사해 온다.

   2. 입력은 reg, 출력은 wire로 연결해해준다.

   3. 모듈의 instance 선언

   4. clock 설정

       - clock 초기화

       - clock toggle

   5. 입력해서 test하고 싶은 값들을 initial 문 안에 넣어준다.

       충분한 출력이 나올 수 있도록 여유롭게 시간을 주어야 함.

   6. 시뮬레이션하고 결과 확인 

 

[코드 변환기]

 

<Gray code>

: 서로 인접한 값들 끼리는 1bit만 달라지게 변환한 코드

   → 인접성을 최대화 하여 오류를 최소화한다.

        보통 HDD, 카세트 테이프 등에 사용

 

예시) 왜놈 출현(봉화를 올린다고 가정해보자)

그냥 2진수 코드

00 : 평화로움

01 : 멀리서 보임

10 : 가까이 옴

11 : 상륙함

    01에서 10으로 바뀔 때, 하나 끄고 하나 켜야 된다.

    → 번거롭고 느리고 오류 발생할 가능성이 커짐

 

Gray code

00 : 평화로움

01 : 멀리서 보임

11 : 가까이 옴

10 : 상륙함

    01에서 11으로 바뀔 때, 하나만 키면 된다.

    → 빠르고 오류 생길 가능성 적어짐

 

<BCD란?>

= Binary Coded Decimal

이진화 십진법이라고도 부르며, 10진수처럼 코딩된 2진수이다. 컴퓨터는 0 또는 1의 2진수로 모든 것을 표현하고 사람은 10진수로 표현한다.2진수로만 표현이 된다면, 가독성이 현저히 떨어지므로 2진수를 10진수로 변환하는 과정을 거쳐 결과를 모니터에 출력해야 한다.

 

이렇게 10진수를 2진수로 표현하는 방법은 여러 가지가 있는데,

그 중 하나가 BCD 코드이다.(현재는 ASCII 코드를 가장 많이 사용)

즉, 10진수의 자릿수마다 1:1 매칭해서 2진수로 변환하는 것.

4bit(0000~1001)2진수를 사용하여 0~9까지 표현한다.

Decimal Binary BCD
0 0000_0000 0000_0000
1 0000_0001 0000_0001
2 0000_0010 0000_0010
3 0000_0011 0000_0011
4 0000_0100 0000_0100
5 0000_0101 0000_0101
6 0000_0110 0000_0110
7 0000_0111 0000_0111
8 0000_1000 0000_1000
9 0000_1001 0000_1001
10 0000_1010 0001_0000
11 0000_1011 0001_0001
12 0000_1100 0001_0010
13 0000_1101 0001_0011
4bit BCD code
0000 0을 표현
0001 1을 표현
0010 2을 표현
0011 3을 표현
0100 4을 표현
0101 5을 표현
0110 6을 표현
0111 7을 표현
1000 8을 표현
1001 9을 표현
1010 x
1011 x
1100 x
1101 x
1110 x
1111 x

예시)

Decimal Binary BCD
248 1_1111_0000 0010_0100_1000

 BCD로 표현하면, Binary보다 좀 더 쉽게 10진수로의 전환이 가능하다

 

<Binary → BCD 변환기>

 

              100보다 큰 것을 좌쉬프트하면 1010을 넘어가는데,
              BCD에서는 사용 불가하니까 건너뛰어야함.
              쉬프트 전 3을 더하는 것 = 쉬프트 후 6 더하는 것

        ∵ n진수 쉬프트하면 이전 값의 n배이므로

 

※ 쉬프트 연산자(<<, >>)

<<,>>를 써도 되지만, 회로가 더 복잡해지기 때문에 

{bin[10:0], 1'b0} 과 같이 결합연산자를 활용하여 쉬프트한다.

 

bin[12:0]일 경우,

 << : 하위 11bit와 0을 결합해준다.

        {bin[10:0], 1'b0}

 >> : 상위 11bit와 0을 결합해준다.

        {1'b0, bin[11:1]}

 

bin[3:0]까지는 100ns, 200ns, 400ns, 800ns 주고 나머지는 constants를 통하여 value에 0을 준다.

<Debug>

 

bin = 0000 0000 1010 → dec = 10

bin           0000 0000 1010

bcd 0000 0000 0000 0000

 

i = 0

bcd[14:0] 0000 0000 0000 000

bin[11] 0

  → bcd 0000 0000 0000 0000

if(bcd[ ]>? 4?) FLASE

                 ...

i = 8

bcd[14:0] 0000 0000 0000 000

bin[3] 1

  → bcd 0000 0000 0000 0001

if(bcd[ ]>100?) FLASE

 

i = 9

bcd[14:0] 0000 0000 0000 001

bin[2] 0

  → bcd 0000 0000 0000 0010

if(bcd[ ]>100?) FLASE

 

i = 10

bcd[14:0] 0000 0000 0000 010

bin[1] 1

  → bcd 0000 0000 0000 0101

if(bcd[ ]>100?) TRUE

 

bcd     0000 0000 0000 0101

+3       0000 0000 0000 0011

 bcd 0000 0000 0000 1000

 

i = 11

bcd[14:0] 0000 0000 0001 000_

bin[0] 0

    → bcd 0000 0000 0001 0000

if(bcd[ ]>? 4?) FALSE 

 

∴ i = 11일때, bcd : 0000 0000 0001 0000

    = Decimal 10

 

Combilational Logic은 여까지~

 

728x90
반응형