LTSpice에서 하위 회로/계층 구조 블록(회로) 만들기

앞서 언급했듯이, 이 게시물은 LTSpice를 사용하는 팁에 대한 시리즈 중 하나 입니다. 이 게시물은 기존 라이브러리 부품을 기반으로 하는 하위 회로와 계층 구조 블록을 사용하기 위한 기본 사항을 다룰 것입니다. 저자의 설계에서 오디오 증폭기로 사용하고 있는 Analog Devices사의 연산 증폭기인 OP275GPZ(Digi-Key 부품 번호 OP275GPZ-ND)의 이상적인 버전도 함께 다루도록 하겠습니다. 실제 소자는 보다 구체적인 데이터 값이 있기 때문에, 이 버전이 동일한 사양은 될 수 없습니다.

첫 하위 회로/블록 생성하기

기본이 되는 회로를 그리기 위해 새 도면을 시작합니다.

  1. 첫 번째 게시물을 참고해서, AND 게이트 아이콘을 클릭하여 부품 라이브러리를 연 후 "Univ"로 검색합니다.
    UniversalOpAmp
    이전에 이 부품을 처음 만들려 했을 때 라이브러리에 있는 기본 op-amp를 유효한 SPICE 라이브러리 부품으로 만들려고(이 부분은 다음에 다루도록 하겠습니다) 하니 사용할 수 없는 모델들이 있어서 매우 골치 아팠습니다. UniversalIpamp2 소자의 모델에는 괜찮은 하위 회로가 이미 설치되어 있어서 이 소자를 사용하는 것이 낫습니다. 하나를 회로에 배치한 후 다른 하나는 키보드에서 Ctrl+E를 눌러 미러링한 후 첫 번째 것과 가까운 곳에 배치합니다.

  2. 아래 그림과 같은 방식으로 결선하십시오.


    마지막 회로에서 처럼, 회로를 원하는 대로 만들 수 있도록 결선은 선호하는 어느 방향으로 든 그릴 수 있습니다. 유일한 주의사항은 확실하게 연결되어 있지 않는 결선들을 아직은 어떤 것에도 연결해서는 안된다는 것입니다. 회로도의 원하는 위치 아무 곳이나 클릭하여 결선을 종단한 후 키보드의 Esc 키를 누릅니다. 이들은 지정된 입력과 출력으로 상위 레벨 회로에서 사용될 것입니다. 각 노드는 기억하기 쉬운 고유한 이름을 가지고 있어야 합니다. OP275의 규격서를 참고해서 “OUTA” 부터 시작하겠습니다.

  3. 연결되어 있지 않는 출력/입력 노드들의 이름을 지정하기 위해 넷 이름 지정(Label Net) 툴을 사용합니다.

    A. 넷 이름 지정(Label Net) 아이콘을 클릭하거나 F4를 누릅니다
    LabelNetTool
    OUTA
    대화 상자가 열리면, GND와 COM이라는 이름의 두 개의 포괄 핀이 있습니다. 그 아래에 핀의 사용자 지정 이름을 입력할 수 있습니다. 포트 유형(Port Type)을 선택하는 것도 중요하며, 이 경우 OUTA는 출력입니다. 입력인지 출력인지 확실하지 않다면 양방향(Bi-Direct)을 선택하는 것이 좋습니다.

    B. 알맞는 결선의 끝 또는 출력에 넷 이름을 배치합니다.



    "OK"를 클릭한 후, 투명한 파란색 직사각형을 U1의 출력 또는 OUTA와 동일한 U1 출력의 결선 끝에 배치합니다. 저자는 일반적으로 1-n 핀에 대해 규격서에 기재된 순서대로 노드를 생성합니다. OPA275의 경우 n=8이며, n은 부품의 핀 수에 따른 아무 정수가 될 수 있습니다. 핀을 배치할 때 순서를 엄격하게 따를 필요는 없지만, 나중에 하위 회로에서는 넷리스트(Netlist) 순서가 중요할 수 있습니다. 여기부터는 Ctrl+C를 사용해서 노드 출력을 복사하고 복사한 레이블을 모든 연결되지 않은 곳에 배치한 후, 각 레이블을 고유한 이름으로 편집하는 것이 더 빠를 수 있습니다. 아래는 작업이 완료된 저자의 결과입니다. 넷 이름(Net Name) 편집기에서 전압 입력과 Op-Amp 입력의 핀 유형을 반드시 "Inputs"으로 편집하시기 바랍니다.


    회로를 그리는 동안에는, 고유한 "다른 이름으로 저장(Saving As)"하기를 추천합니다. 여기서는 나중에 사용하기 위해 OPZ로 이름을 지었습니다.


    다른 회로에서 사용할 수 있는 회로를 생성하는 방법에는 하위 회로와 계층 구조 블록(회로)라는 두 가지 방법이 있습니다. 아래에 둘을 구분해 두었습니다.

라이브러리 넷리스트 하위 회로 방식에 대한 구체적인 설정

C. 회로의 넷리스트를 복사한 후 이들을 유효한 하위 회로로 만들기 위해 기본 문서 편집기 또는 노트패드++(Notepad++)에서 몇 가지를 편집합니다.

a. View 메뉴를 클릭하여 “SPICE Netlist” 옵션을 선택하면 나타나는 창에 있는 모든 글자를 복사한 후, 메모장 또는 노트패드++를 사용하여 새로운 빈 테스트에 붙여 넣습니다.
image
image

b. 아래 코드 블록에서 편집된 모든 내용이 적용되었는지 확인하거나, 아래 코드를 복사해서 붙여넣기로 “C:”로 시작하는 줄 아래의 모든 항목을 대체할 수 있습니다. “C:”로 시작하는 줄은 사용자마다 다르게 표시될 것입니다.

// 이 줄은 복사하지 마십시오. 여러분의 경우 OPZ8DIP의 이름을 다르게 지을 수도 있으며 회로의 입/출력 이름을 원하는 대로 지을 수도 있습니다.
.subckt OPZ8DIP OUTA -INA +INA V- +INB -INB OUTB V+
XU1 +INA -INA V+ V- OUTA level.2 Avol=1Meg GBW=10Meg Slew=10Meg ilimit=25m rail=0 Vos=0 phimargin=45 en=0 enk=0 in=0 ink=0 Rin=500Meg
XU2 +INB -INB V+ V- OUTB level.2 Avol=1Meg GBW=10Meg Slew=10Meg ilimit=25m rail=0 Vos=0 phimargin=45 en=0 enk=0 in=0 ink=0 Rin=500Meg
.lib UniversalOpamps2.sub
.backanno
.ends OPZ8DIP
.end

(넷리스트의)두 번째 줄부터 마지막에서 두번 째 줄까지가 정말 중요 합니다. .subckt SPICE 명령은 OUTA, -INA, +INA, V-, +INB, -INB, OUTB, 그리고 V+라는 이름과 순서로 정렬된 핀을 가지는 OPZ8DIP라는 새로운 하위 회로를 만듭니다. 여기서는 핀의 순서가 절대적으로 중요하므로 반드시 기억해야 합니다. 엄밀히 핀 이름들을 재정렬할 수는 있지만, 넷리스트 번호가 달라지게 됩니다. 심볼을 만들 때 잘못된 넷리스트 번호를 참조하게 되면, 예상치 못한 분석 결과가 발생하거나 작업이 안될 수도 있습니다. 넷리스트의 순서는 하위 회로의 이름 뒤에 1을 붙여서 시작해 마지막 핀 이름으로 끝납니다. 핀 이름은 해당 노드에 주어진 이름과 반드시 동일하게 지정되어야 합니다. SPICE 파일에서 각 핀의 이름은 공백으로 구분됩니다. .ends 명령으로 OPZ8DIP이라는 하위 회로를 종료합니다.

c. 새 파일을 .lib 또는 .sub인 확장자를 가지는 아무 이름으로 저장합니다. 하위 회로의 이름과 동일할 필요는 없지만, 일반적으로 이렇게 하는 편이 더 편합니다.
saveAsLib

  1. 하위 회로/블록을 나타내는 새로운 심볼을 만듭니다.

    A. 상단에 있는 계층 구조(Hierarchy) 메뉴를 클릭하여 Open this Sheet’s Symbol 또는 Create a New Symbol 중 선택합니다.
    image

    저자의 경우 Create a New Symbol 옵션을 선호하는데, 이유는 Open this Sheet’s Symbol을 사용하면 (해당 심볼이 없으면)심볼을 자동으로 생성할 지를 묻는 대화 상자를 통해 심볼을 자동으로 생성할 수 있지만 자동으로 생성된 심볼은 보기 좋지 않은 경우가 많고 핀의 순서가 완전히 잘못되는 경우도 많습니다. 계층 구조 블록(회로)와 하위 회로를 만드는 단계에 있어 몇 가지 다른 점이 있으므로, 아래의 하위 회로 섹션에서 하위 회로를 만드는 구체적인 방법과 차이점에 대해 나타내도록 하겠습니다.

하위 회로의 속성 설정

  1. .lib 파일과 같은 순서 및 같은 이름으로 핀을 배치합니다. 심볼 그리기 모드에는 특정 품목을 그릴 수 있는 단축키가 있습니다.
    PinSymbEdit

    키보드의 "P"를 누르면 핀 설정창이 나타나며 Netlist Order는 항상 1에서 시작합니다. 이것이 .lib 파일의 핀 순서를 기억해야하는 중요한 이유입니다. 앞서 언급한 규격서에 그려진 바와 유사하게 동일한 순서로 핀을 계속 추가합니다. 핀 레이블 맞춤(Pin Label Justfication)은 핀이 배치되는 면에 따라 달라져야 합니다. OUTA부터 V-까지는 왼쪽 맞춤으로, 그리고 나머지 핀은 오른쪽 맞춤으로 합니다. 이는 완전히 맞춤형이므로 원하는 대로 디자인할 수 있습니다. 여기서는 문자와 결선이 서로 충돌하지 않도록 핀을 그렸습니다.



    키보드의 "R"을 눌러 핀들의 가운데를 가로지르는 외부 사각형을 그립니다. 한 쪽 모서리를 찍은 후 반대편 모서리를 찍으면 만들어 집니다. 이 눈금 단위에서의 그리기는 마우스 움직임에 매우 민감해서 십자선이 제공됩니다. 십자선이 눈금의 점을 살짝 벗어났다면, 벗어난 그대로 그려질 것입니다.

  2. 심볼을 회로도와 동일한 이름으로 저장합니다.
    파일 확장자가 .asy라는 것을 제외하고는 회로도를 다른 이름으로 저장(Save As)할 때와 같습니다.

    a. Ctrl+A를 눌러 심볼의 속성을 띄웁니다.
    SymbAttribs

    b. Prefix 값은 "X"로 Value는 라이브러리 넷리스트 하위 회로 방법에 대한 구체적인 설정에서 기술된 하위 회로의 명칭(여기서는 OPZ8DIP)과 동일하게 편집합니다. "OK"를 누르기 전 심볼 유형(Symbol Type)은 Cell인지 확인하십시오.
    EditSymAtt

    c. 심볼을 한번 더 저장합니다.

계층 구조 블록

계층 구조 블록과 하위 회로의 주된 차이점은 계층 구조는 회로 기반인 반면 하위 회로는 SPICE 라이브러리 넷리스트 기반입니다(잘 설명된 글을 여기에서 확인할 수 있습니다). 저자의 자료로 차이점을 설명하고 있으므로 이 게시글에 적혀 있는 동일한 순서를 사용할 것입니다. 이 경우 넷리스트 순서는 상관없지만 핀 이름은 일치해야만 하며 하위 회로에서처럼 회로의 이름은 심볼의 이름과 같아야만 합니다. 회로와 심볼 도면은 그대로 유지합니다. 변경 사항은 키보드의 Ctrl+W를 클릭하여 InstName을 추가함으로써 심볼에 인스턴스 명칭을 부여하고(다른 과정에서도 이 작업을 할 수 있습니다) 속성 편집기(Attributor additor)의 모든 값은 비우고 심볼 유형은 Block으로 변경 하는 것입니다. 기억하십시오, 속성 편집기는 키보드의 Ctrl+A로 열수 있습니다.

AttributeWindowAddName
attribEditBlock

참고: 회로에서 다른 폴더에 있는 부품을 사용하려 하면 가끔 LTSpice가 그 계층 구조 블록을 찾지 못할 수 있습니다. 이런 오류가 발생할 경우, 문제를 해결하기 위해 그리고 있는 회로를 계층 구조 블록이 있는 동일한 폴더로 이동시키기 바랍니다.

MissingHierarchy

새로 생성한 하위 회로/블록 사용하기

새로 시작할 새로운 회로도를 만든 다음 새 부품을 배치하기 위해 AND 게이트 아이콘을 누릅니다. 이전에 만든 폴더가 이미 연결되어 있다면 새 부품을 쉽게 찾을 수 있습니다.

  1. 새 부품을 배치하기 위해 AND 게이트 아이콘을 다시 클릭한 후 Top Directory를 알맞은 위치로 변경합니다.
    locationSwitch

    참고: LTSpice를 처음 사용하는 경우라면 두 개의 test 폴더가 나타날 수도 있습니다. LTSpice는 일반적으로 첫 번째 폴더는 저장에 그리고 두 번째 폴더는 검색에 사용합니다. 새로 만든 부품이 여기에 나타날 것입니다. .lib 파일을 만드는 과정을 따라 했다면, 부품은 노란색일 것이며 올바로 동작하기 위해서는 추가적인 지시가 필요합니다. 만약 계층 구조 블록이라면 기본 폴더가 심볼과 회로를 연결할 것이며 심볼과 회로가 동일한 이름이라면 회로도에 별도 SPICE 명령의 추가가 필요치는 않습니다. 계층 구조 블록의 경우 폴더에서 부품을 찾으면 다음과 같은 모양일 것입니다:
    HBLOCK

    부품을 배치 후 마우스 오른쪽 버튼을 클릭하면 Schematic Block 편집기가 나타날 것입니다.
    HierarchyEditor

    아래 그림은 라이브러리 SPICE 파일이 필요한 Cell 부품을 나타내며, 마우스 오른쪽을 클릭하면 Component Attribute 편집기가 나타날 것입니다.


    image

  2. 만약 .lib 버전 부품일 경우, 다음 SPICE directive를 추가하지 않으면 회로를 정상적으로 실행할 수 없을 것입니다.

    A. 툴바 끝에 있는 .op 메뉴를 클릭합니다.
    DotOP

    B. 문서 편집기에 .lib를 입력하고 "OK"를 클릭합니다.
    DotLibEditTextOk

    C. 회로도 위 적당한 곳에 SPICE directive를 둔 후 편집하기 위해 마우스 오른쪽을 클릭합니다.
    libEdit

    D. "Browse"를 클릭해서 앞서 만든 .lib 파일(여기서는 OPZ8DIP.lib)을 찾아 선택 후 "OK"를 누릅니다.



    이것을 추가해야 하는 이유는 해당 폴더가 이미 연결되어 있더라도 프로그램은 하위 회로의 넷리스트를 어디서 찾아야 할지 모르기 때문입니다. 이 명령을 추가하지 않고 회로를 실행한다면 아래 오류가 발생할 것입니다:
    unknownSub

다음은 .lib 버전의 하위 부품을 사용해서 만든 예제 회로입니다:

왼쪽은 반전 증폭기이며 오른쪽은 비반전 증폭기 입니다. 연산 증폭기에서 이러한 모드가 얼마나 다른지 알 수 있는 가장 좋은 방법으로 V1과 V2에 DC 스윕을 사용했습니다. 다음은 V1을 0에서 5V로 스윕한 결과입니다:

SweepV1

다음은 V2를 0에서 5V로 스윕한 결과입니다:

SweepV2

둘 다 약 500mV에서 최대 증폭에 도달하지만, 반전 증폭기는 비반전 증폭기와는 반대 방향으로 진행합니다. 입력 전압은 5V까지 증가하지만 컷오프는 연산 증폭기의 최대값과 전원 전압 공급으로 인한 출력 전압의 증가하는 속도를 늦춥니다.




영문 원본: Making Sub-Circuits / Hierarchical Circuits in LTSpice