wykreśl maksymalne nachylenia charakterystyk przenoszenia napięcia w ngspice

Nov 22 2020

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 .MEASUREpolecenia, 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

aconcernedcitizen Nov 22 2020 at 18:15

Używanie derivoznacza 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 derivjako 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, maxi co, polecam wykonanie tej samej .dcanalizy, ale w .tran:

  1. Skonfiguruj wejście jako rampę, np PWL(0 0 1 2.5).
  2. Przypisz {x}(lub jakąś inną wartość) do swoich zasobów.
  3. 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 .dcanalizę. Zaletą tej metody jest to, że jeśli dodasz obwód, który może wykonać pochodną wyjścia, możesz użyć .measdo znalezienia min/ max/ etc. Obwód jest grupą utworzoną przez G1i L1, jak opisano tutaj . Jego rozmieszczenie również jest podobne: po prostu podłącz nieodwracające wejście G1do V(out)i użyj napięcia L1na pochodnej. Podpisałbym krok czasu 1000x mniejszy niż całkowity czas symulacji (np. 1 msDla 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 10meliminuje ryzyko przypadkowych kolce na początku ze względu na pochodną.