728x90
추상화 수준 모델링
추상화 수준 모델링
- verilog HDL을 이용하여 원하는 논리회로나 디지털시스템을 표현하는 방법으로 4가지 추상화 수준의 모델링 방법이 있음.
- 추상화 수준에 따른 모델링 종류
- 스위치 수준 모델링, 게이트 수준 모델링, 데이터 플로우 수준 모델링, 행위 또는 알고리즘 수준 모델링
- 스위치 수준 모델링은 스위치(On/Off), 기억노드, 그리고 그들의 연결로 구현되는 추상화 수준 모델링의 가장 하위 수준
게이트 수준 모델링
게이트 수준 모델링
- verilog에는 기본적인 논리 게이트가 프리미티브 연산자(primitive operator)로 미리 정의
- 모듈 정의 없이 일반적인 모듈처럼 인스턴스화가 가능
- 기본적인 디지털 논리 게이트에는 AND, OR, NOT, NAND, NOR, XOR가 있다.
기본적인 디지털 논리 게이트 종류
- AND 게이트
- OR 게이트
- NOT 게이트
- NAND 게이트
- NOR 게이트
- XOR 게이트
**** 진리표 틀렸네요. 아래가 맞습니다. XOR은 두 입력의 값이 다를 때 1이 출력되는 논리 게이트입니다.
primitive의 intstance화
- 인스턴스 이름은 생략할 수 있다.
- 입출력 목록은 반드시 출력, 입력 순으로 작성
- #을 이용하여 전달지연을 지정할 수 있다.
- 지연 값이 지정되지 않으면 전달 지연은 0으로 간주
- 지연은 하나 또는 두 개의 값으로 지정할 수 있으며, 첫 번째 값은 출력 상승지연, 두 번째 값은 출력 하강지연을 의미
- 하나의 지연 값만 지정하면 상승지연과 하강 지연이 동일한 값으로 설정
- 사용 예
프리미티브_연산자 #(상승지연, 하강지연) 인스턴스_이름 (output, input1, input2, ...);
/* and gate primitive */
and U1 (c, a, b); // 지연 생략, 인스턴스 이름 U1
and (c, a, b); // 지연, 인스턴스 이름 생략
and #2 U1 (c, a, b); // 상승 / 하강 지연 모두 2ns
and #(3,4) U1 (c, a, b); // 상승 지연 3ns, 하강 지연 4ns
- 게이트 프리미티브 연산자는 인스턴스화(instantiation)하여 사용
- 인스턴스화는 상위 모듈에서 프리미티브 연산자를 하위 모듈로 호출하여 사용하는 개념
- 모듈 내에서 하나의 게이트 프리미티브 연산자를 여러 번 호출하여 사용할 경우, 인스턴스 이름을 달리 사용하여 각각의 호출한 것들을 서로 다른 인스턴스(객체)로 구분할 수 있게 함.
- 따라서 미리 잘 설계된 Desing Entity(설계 독립체, 즉 모듈)을 여러 번 반복 호출해서 사용할 수 있음.
- 사용 예
/* U1과 U2는 서로 다른 객체이다. */
and U1 (output1, input1, input2);
and U2 (output2, input2, input3);
3상태 게이트 프리미티브(3-state gate primitive)
- 위의 논리 게이트 프리미티브 연산자 이외에 제어신호가 포함된 3상태 게이트 프리미티브 연산자도 사용 가능
- 3상태 게이트 프리미티브는 bufif0, bufif1, notif0, notif1이 있음
- 출력은 0, 1, z
- 3상태 게이트 프리미티브들은 오직 제어신호가 인가될 때만 신호를 전달
- 제어신호가 인가되지 않을 경우는 z(high impedence)가 전달
- 3상태 게이트 프리미티브의 기호
- 3상태 게이트 프리미티브의 진리표
bufif1 | control | ||||
0 | 1 | x | z | ||
input | 0 | z | 0 | L | L |
1 | z | 1 | H | H | |
x | z | x | x | x | |
z | z | x | x | x |
bufif0 | control | ||||
0 | 1 | x | z | ||
input | 0 | 0 | z | L | L |
1 | 1 | z | H | H | |
x | x | z | x | x | |
z | x | z | x | x |
notif1 | control | ||||
0 | 1 | x | z | ||
input | 0 | z | 1 | H | H |
1 | z | 0 | L | L | |
x | z | x | x | x | |
z | z | x | x | x |
notif0 | control | ||||
0 | 1 | x | z | ||
input | 0 | 1 | z | H | H |
1 | 0 | z | L | L | |
x | x | z | x | x | |
z | x | z | x | x |
- 사용 예
buf U1 (output, input);
not U2 (output, input);
bufif0 U1 (output, input, control);
bufif1 U1 (output, input, control);
데이터 플로우 수준 모델링
데이터 플로우 수준 모델링
- 복잡하지 않은 작은 회로를 설계할 때는 설계자의 직관적인 판단에 의해 게이트간 연결을 하는 게이트 수준 모델링 기법이 적합
- 조금 더 복잡한 회로를 설계할 때는 게이트 수준보다 한 단계 더 추상적인 기능 중심의 모델링 기법을 사용하는 것이 효율적
- 데이터 플로우 수준 모델링 방법은 다양한 연산 및 처리 결과를 이용하여 회로의 동작 표현
- 게이트 수준 모델링에서는 게이트 프리미티브 연산자를 사용하여 기본적인 논리회로의 각 논리소자의 입출력을 표현
- 이때 프리미티브 연산자는 입력에 대한 연산결과를 직접 출력신호에 할당
- 데이터 플로우 수준 모델링 방법을 이용한 설계에서는 연산 및 처리 결과를 출력 신호로 넘겨받기 위해 할당문 사용
할당문
- 할당문은 객체(object)에 값을 주는 기본적인 방법
- net(wire) 자료형 객체에 값을 할당하는 연속 할당문과 variable(reg) 자료형 객체에 값을 할당하는 절차형 할당문이 있다.
- 연속 할당문(continuous assignment)
assign result = a & b;
assign out = in1 & in2; //out, in1, in2는 네트
assign flag = (cnt == 4'h7);
assign address[15:0] = 16'b0; //address는 16비트 네트형 벡터
assign {carry, sum[3:0]} = a[3:0] + b[3:0] + c_in; //1비트 네트 carry와 4비트 네트형 벡터 sum의 결합
- assign문을 이용하여 net형 객체에 스칼라 또는 벡터 형태의 값을 할당
- 우변의 값에 변화가 발생했을 때 좌변의 객체에 값 할당이 즉시 일어남.
- 조합회로에서 사용(ex. adder, multiplexer, decoder...)
- 절차형 할당문(procedural assignment)
always @(event_signal) begin
result_blocking = a & b; //블록킹 대입문
result_nonblocking <= a & b; //논블록킹 대입문
end
- always문 또는 initial문에서 블록킹 할당 연산자(=) 또는 논블록킹 할당 연산자(<=)를 사용하여 variable형 객체(reg, integer 등)의 값을 갱신
- 우변 수식의 값 변화(event)와 상관없이 event_signal의 값에 변화가 발생했을 때 우변 수식의 값이 좌변의 객체에 값이 할당되며 다음 절차형 할당문에 의해 값이 갱신될 떄까지 좌변에 할당된 값은 유지됨.
- 순차회로에서 사용(ex. latch, flip-flop)
- 연속 할당문 사용 시 주의 사항
- 연속 할당문(assign문)에서 할당 연산자(=)의 왼쪽에는 net형만 올 수 있으며 reg형은 사용할 수 없다.
- 연속 할당문에서 할당 연산자의 오른쪽에 올 수 있는 것은 net형/reg형 스칼라 또는 벡터 또는 함수 호출문이다.
- 연속 할당문의 할당 연산자의 오른쪽 피연산자들의 값이 변화하면 즉시 왼쪽 net에 값이 할당된다.
- wire(net)형과 reg형
- wire는 값을 저장할 수 없고, assign문과 함께 사용된다. combinational logic을 표현할 때 주로 사용
- reg형은 값을 저장할 수 있고, assign문을 사용할 수 없다. 주로, sequential logic을 표현할 때 주로 사용(combinational logic을 표현할 때도 사용됨.)
이 글은 "따라하면서 배우는 디지털 시스템 설계 및 응용 with Verilog HDL"을 기반으로 작성했음을 알립니다.
'verilog > 이론' 카테고리의 다른 글
[verilog] verilog의 추상화 수준 모델링 방법(2)(행위 수준 모델링 : always, initial, 블록킹과 논블록킹) (0) | 2023.12.03 |
---|---|
[verilog] verilog의 연산자(2)(비트단항 논리연산자, 관계 연산자, 시프트 연산자, 조건 연산자, 결합 연산자, 반복 연산자) (2) | 2023.11.21 |
[verilog] verilog의 연산자(1)(산술연산자, 논리연산자, 비트단위 논리연산자) (2) | 2023.11.15 |
[verilog] 벡터(vector)와 배열(array) (0) | 2023.11.13 |
[verilog] verilog의 자료형 (0) | 2023.11.11 |