Skip to content

Commit

Permalink
Merge pull request #12 from michaelk99/main
Browse files Browse the repository at this point in the history
Add details to 5T-OTA small-signal analysis
  • Loading branch information
hpretl authored Aug 30, 2024
2 parents 2def301 + ab2ed21 commit e467c25
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 4 deletions.
20 changes: 17 additions & 3 deletions _sec_basic_ota.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@ So in order to reach an output voltage accuracy of at least 3% we need a dc gain
In order to derive the governing equations for the OTA we will make a few simplifications:

- We will set $\gmb = 0$ for all MOSFETs.
- We will further set $\Cgd = 0$ for all MOSFETs except for $M_4$ where we expect a Miller effect on this capacitor, and we could add its effect by increasing the capacitance at the gate node of $M_{3,4}$. Hoewever, as this does not create a dominant pole in this circuit, we consider this a minor effect (see @eq-simple-ota-gain).
- We will further set $\Cgd = 0$ for all MOSFETs except for $M_4$ where we expect a Miller effect on this capacitor, and we could add its effect by increasing the capacitance at the gate node of $M_{3,4}$. Hoewever, as this does not create a dominant pole in this circuit, we consider this a minor effect (see @eq-simple-ota-gain). Thus, only $\Cgs[34]$ is considered at the gate node of the current mirror load.
- We assume $\gm \gg \gds$, so we set $\gds[1] = \gds[3] = 0$.
- The drain capacitance of $M_2$ and $M_4$, as well as the gate capacitance of $M_2$ we can add to the load capacitance $C_\mathrm{load}$.
- The drain capacitance of $M_2$ and $M_4$, as well as the gate capacitance of $M_2$ we can add to the load capacitance $C_\mathrm{load}$. Note that $\Cgs[2]$ can be added because of the feedback connection between the inverting input and the output. However, this is not shown in the small-signal equivalent circuits below, because we are interested in the open-loop transfer function.

The resulting small-signal equivalent circuit is shown in @fig-basic-ota-small-signal.

Expand All @@ -87,7 +87,7 @@ Please review the MOSFET small-signal equivalent model in @fig-mosfet-small-sign

{{< include figures/_fig_basic_ota_small_signal.qmd >}}

We can further simplify the output side by recognizing that the impedance looking from the output down we have $\gds[2]$ in series with $\gds[5] + \gm[12]$ (since we treat $M_1$ as a common-gate stage when looking from the output, and since it is loaded by a low impedance of $\gm[34]^{-1}$ we can approximate the impedance looking into $M_1$ with $\gm[12]^{-1}$). With the approximation that $\gm \gg \gds$ we can move $\gds[2] + \gds[4]$ in parallel to $C_\mathrm{load}$. Further, assuming a differential drive with a virtual ground at the tailpoint we can remove $\gds[5]$. The current source $\gm[34] \vgs[34]$ with replace with the equivalent conductance $\gm[34]$. This results in the further simplified equivalent circuit shown in @fig-basic-ota-small-signal-simplified.
We can further simplify the output side by recognizing that the impedance looking from the output down we have $\gds[2]$ in series with $\gds[5] + \gm[12]$ (since we treat $M_1$ as a common-gate stage when looking from the output, and since it is loaded by a low impedance of $\gm[34]^{-1}$ we can approximate the impedance looking into the source of $M_1$ with $\gm[12]^{-1}$). With the approximation that $\gm \gg \gds$ the parallel connection of $\gm[12]$ and $\gds[5]$ is dominated by $\gm[12]$ and series connection by $\gds[2]$. Therefore, we can move $\gds[2] + \gds[4]$ in parallel to $C_\mathrm{load}$. Further, assuming a differential drive with a virtual ground at the tailpoint we can remove $\gds[5]$. The current source $\gm[34] \vgs[34]$ is replace with the equivalent conductance $\gm[34]$. This results in the further simplified equivalent circuit shown in @fig-basic-ota-small-signal-simplified.

{{< include figures/_fig_basic_ota_small_signal_simplified.qmd >}}

Expand Down Expand Up @@ -156,6 +156,20 @@ $$ {#eq-simple-ota-gain-simplified}
Inspecting @eq-simple-ota-gain-simplified we can interpret the OTA transfer function as a transconductor $\gm[12]$ driving a load of $Y_\mathrm{load} = \gds[2] + \gds[4] + s C_\mathrm{load}$. We can thus redraw @fig-voltage-buffer-ota in the following way, injecting the previously calculated noise current into the output node. The result is shown in @fig-voltage-buffer-ota-noise.
{{< include figures/_fig_voltage_buffer_ota_noise_zout.qmd >}}
::: {.callout-note title="Output Impedence of the Voltage Buffer"}
First we short the input terminal to ground and then we connect a current source $I_\mathrm{out}$ at the output terminal, see @fig-voltage-buffer-ota-noise-zout. Since we can neglect the gate leakage current into the inverting input terminal of the OTA, KCL at the output node is simply:
$$
I_\mathrm{out} + \gm[12]\left(-V_\mathrm{out}\right) = 0
$$
Thus, the output impedance is easily calculated.
$$
Z_\mathrm{out} = \frac{V_\mathrm{out}}{I_\mathrm{out}} = \frac{V_\mathrm{out}}{\gm[12]V_\mathrm{out}} = \frac{1}{\gm[12]}
$$
:::
{{< include figures/_fig_voltage_buffer_ota_noise.qmd >}}
We see that the feedback around the transconductor $\gm[12]$ creates an impedance of $1/\gm[12]$. We can now calculate the effective load conductance of
Expand Down
2 changes: 1 addition & 1 deletion figures/_fig_voltage_buffer_ota_noise.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ with sd.Drawing(canvas='svg') as d:
noise = d.here
elm.Line().right().length(3).label('Vout')
Cload = elm.Capacitor().down().label('Yload')
Cload = elm.Resistor().down().label('Yload')
elm.Ground()
d.pop()
Expand Down
43 changes: 43 additions & 0 deletions figures/_fig_voltage_buffer_ota_noise_zout.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
```{python}
#| label: fig-voltage-buffer-ota-noise-zout
#| echo: false
#| fig-cap: "Output impedance calculation of a voltage buffer."
import schemdraw as sd
import schemdraw.elements as elm
with sd.Drawing(canvas='svg') as d:
d.config(unit=2)
d.config(fontsize=16)
op = elm.Opamp().flip().label('gm12', loc='center', ofst=0)
elm.Line().left().length(1).at(op.in2).dot(open=True)
vi_term_p = d.here
d.push()
elm.Gap().down().label(['+','Vi','-'],ofst=(-0.3,0.25))
d.pop()
elm.Line().left().length(1)
elm.Ground()
elm.Line().at(op.out).right().length(1.5)
elm.CurrentLabelInline(direction='in').label('gm12*Vi')
elm.Line().at(op.out).length(1).dot()
d.push()
elm.Line().right().length(1).dot(open=True).label('Vout','top',ofst=(0.5,.25))
elm.Line().length(0.75)
#elm.Line().down().length(0.25)
elm.SourceI().reverse().down().label('Iout')
elm.Ground()
nc = d.here
d.pop()
elm.Line().down()
elm.Line().left().tox(vi_term_p-0.5)
elm.Line().up().toy(op.in1)
elm.Line().right().tox(vi_term_p).dot(open=True)
vi_term_n = d.here
elm.Line().right().to(op.in1)
#elm.Arrow().down().at(vi_term_p).to(vi_term_n)
```

0 comments on commit e467c25

Please sign in to comment.