wykreśl maksymalne nachylenia charakterystyk przenoszenia napięcia w ngspice
Zaimplementowałem podstawowy falownik CMOS w ngspice, wykonując analizę przemiatania DC na napięciu wejściowym w celu uzyskania krzywych przenoszenia napięcia (Vout vs Vin) przy różnych napięciach Vdd.
. cmos g (gain) vs vdd
.include tsmc180.txt
vdd source_p 0 0v
vin gate_common 0 0v
m_p out gate_common source_p source_p cmosp w=2u l=0.18u
m_n out gate_common 0 0 cmosn w=2u l=0.18u
.dc vin 0 2.5 0.01 vdd 0.5 2.5 0.5
.control
run
plot v(out) vs v(gate_common)
plot deriv(v(out)) vs v(gate_common)
.endc
.end
Uruchomienie powyższego daje mi dwa wykresy zgodnie z oczekiwaniami, jeden VTC, a drugi nachylenia VTC, które reprezentują wzmocnienie falownika.


Muszę wykreślić maksymalne punkty wzmocnienia (ujemne piki na krzywych wzmocnienia) jako krzywą w odniesieniu do vdd. Myślałem o użyciu .MEASURE
polecenia, aby to zrobić.
.measure dc g deriv v(out)
.measure dc g_max min g
ale to daje mi błąd
No. of Data Rows : 1255
measure 'g' failed
Error: measure g :
function '' currently not supported
.measure dc g deriv v(out) failed!
Nie mogłem znaleźć takiego przykładu w podręczniku ngspice pdf ani w ich repozytorium git dla przykładów symulacji ngspice. Niektóre wskazówki są bardzo mile widziane.
Odpowiedzi
Używanie deriv
oznacza różnicowanie na całej długości śladu, więc twoje polecenie .meas g deriv v(out)
nie ma sensu, ponieważ zwracana wartość byłaby wektorem punktów. Obsługi opisuje użycie deriv
jako kluczowe do pomocą oceny pochodną w jednym punkcie albo na odpowiednim śladu, albo przez stan osiągnięty innym.
Ponieważ ta metoda nie wydaje się na to pozwalać min
, max
i co, polecam wykonanie tej samej .dc
analizy, ale w .tran
:
- Skonfiguruj wejście jako rampę, np
PWL(0 0 1 2.5)
. - Przypisz
{x}
(lub jakąś inną wartość) do swoich zasobów. - Przejdź przez wartości podaży za pomocą
.step param x 0.5 2.5 0.5
.
Wystarczy wykreślić V(out)
tylko wykres , który pokaże poprawną odpowiedź, ale wykreślenie przeciwko V(in)
naśladuje .dc
analizę. Zaletą tej metody jest to, że jeśli dodasz obwód, który może wykonać pochodną wyjścia, możesz użyć .meas
do znalezienia min
/ max
/ etc. Obwód jest grupą utworzoną przez G1
i L1
, jak opisano tutaj . Jego rozmieszczenie również jest podobne: po prostu podłącz nieodwracające wejście G1
do V(out)
i użyj napięcia L1
na pochodnej. Podpisałbym krok czasu 1000x mniejszy niż całkowity czas symulacji (np. 1 ms
Dla 1 s
) lub mniej, dla wystarczającej dokładności (aby uniknąć fałszywych skoków).
Z tym, jeśli V(d)
jest pochodną, po prostu użyj:
.meas d min v(d) from 10m
W from 10m
eliminuje ryzyko przypadkowych kolce na początku ze względu na pochodną.