ngspice
Introducción
Ngspice es un programa de código abierto para la simulación de circuitos electrónicos. Es un simulador SPICE basado en el código desarrollado por la Universidad de California en Berkeley en la década de los setenta/ochenta.
En este tutorial me voy a centrar en el uso de ngspice en batch mode, que quiere decir que los circuitos y el tipo de análisis están definidos en un fichero que ngspice procesa desde la terminal.
La forma más sencilla de ejecutar un circuito es la siguiente:
ngspice -b mycircuit.cir
Aunque estoy usando .cir, a ngspice le da igual la extensión del
fichero. Para redirigir el output del programa a un fichero simplemente
usa la opción -o:
ngspice -b mycircuit.cir -o results.out
Formato del circuito
Los circuitos se definen usando el concepto de netlist. Una netlist
consiste en una lista de componentes o elementos que especifican a qué
nodos están unidos cada terminal del componente. Un nodo es una serie de
cables ideales que se encuentran al mismo voltaje. ngspice sigue el
convenio de usar el 0 para definir la tierra (ground), pero por lo
demás hay mucha flexibilidad a la hora de nombrar nodos. Un ejemplo
sencillo de netlist es el siguiente circuito describiendo un divisor de
tensión o voltaje:
Vin 2 0 1V
R1 div 0 10
R2 2 div 5
En este circuito, el voltaje del nodo div es proporcional al voltaje
del nodo 2. Vin es una fuente de voltaje, mientras que R1 y R2
son dos resistencias.
Una particularidad de spice es que el nombre the cada elemento tiene que comenzar con una letra que represente el tipo de elemento. R para resistencias, V para fuentes de voltaje, M para transistores, etc. La documentación de ngspice contiene una lista completa de todos los tipos de componentes.
Tipos de análisis
ngspice permite principalmente tres tipos de análisis: continuos (DC), análisis de frequencia (AC), y evolución en función del tiempo.
Análisis DC
Un ejemplo sencillo de un programa que analiza el divisor de voltaje es el siguiente:
Divisor de voltaje
Vin 2 0 DC 1V
R1 div 0 10
R2 2 div 5
.control
op
print v(div)
.endc
.end
Este programa establece varias reglas importantes en ngspice:
- ngspice ignora la primera línea de un programa y asume que es el título
- el programa termina con la instrucción
.end. - Las instrucciones están contenidas entre
.controly.endc - En este ejemplo tenemos dos instrucciones:
opcalcula el estado estacionario (operation point) del circuito.print v(div)imprime el voltaje del nododiv
El resultado de correr:
ngspice -b mycircuit.cir
Es el siguiente:
Note: No compatibility mode selected!
Circuit: divisor de voltaje
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000
Using SPARSE 1.3 as Direct Linear Solver
No. of Data Rows : 1
v(div) = 6.666667e-01
Note: Simulation executed from .control section
Un análisis más interesante es estudiar la evolución del voltaje del nodo div en
función del valor en la fuente de voltaje. Para ello, usamos la instrucción dc.
Consideremos el ejemplo siguiente:
Divisor de voltaje
Vin 2 0 DC 1V
R1 div 0 10
R2 2 div 5
.control
dc Vin 0V 5V 1V
print v(div)
.endc
.end
El circuito es esencialmente el mismo, pero ahora la instrucción de control dc hace
un barrido desde 0 a 5 voltios a incrementos de un voltio. El resultado es el siguiente:
Note: No compatibility mode selected!
Circuit: divisor de voltaje
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000
Using SPARSE 1.3 as Direct Linear Solver
No. of Data Rows : 6
divisor de voltaje
DC transfer characteristic Wed Jun 10 23:13:07 2026
--------------------------------------------------------------------------------
Index v-sweep v(div)
--------------------------------------------------------------------------------
0 0.000000e+00 0.000000e+00
1 1.000000e+00 6.666667e-01
2 2.000000e+00 1.333333e+00
3 3.000000e+00 2.000000e+00
4 4.000000e+00 2.666667e+00
5 5.000000e+00 3.333333e+00
Note: Simulation executed from .control section
Cada instrucción print puede contener hasta ocho columnas. No hay limitaciones
en el número de instrucciones que se pueden incluir en un solo script.
También se pueden medir corrientes a través de fuentes de voltaje:
Divisor de voltaje
Vin 2 0 DC 1V
R1 div 0 10
R2 2 div 5
.control
dc Vin 0V 5V 0.1V
print v(2) div
print I(Vin)
.endc
.end
La expresión I(Vin) mide la corriente a través de la fuente de voltaje Vin. Para
medir la corriente en una posición de un circuito cualquiera hay que crear una fuente
de voltaje virtual con zero voltios de diferencia.
Divisor de voltaje
Vin 2 0 DC 1V
R1 div vv 10
Vm vv 0 0
R2 2 div 5
.control
dc Vin 0V 5V 1V
print v(2) div
print I(Vin) I(Vm)
.endc
.end
Con el resultado:
Note: No compatibility mode selected!
Circuit: divisor de voltaje
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000
Using SPARSE 1.3 as Direct Linear Solver
No. of Data Rows : 6
divisor de voltaje
DC transfer characteristic Tue Jun 16 01:42:07 2026
--------------------------------------------------------------------------------
Index v-sweep v(2) div
--------------------------------------------------------------------------------
0 0.000000e+00 0.000000e+00 0.000000e+00
1 1.000000e+00 1.000000e+00 6.666667e-01
2 2.000000e+00 2.000000e+00 1.333333e+00
3 3.000000e+00 3.000000e+00 2.000000e+00
4 4.000000e+00 4.000000e+00 2.666667e+00
5 5.000000e+00 5.000000e+00 3.333333e+00
divisor de voltaje
DC transfer characteristic Tue Jun 16 01:42:07 2026
--------------------------------------------------------------------------------
Index v-sweep i(vin) i(vm)
--------------------------------------------------------------------------------
0 0.000000e+00 0.000000e+00 0.000000e+00
1 1.000000e+00 -6.66667e-02 6.666667e-02
2 2.000000e+00 -1.33333e-01 1.333333e-01
3 3.000000e+00 -2.00000e-01 2.000000e-01
4 4.000000e+00 -2.66667e-01 2.666667e-01
5 5.000000e+00 -3.33333e-01 3.333333e-01
Una característica de ngspice es que cuando se mide la corriente a través de una fuente
de voltaje el signo de la corriente es el contrario al del circuito. Así, la corriente
en el circuito viene determinada por la polaridad de Vin, y fluye desde el polo positivo
al negativo. La fuente de voltaje virtual Vm está definida con la polaridad
opuesta, el primer nodo es vv que es el de mayor voltaje. Por tanto la corriente fluye
desde el negativo al positivo, y su signo es el contraro al medido por I(V1).