본문 바로가기

2-2/디지털 설계 및 실험

[디지털 설계 및 실험] Verilog 기본 vol.5 Gate-Level Modeling

오랜만에 올리는 Verilog!

베릴로그 조 아

 

먼저 Gate-level Modeling에 대해서 알아보자.

 

 

 

 

💻 Gate level Modeling

게이트 레벨 모델링이란 앞서 다뤘던 추상화의 4단계중 거의 가장 낮은 단계이다.

제일 낮은 스위치 수준 추상화가 거의 사용되지 않기때문이다.

Multiplexer와 Full Adder와 같이 설계에서 가장 낮은 수준의 모듈을 구현하는 데 사용된다.

 

베릴로그에는 모든 기본 게이트가 내장되어있다.  그 기본 게이트들에는 무엇이 있는지 확인해보자.

 

 

 

💻 AND/OR Gates

 

베릴로그는 기본 게이트들은 내부적으로 구현을 해놓은 상태이다. AND/OR도 그에 포함된다.

모듈처럼 인스턴스화되며, 모듈 정의가 필요하지 않는다.

 

복수의 스칼라 input들이 들어가면 하나의 스칼라 output이 나오게 된다.

단자 목록의 첫 번째 단자는 출력이고 다른 단자는 입력이다.

 

Gates

여러가지 Gate들의 표현방식이다.

모습이 비슷한데, n이 붙은 것들은 입력쪽에 동그라미가 붙어있다.

and / or / nand / nor / xor / nor / buf / not 등의 Gate들이 있다.

 

 

 

위에서 Gates들을 사용한 것을 보자.

wire를 생성하고, a1,na1,or1 등 게이트의 이름을 정의하였다.

 

 

 

 

입력이 두개이상인 게이트들의 출력은 진리표를 반복적으로 사용한다.

진리표에서 x와 z가 무슨뜻인지 헷갈리는데 x는 0인지 1인지 모르는 상태, z는 회로가 끊어진 상태를 의미하는 거같다. (z는 높은 저항을 가진 신호)확실하진 않다.

 

 

💻 BUF/NOT Gates

AND/OR 게이트와 그를 활용한 게이트들을 알아보았다.

이번에는 버퍼와 NOT 게이트를 알아보자.

 

BUF/NOT 게이트들은 하나의 스칼라 입력을 가지고 하나이상의 스칼라 출력을 가진다.

 

bur/not gates

BUF/NOT 게이트들의 모습이다.

뭐.. 외우자 ㅋ

 

verilog 코드에서 BUF와 NOT 게이트들을 선언한 모습이다.

b1, n1과 같이 이름을 지어주고 뒤에 포트들의 이름을 적어주었다.

입력은 한개이고 출력은 한개이상이므로, 맨 뒤에있는것은 입력으로 확정된다.

그앞에있는 것들은 모두 출력 포트이다.

 

BUF/NOT Truth Table

NOT 게이트는 입력할 때 출력을 반대로 얻을 수 있는 논리 게이트이다.

0이 들어가면 출력은 1을 얻고, 1이 들어가면 0을 얻는다. 항상 반대로 출력이 나오게 된다.

 

BUF 게이트는 NOT 게이트와 반대의 개념으로 사용되는 논리회로이다.

입력하는 신호를 변경하지 않고 출력하는 회로로 사용된다.

신호를 변경하지 않고 출력하는데 왜 사용하냐는 의구심이 들 수 있다.

BUF 게이트를 사용하면 출력시간을 지연한다. 감쇄 신호를 회복, 잡음 제거 등의 기능이 있다.

 

 

BUF/NOT gates with an additional control signal

 

BUF와 NOT 게이트에 추가적인 컨트롤신호가 주어진 경우도 있다. 바로 bufif와 notif다.

bufif와 notif는 각각 버퍼와 인버터이며, 출력을 활성화하기 위한 제어신호가 추가되었다. 위에서는 ctr1이 바로 그 신호이다. 게이트는 제어 신호가 활성화된 경우에만 유효한 출력을 가지는데, 그렇지 않으면 출력이 높은 저항을 가진 상태가 된다.

 

 

오른쪽에 나와있는 코드는 bufif와 notif를 구현하였다. 입력과, 제어신호 ctrl이 들어가고 출력으로 out이 나온다.

왼쪽은 bufif 와 notif의 진리표이다.

 

 

 

💻 Array of Instances

베릴로그에서 변수들의 배열을 사용할 수 있다.

C언어에서와 똑같이 사용한다. 선언문을 보자.

 

wire [7:0]이 부분은 wire의 배열을 만든 것이다. 7은 마지막 index, 0은 첫 index를 말한다.

배열을 사용하는 방식은 변수 이름 뒤에 index 값을 집어 넣어주면 된다.

 

 

💻 Rise, Fall, and Turn-off Delays

Verilog에서 게이트 delay는 원시 인스턴스의 설계자에 의해 정의될 수 있다. 이를 통해 엔지니어는 실시간으로 논리 회로가 작동하도록 할 수 있다.

 

Rise delay와 Fall delay가 있다.

Rise delay는 게이트 출력 전환이 다른값 0,x 또는 z에서 1로 전환하는 데 걸리는 시간과 같다.

Fall delay는 게이트 출력 전환이 다른값 1,x또는 z에서 0으로 전환하는 데 걸리는 시간과 같다.

Turn-off delay는 게이트 출력 전환이 다른값에서 z로 전환데는데 걸리는 시간과 같다.

 

delay들을 사용할때 구문 규칙들이 있다.

세 가지 값을 모두 지정하면 rise, fall, Turn-off delay로 간주하고,

두 값이 지정되면 rise, fall delay로 간주된다.

하나만 지정된 경우에는 모든 delay에 사용이 된다. 예시를 보며 조금 더 알아보자.

 

and와 bufif를 이용하였는데 # 뒤에있는 숫자들에 집중하자.

저 부분이 delay값을 지정해주는 경우인데, 

5하나만 넣은 경우에는 모든 delay 값은 5가 되는 것이다.

4,6 을 넣어준 경우에는 Rise delay는 4, fall delay는 6이 된다. 4와 6의 최솟값인 4가 자동적으로 Turn-off delay가 된다.

3,4,5 를 넣어준 경우는 rise delay는 3, fall delay는 4, turn-off delay는 5가 된다.

 

또한, Verilog에서 delay의 각 타입에 대해서 세가지 값을 넣을 수도 있다. 

각각은 min/typ/max 값이다.

전체 시뮬레이션 실행에서 min, typ, max 값 중 하나만 사용할 수 있다. 시뮬레이션 시작 시 지정되며, 사용된 시뮬레이터에 따라 실행값은 다르다.

 

nand #(3:4:5,4:5:6,5:6:7) nand_gate_2 (out, in0, in1); // rise delay: min=3, typ=4, max=5, fall delay: min=4, typ=5, max=6, turn-off delay: min=5, typ=6, max=7.

만약 설계자가 최솟값을 고르면, rise delay = 3, fall delay =4 4, turn - off delay = 5가 된다.

 

이렇게 타입별로 min/typ/max 값을 지정하여 시뮬레이션 해준다면, 실시간 논리회로에서 지연은 일정하지 않기 때문에 설계자가 훨씬 더 나은 실시간 경험을 할 수 있다.