산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

게이트 레벨 모델링: 하드웨어 회로도에서 Verilog 코드로

대부분의 디지털 설계는 RTL 같은 높은 추상화 수준에서 수행되지만, 때로는 and, or 같은 조합 소자를 사용하여 더 낮은 수준에서 작고 결정적인 회로를 구축하는 것이 직관적일 수 있습니다. 이 수준에서의 모델링은 일반적으로 게이트 레벨 모델링이라고 불리며, 게이트를 포함하고 하드웨어 회로도와 Verilog 코드 간에 일대일 대응 관계가 있습니다.

Verilog는 기본 요소(primitives)로 알려진 몇 가지 기본 논리 게이트를 지원하는데, 이들은 이미 미리 정의되어 있어 모듈처럼 인스턴스화할 수 있습니다.

And/Or/Xor 게이트

이 기본 요소들은 여러 스칼라 입력을 받아 단일 스칼라 출력을 제공하는 AND와 OR 게이트를 구현합니다. 이 기본 요소들에 대한 인자 리스트의 첫 번째 단자가 출력이며, 입력 중 어느 것이든 변경될 때마다 업데이트됩니다.

module gates (
  input a, b,
  output c, d, e
);
  and (c, a, b); // c가 출력, a와 b가 입력
  or (d, a, b);  // d가 출력, a와 b가 입력
  xor (e, a, b); // e가 출력, a와 b가 입력
endmodule
module tb;
  reg a, b;
  wire c, d, e;
  integer i;
  gates u0 ( .a(a), .b(b), .c(c), .d(d), .e(e));
  initial begin
    {a, b} = 0;
    $monitor ("[T=%0t a=%0b b=%0b c(and)=%0b d(or)=%0b e(xor)=%0b", $time, a, b, c, d, e);
    for (i = 0; i < 10; i = i+1) begin
      #1 a <= $random; b <= $random;
    end
  end
endmodule

시뮬레이션 로그

ncsim> run
[T=0 a=0 b=0 c(and)=0 d(or)=0 e(xor)=0
[T=1 a=0 b=1 c(and)=0 d(or)=1 e(xor)=1
[T=2 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0
[T=4 a=1 b=0 c(and)=0 d(or)=1 e(xor)=1
[T=5 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0
[T=6 a=0 b=1 c(and)=0 d(or)=1 e(xor)=1
[T=7 a=1 b=0 c(and)=0 d(or)=1 e(xor)=1
[T=10 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0
ncsim: *W,RNQUIE: Simulation is complete.

Nand/Nor/Xnor 게이트

위 게이트들의 역도 nand, nor, xnor 형태로 제공됩니다. 위 설계에서 기본 요소들만 역 버전으로 바꾼 것 외에는 동일합니다.

module gates (
  input a, b,
  output c, d, e
);
  // 이 예제에서는 and, or, xor 대신 nand, nor, xnor 사용
  nand (c, a, b); // c가 출력, a와 b가 입력
  nor (d, a, b);  // d가 출력, a와 b가 입력
  xnor (e, a, b); // e가 출력, a와 b가 입력
endmodule
module tb;
  reg a, b;
  wire c, d, e;
  integer i;
  gates u0 ( .a(a), .b(b), .c(c), .d(d), .e(e));
  initial begin
    {a, b} = 0;
    $monitor ("[T=%0t a=%0b b=%0b c(nand)=%0b d(nor)=%0b e(xnor)=%0b", $time, a, b, c, d, e);
    for (i = 0; i < 10; i = i+1) begin
      #1 a <= $random; b <= $random;
    end
  end
endmodule

시뮬레이션 로그

ncsim> run
[T=0 a=0 b=0 c(nand)=1 d(nor)=1 e(xnor)=1
[T=1 a=0 b=1 c(nand)=1 d(nor)=0 e(xnor)=0
[T=2 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1
[T=4 a=1 b=0 c(nand)=1 d(nor)=0 e(xnor)=0
[T=5 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1
[T=6 a=0 b=1 c(nand)=1 d(nor)=0 e(xnor)=0
[T=7 a=1 b=0 c(nand)=1 d(nor)=0 e(xnor)=0
[T=10 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1
ncsim: *W,RNQUIE: Simulation is complete.

이 게이트들은 두 개 이상의 입력을 가질 수 있습니다.

module gates (
  input a, b, c, d,
  output x, y, z
);
  and (x, a, b, c, d); // x가 출력, a,b,c,d가 입력
  or (y, a, b, c, d);  // y가 출력, a,b,c,d가 입력
  nor (z, a, b, c, d); // z가 출력, a,b,c,d가 입력
endmodule
module tb;
  reg a, b, c, d;
  wire x, y, z;
  integer i;
  gates u0 ( .a(a), .b(b), .c(c), .d(d), .x(x), .y(y), .z(z));
  initial begin
    {a, b, c, d} = 0;
    $monitor ("[T=%0t a=%0b b=%0b c=%0b d=%0b x=%0b y=%0b x=%0b", $time, a, b, c, d, x, y, z);
    for (i = 0; i < 10; i = i+1) begin
      #1 a <= $random; b <= $random; c <= $random; d <= $random;
    end
  end
endmodule

시뮬레이션 로그

ncsim> run
[T=0 a=0 b=0 c=0 d=0 x=0 y=0 x=1
[T=1 a=0 b=1 c=1 d=1 x=0 y=1 x=0
[T=2 a=1 b=1 c=1 d=0 x=0 y=1 x=0
[T=3 a=1 b=1 c=0 d=1 x=0 y=1 x=0
[T=4 a=1 b=0 c=1 d=0 x=0 y=1 x=0
[T=5 a=1 b=0 c=1 d=1 x=0 y=1 x=0
[T=6 a=0 b=1 c=0 d=0 x=0 y=1 x=0
[T=7 a=0 b=1 c=0 d=1 x=0 y=1 x=0
[T=8 a=1 b=1 c=1 d=0 x=0 y=1 x=0
[T=9 a=0 b=0 c=0 d=1 x=0 y=1 x=0
[T=10 a=0 b=1 c=1 d=1 x=0 y=1 x=0
ncsim: *W,RNQUIE: Simulation is complete.

Buf/Not 게이트

이 게이트들은 하나의 스칼라 입력과 하나 이상의 출력을 가집니다. buf는 버퍼로, 극성 변경 없이 입력 값을 출력으로 단순히 전달합니다. not은 인버터로, 입력 신호의 극성을 반전시킵니다. 따라서 입력에 0이면 1이, 1이면 0이 나옵니다.

module gates (
  input a,
  output c, d
);
  buf (c, a); // c가 출력, a가 입력
  not (d, a); // d가 출력, a가 입력
endmodule
module tb;
  reg a;
  wire c, d;
  integer i;
  gates u0 ( .a(a), .c(c), .d(d));
  initial begin
    a = 0;
    $monitor ("[T=%0t a=%0b c(buf)=%0b d(not)=%0b", $time, a, c, d);
    for (i = 0; i < 10; i = i+1) begin
      #1 a <= $random;
    end
  end
endmodule

시뮬레이션 로그

xcelium> run
[T=0 a=0 c(buf)=0 d(not)=1
[T=2 a=1 c(buf)=1 d(not)=0
[T=8 a=0 c(buf)=0 d(not)=1
[T=9 a=1 c(buf)=1 d(not)=0
xmsim: *W,RNQUIE: Simulation is complete.

포트 리스트의 마지막 단자가 게이트의 입력에 연결되고, 나머지 모든 단자가 게이트의 출력 포트에 연결됩니다. 여기 다중 출력 버퍼 예제가 있지만 드물게 사용됩니다.

module gates (
  input a,
  output c, d
);
  not (c, d, a); // c,d가 출력, a가 입력
endmodule

시뮬레이션 로그

xcelium> run
[T=0 a=0 c=1 d=1
[T=2 a=1 c=0 d=0
[T=8 a=0 c=1 d=1
[T=9 a=1 c=0 d=0
xmsim: *W,RNQUIE: Simulation is complete.

Bufif/Notif

출력을 활성화하는 추가 제어 신호가 있는 버퍼와 인버터는 bufif와 notif 기본 요소를 통해 제공됩니다. 이 게이트들은 제어 신호가 활성화된 경우에만 유효한 출력을 가지며, 그렇지 않으면 출력이 하이 임피던스 상태가 됩니다. 제어 극성이 정상(1로 활성화)인 bufif1, notif1과 제어 극성이 반전(0으로 활성화)인 bufif0, notif0 두 버전이 있습니다.

verilog

  1. 4011 IC로 기본 NAND 게이트 회로 설계 및 검증
  2. 접합 전계효과 트랜지스터(JFET) 이해: 게이트 전류 방향 & N채널 vs P채널
  3. 집적회로: 디지털 로직 게이트 기초
  4. C# 변수 범위(Scope) 이해: 클래스, 메서드, 블록 레벨
  5. 칩 설계 추상화 계층 완벽 이해: 시스템부터 레이아웃까지
  6. 실전 Verilog 게이트 레벨 설계: AND, OR, NOT 게이트와 2x1 멀티플렉서
  7. Verilog 게이트 지연 이해: 신뢰할 수 있는 디지털 설계를 위한 정확한 타이밍
  8. 고급 Verilog 스위치 레벨 모델링
  9. 레벨 스태프(Level Staff) 이해: 정의, 용도 및 유형
  10. 정밀 선반 수평 조절: 전문가 가이드