diff --git a/.gitignore b/.gitignore index b91f0ad..adad1d4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ images.txt ip/ # Distribution / packaging +media/ pdf/*.latex pdf/*_fiximg.tex pdf/*.md diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0a2f296 --- /dev/null +++ b/Makefile @@ -0,0 +1,52 @@ + +JEKYLL_VERSION=3.8 +SITE=${shell pwd}/docs + +.PHONY: slides + +FILES = lectures/l00_diode \ + lectures/l00_refresher \ + lectures/lp_project_report \ +# lectures/l01_intro \ + lectures/l02_esd \ + lectures/l03_refbias \ + lectures/l04_afe \ + lectures/l05_sc \ + lectures/l06_adc \ + lectures/l07_vreg \ + lectures/l08_pll \ + lectures/l09_osc \ + lectures/l10_lpradio \ + lectures/l11_aver \ + lectures/lx_energysrc + +all: posts latex book + +posts: + -rm images.txt + cp syllabus.md docs/syllabus.md + cp plan.md docs/plan.md + ${foreach f, ${FILES}, python3 py/lecture.py post ${f}.md || exit; } + cd lectures; cat ../images.txt |xargs git add -f + + +jstart: + docker run --rm --name aic_docs --volume="${SITE}:/srv/jekyll" -p 3002:4000 -it jekyll/jekyll:${JEKYLL_VERSION} jekyll serve --watch --drafts + +latex: + -mkdir pdf/media + python3 py/lecture.py latex lectures/tex_intro.md + ${foreach f, ${FILES}, python3 py/lecture.py latex ${f}.md || exit ; } + cd pdf; make one + cp pdf/aic.pdf docs/assets/ + +book: + cd pdf; make ebook + cp pdf/aic.epub docs/assets/ + +slides: + ${foreach f, ${FILES}, ${MAKE} slide FILE=$f; } + + +slide: + python3 py/deckpdf.py ${FILE}.md docs/slides/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..dd9c3fa --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# aic2024 +Advanced Integrated Circuits 2024 diff --git a/lectures/l00_diode.md b/lectures/l00_diode.md new file mode 100644 index 0000000..7aa08ae --- /dev/null +++ b/lectures/l00_diode.md @@ -0,0 +1,711 @@ +--- +abstract: | + I try to explain how diodes work. +author: +- Carsten Wulff, 2023-10-26, v0.1.1 +title: Diodes +documentclass: IEEEtran +papersize: a4 +date: 2023-10-26 +classoption: journal +colorlinks: true +--- + + + + + +# Why + +Diodes are a magical [^1] semiconductor device that conduct +current in one direction. It's one of the fundamental electronics components, +and it's a good idea to understand how they work. + +If you don't understand diodes, then you won't understand transistors, neither +bipolar, or field effect transistors. + +A useful feature of the diode is the exponential relationship +between the forward current, and the voltage across the device. + +To understand why a diode works it's necessary to understand the physics behind +semiconductors. + +This paper attempts to explain in the simplest possible terms how a diode works [^2] + + +# Silicon + +Integrated circuits use single crystalline silicon. The silicon crystal is grown +with the [Czochralski method](https://en.wikipedia.org/wiki/Czochralski_method) +which forms a ingot that is cut into wafers. The wafer is a regular +silicon crystal, although, it is not perfect. + +A [silicon]() crystal unit cell, as seen in Figure 1 is a diamond faced cubic with 8 atoms in the corners spaced at 0.543 nm, 6 at the center of the +faces, and 4 atoms inside the unit cell at a nearest neighbor distance of 0.235 +nm. + + +![Silicon crystal unit cell\label{fig:silicon}](../media/503px-Silicon-unit-cell-3D-balls.png) + + + + + +As you hopefully know, the energy levels of an electron around a positive +nucleus are quantized, and we call them orbitals (or shells). For an atom far +away from any others, these orbitals, and energy levels are distinct. As we +bring atoms closer together, the orbitals start to interact, and in a crystal, +the distinct orbital energies split into bands of allowed energy states. No two +electrons, or any Fermion (spin of $1/2$), can occupy the same quantum state. +We call the outermost "shared" orbitial, or band, in a crystal the valence band. +Hence covalent bonds. + +If we assume the crystal is perfect, then at 0 Kelvin all electrons will be part of +covalent bonds. Each silicon atom share 4 +electrons with its neighbors. I think what we really mean when we say "share 4 +electrons" is that the wave-functions of the outer orbitals interact, and +we can no longer think of the orbitals as belonging to either of the silicon +nuclei. All the neighbors atoms "share" electrons, and +nowhere is there an vacant state, or a hole, in the valence band. If such a +crystal were to exist, it would not conduct any current, as the charges cannot +move. + +In a atom, or a crystal, there are also higher energy states where the carriers +are "free" to move. We call these energy levels, or bands of energy levels, +conduction bands. In singular form "conduction band", refers to the lowest +available energy level where the electrons are free to move. + +Due to imperfectness of the silicon crystal, and non-zero temperature, there +will be some electrons that achieve sufficient energy to jump to the conduction +band. The electrons in the conduction band leave vacant states, or holes, in the +valence band. + +Electrons can move both in the conduction band, as free electrons, and in the +valence band, as a positive particle, or hole. + + +# Intrinsic carrier concentration + +The intrinsic carrier concentration of silicon, or how many free electrons and +holes at a given temperature, is given by + +\begin{equation} + n_i = \sqrt{N_c N_v} e^{-\frac{E_g}{2 k T}} +\tag{1} +\label{eq:ni} +\end{equation} + + +where $E_g$ is the bandgap energy of silicon (approx 1.12 eV), $k$ is Boltzmann's constant, $T$ is +the temperature in Kelvin, $N_c$ is the density of states in conduction band, +and $N_v$ is the density of states in the valence band. + +The density of states are + +$$ N_c = 2 \left[\frac{2 \pi k T m_n^*}{h^2}\right]^{3/2} \text{ } N_v = 2 \left[\frac{2 \pi k T m_p^*}{h^2}\right]^{3/2} $$ + + + +where $h$ is Planck's constant, $m_n^\ast$ is the effective mass of electrons, and +$m_p^\ast$ is the effective mass of holes. + +In [@cjm11] they claim the intrinsic carrier concentration is a constant, although +they do mention $n_i$ doubles every 11 degrees Kelvin. In BSIM 4.8 [@bsim] $n_i$ is + +$$ n_{i} = 1.45e10 \frac{TNOM}{300.15} \sqrt{\frac{T}{300.15} \exp^{21.5565981 +- \frac{E_g}{2kT}}} $$ + + +Comparing the three models in Figure 2, we see the shape of BSIM and +the full equation is almost +the same, while the "doubling every 11 degrees" is just wrong. + +![Intrinsic carrier concentration versus temperature\label{fig:ni}](../media/ni.pdf) + + + +At room temperature the intrinsic carrier consentration is approximately +$n_{i} = 1 \times 10^{16}$ carriers/m$^3$. + +That may sound like a big number, however, if we calculate the electrons +per $um^{3}$ it's +$n_{i} = \frac{1 \times 10^{16}}{(1 \times 10^{6})^{3}} \text{ carriers}/\mu \text{m}^{3}< 1$, +so there are really not that many free carriers in intrinsic silicon. + +But where does Eq \eqref{eq:ni} come from? I find it unsatisfying +if I don't understand where things come from. I like to understand why there is +an exponential, or effective mass, or Planck's constant. If you're like me, then +read the next section. If you don't care, and just want to memorize the +equations, or indeed the number of intrinsic carrier concentration number at +room temperature, then skip the next section. + +# It's all quantum + +There are two components needed to determine how many electrons are in the +conduction band. The density of available states, and the probability of an +electron to be in that quantum state. + +For the density of states we must turn to quantum mechanics. The probability +amplitude of a particle can be described as + +$$\psi = Ae^{i(k \textbf{r} - \omega t)}$$ + +where $k$ is the wave number, and $\omega$ is the angular frequency, and +$\textbf{r}$ is a spatial vector. + +In one dimension we could write $\psi(x,t) = Ae^{i(kx - \omega t)}$ + +In classical physics we described the Energy of the system as +$$\frac{1}{2 m} p^2 + V = E$$ +where $p = m v$, $m$ is the mass, $v$ is the velocity and $V$ is the potential. + +In the quantum realm we must use the Schrodinger equation to compute the time +evolution of the Energy, in one space dimension + + +$$-\frac{\hbar^2}{2 m} \frac{\partial^2}{\partial^2 x}\psi(x,t) + +V(x)\psi(x,t) = i\hbar\frac{\partial}{\partial t} \psi(x,t) $$ + +where $m$ is the mass, $V$ is the potential, $\hbar = h/2\pi$. + +We could rewrite the equation above as + +$$ \widehat{H} \psi(x,t) = i \hbar \frac{\partial}{\partial t} \psi(x,t) = +\widehat{E} \psi(x,t)$$ + +where $$\widehat{H}$$ is sometimes called the *Hamiltonian* and is an operator, +or something that act on the wave-function. I recently read [Feynman's +Lectures on Physics](https://www.feynmanlectures.caltech.edu), and Feynman +called the Hamiltonian the *Energy Matrix* of a system. I like that better. The +$$\widehat{E}$$ is the energy operator, something that operates on the +wave-function to give the Energy. + +We could re-arrange + +$$ [\widehat{H} - \widehat{E}]\psi(r,t) = 0$$ + +This is an equation with at least 5 unknowns, the space vector in three dimensions, time, and the +energy matrix $$\widehat{H}$$. It turns out, that the energy matrix depends +on the system. The energy matrix further up is for one free electron. For an atom, the +energy matrix will have more dimensions to describe the possible quantum states. + +I was watching [Quantum computing in the 21st +Century](https://youtu.be/zxml8UQSwC0) and David Jamison mentioned that the +largest system we could today compute would be a system with about 30 +electrons. So although we know exactly how the equations of quantum mechanics +appear to be, and they've proven extremely successful, we must make +simplifications before we can predict how electrons behave in complicated +systems like the silicon lattice with approximately 0.7 trillion electrons per +cube micro meter. You can check the calculation + +$$ \left[\frac{1 \text{ }\mu\text{m}}{ 0.543\text{ nm}}\right]^3 \times 8 \text{ atoms per unit + cell} \times 14 \text{ electrons per atom}$$ + + +## Density of states + +To compute "how many Energy states are there per unit volume in the +conduction band", or the "density of states", we start with the three +dimensional Schrodinger equation for a free electron + +$$-\frac{\hbar^2}{2m}\nabla^2\psi = E\psi$$ + +I'm not going to repeat the computation here, but rather paraphrase the steps. +You can find the full derivation in [Solid State Electronic +Devices](https://www.amazon.com/Solid-State-Electronic-Devices-7th/dp/0133356035). + + +The derivation starts by computing the density of states in the k-space, or + momentum space, + +$$N(dk) = \frac{2}{(2 \pi)^p} dk$$ + +Where $p$ is the number of dimensions (in our case 3). + +Then uses the band structure $E(k)$ to convert to the density of states as a +function of energy $N(E)$. The simplest band structure, and a approxmiation of +the lowest conduction band is + +$$E(k) = \frac{\hbar^2 k^2}{2 m^*}$$ + +where $m^*$ is the effective mass of the particle. It is within this effective +mass that we "hide" the complexity of the actual three-dimensional crystal +structure of silicon. + +The effective mass when we compute the density of states is + +$$m^* = \frac{\hbar^2}{\frac{d^2 E}{dk^2}}$$ + +as such, the effective mass depends on the localized band structure of the +silicon unit cell, and depends on direction of movement, strain of the silicon +lattice, and probably other things. + +In 3D, once we use the above equations, one can compute that the density of +states per unit energy is + +$$N(E)dE = \frac{2}{\pi^2}\frac{m^*}{\hbar^2}^{3/2} E^{1/2}dE$$ + +In order to find the number of electrons, we need the probability of an electron +being in a quantum state, which is given by the [Fermi-Dirac +distribution](https://en.wikipedia.org/wiki/Fermi–Dirac_statistics) + +$$ + f(E) = \frac{1}{e^{(E - E_F)/kT} + 1} +\tag{2} +\label{eq:fm} +$$ + +where $E$ is the energy of the electron, $E_F$ is the [Fermi +level](https://en.wikipedia.org/wiki/Fermi_level) or checmical potential, +$k$ is Boltzmann's constant, and $T$ is the temperature in Kelvin. + +Fun fact, the Fermi level difference between two points is what you measure with a voltmeter. + +If the +$E -E_F > kT$, then we can start to ignore the $+1$ and the probability reduces +to + +$$ f(E) = \frac{1}{e^{(E-E_F)/kT}} = e^{(E_F - E)/kT}$$ + +A few observiation on the Fermi-Dirac distribution. If the Energy of a particle +is at the Fermi level, then $f(E) = \frac{1}{2}$, or a 50 % probability. + +In a metal, the Fermi level lies within a band, as the conduction +band and valence band overlap. As a result, there are a bunch of free electrons +that can move around. Metal does not have the same type of covalent bonds as +silicon, but electrons are shared between a large part of the metal structure. I would also assume that +the location of the Fermi level within the band structure explains the difference in +conductivity of metals, as it would determined how many electrons are free to +move. + +In an insulator, the Fermi level lies in the bandgap between valence band and +conduction band, and usually, the bandgap is large, so there is a +low probability of finding electrons in the conduction band. + +In a semiconductor we also have a bandgap, but much lower energy than an insulator. +If we have thermal equilibrium, no external forces, and +we have an un-doped (intrinsic) silicon semiconductor, then the fermi level $E_F$ lies half way between the +conduction band edge $E_C$ and the valence band edge $E_V$. + +The bandgap is defined +as the $E_C - E_V = E_g$, and we can use that to get +$E_F - E_C = E_C - E_g/2 - E_C= -E_g/2$. This is why the bandgap of silicon +keeps showing up in our diode equations. + +The number of electrons per delta energy will then be given by $N_e dE = N(E)f(E)dE$, which can be integrated to get + +$$ +n_e = 2\left( \frac{2 \pi m^\ast k T}{h^2}\right)^{3/2} e^{(E_F - E_C)/kT} +$$ + + +For intrinsic silicon at thermal equlibrium, we could write + +$$ +n_0 = 2\left( \frac{2 \pi m^\ast k T}{h^2}\right)^{3/2} e^{-E_g/(2kT)} +\tag{3} +\label{eq:nc0} +$$ + + +As we can see, Equation \eqref{eq:nc0} has the same coefficients and form as the +computation in Equation \eqref{eq:ni}. The +difference is that we also have to account for holes. At thermal equilibrium +and intrinsic silicon $n_i^2 = n_0 p_0$. + +## How to think about electrons (and holes) +I've come to the realization that to imagine electrons as balls moving around in +the silicon crystal is a bad mental image. + +For example, for a metal-oxide-semiconductor field effect transistor (MOSFET) it is not +the case that the electrons that form the inversion layer under strong inversion +come from somewhere else. They are already at the silicon surface, but they are +bound in covalent bonds (there are literaly trillions of bound electrons in a +typical transistor). + +What happens is that the applied voltage at the gate shifts the energy bands +close to the surface (or bends the bands in relation to the Fermi level), and the density of carriers in the +conduction band in that +location changes, according to the type of derivations above. + +Once the electrons are in the conduction band, then they follow the same +equations as diffusion of a gas, [Fick's law of +diffusion](https://en.wikipedia.org/wiki/Fick%27s_laws_of_diffusion). +Any charge concentration difference will give rise to a [diffusion +current](https://en.wikipedia.org/wiki/Diffusion_current) given by + +\begin{equation} +\tag{4} +\label{eq:diff} +J_{\text{diffusion}} = - qD_n \frac{\partial \rho}{\partial x} +\end{equation} + +where $J$ is the current density, $q$ is the charge, $\rho$ is the charge density, and $D$ is a diffusion +coefficient that through the [Einstein +relation](https://en.wikipedia.org/wiki/Diffusion_current) can be expressed as +$D = \mu k T$, where mobility $\mu = v_d/F$ is the ratio of drift velocity $v_d$ +to an applied force $F$. + +To make matters more complicated, an inversion layer of a MOSFET is not in three +dimensions, but rather a [two dimensional electron +gas](https://en.wikipedia.org/wiki/Two-dimensional_electron_gas), as the density of +states is confined to the silicon surface. As such, we should not expect the +mobility of bulk silicon to be the same as the mobility of a MOSFET transistor. + +# Doping + +We can change the property of silicon by introducing other elements, something +we've called [doping](https://en.wikipedia.org/wiki/Doping_(semiconductor)). +Phosphor has one more electron than silicon, Boron has one less +electron. Injecting these elements into the silicon crystal +lattice changes the number of free electron/holes. + +These days, we usually dope with [ion implantation](https://en.wikipedia.org/wiki/Ion_implantation), while in the olden days, +most doping was done by [diffusion](https://ieeexplore.ieee.org/document/1050758). You'd paint something containing Boron on the +silicon, and then heat it in a furnace to "diffuse" the Boron atoms into the +silicon. + +If we have an +element with more electrons we call it a donor, and the donor +concentration $N_{D}$. + +The main effect of doping is that it changes the location +of the Fermi level at thermal equilibirum. For donors, the Fermi level will +shift closer to the conduction band, and increase the probabilty of free +electrons, as determined by Equation \eqref{eq:fm}. + +Since the crystal now has an abundance of +free electrons, which have negative charge, we call it n-type. + +If the element has less electrons we call +it an acceptor, and the acceptor concentration $N_{A}$. Since the +crystal now has an abundance of free holes, we call it p-type. + +The doped material does not have a net charge, however, as it's the same number of +electrons and protons, so even though we dope silicon, it does remain neutral. + +The +doping concentrations are larger than the intrinsic carrier +concentration, from maybe $10^{21}$ to $10^{27}$ carriers/m$^{3}$. To +separate between these concentrations we use $p-,p,p+$ or $n-, n, n+$. + +The number of electrons and holes in a n-type material is + +$$ n_n = N_D \text{ , } p_n = \frac{n_i^2}{N_D} $$ + +and in a p-type material + +$$ p_p = N_A \text{ , } n_p = \frac{n_i^2}{N_A} $$ + + +In a p-type crystal there is a majority of holes, and a minority of +electrons. Thus we name holes majority carriers, and electrons minority +carriers. For n-type it's opposite. + +# PN junctions + +Imagine an n-type material, and a p-type material, both are neutral in +charge, because they have the same number of electrons and protons. Within both +materials there are free electrons, and free holes which move around +constantly. + +Now imagine we bring the two materials together, and we call where they meet the +junction. Some of the electrons +in the n-type will wander across the junction to the p-type material, and visa versa. +On the opposite side of the junction they might find an opposite charge, and might get locked in place. +They will become stuck. + +After a while, the diffusion of charges across the junction creates a depletion region with immobile +charges. Where as the two materials used to be neutrally charged, there +will now be a build up of negative charge on the p-side, and positive +charge on the n-side. + +## Built-in voltage + +The charge difference will create a field, and a built-in voltage will develop across the depletion +region. + +The density of free electrons in the conduction band is + +$$ +n = \int_{E_C}^{\infty} N(E) f(E) dE +$$ + +, where $N(E)$ is the density of states, and $f(E)$ is a probability of a +electron being in that state (Equation \eqref{eq:fm}). + +We could write the density of electrons on the n-side as + +$$ +n_n = e^{E_{F_n}/kT} \int_{E_C}^{\infty} N_n(E) e^{-E/kT}dE +$$ + +since the Fermi level is independent of the energy state of the electrons (I think). + +The density of electrons on the p-side could be written as + +$$ +n_p = e^{E_{F_p}/kT} \int_{E_C}^{\infty} N_p(E) e^{-E/kT}dE +$$ + +If we assume that the density of states, $N_n(E)$ and $N_p(E)$ are the same, and +the temperature is the same, then + +$$ +\frac{n_n}{n_p} = \frac{ e^{E_{F_n}/kT}}{e^{E_{F_p}/kT}} = e^{(E_{F_n} - E_{F_p})/kT} +$$ + +The difference in Fermi levels is the built-in voltage multiplied by the unit +charge. + +$$ +E_{F_n} - E_{F_p} = q\Phi +$$ + +and by substituting for the minority carrier concentration on the p-side we get + +$$\frac{N_A N_D}{n_i^2} = e^{q\Phi_0/kT}$$ + +or rearranged to + +$$\Phi_0 = \frac{kT}{q} ln\left( \frac{N_A N_D}{n_i^2} \right)$$ + +## Current + +The derivation of current is a bit involved, but let's try. + +The hole concentration on the p-side and n-side could be written as + +$$ +\frac{p_p}{p_n} = e^{-q\Phi_0/kT} +$$ + +The negative sign is because the built in voltage is positive on the n-type side + +Asssume that $-x_{p0}$ is the start of the junction on the p-side, and $x_{n0}$ +is the start of the junction on the n-side. + +Assume that we lift the p-side by a voltage $qV$ + +Then the hole concentration would change to + +$$ +\frac{p(-x_{p0})}{p(x_{n0})} = e^{q(V-\Phi_0)/kT} +$$ + +while on the n-side the hole concentration would be + +$$ +\frac{p(x_{n0})}{p_n} = e^{qV/kT} +$$ + +So the excess hole concentration on the n-side due to an increase of $V$ would +be + +$$ +\Delta p_n = p(x_{n0}) - p_n = p_n\left( e^{qV/kT} -1 \right) +$$ + +The diffusion current density, given by Equation \eqref{eq:diff} states + +$$ +J(x_n) = -q D_p \frac{\partial \rho}{\partial x} +$$ + +Thus we need to know the charge density as a function of $x$. I'm not sure why, +but apparently it's + +$$ +\partial \rho(x_n) = \Delta p_n e^{-x_n/L_p} +$$ + +where $L_p$ is a diffusion length. This equation smells to me like a simplified +model of reality, I'm not sure how much it's based on fundamental physics. + +Anyhow, we can now compute the current density, and need only compute it for +$x_n$ = 0, so you can show it's + +$$ +J(0) = q\frac{D_p}{L_p} p_n \left( e^{qV/kT} - 1\right) +$$ + +which start's to look like the normal diode equation. The $p_n$ is the minority +concentration of holes on the n-side, which we've before estimated as $p_n = +\frac{n_i^2}{N_D}$ + +We've only computed for holes, but there will be electron transport from the +p-side to the n-side also. + +We also need to multiply by the area of the diode to get current from current +density. The full equation thus becomes + +$$ +I = q A n_i^2 \left( \frac{1}{N_A}\frac{D_n}{L_n} + \frac{1}{N_D}\frac{D_p}{L_p} +\right)\left[ e^{qV/kT} - 1 \right] +$$ + +where $A$ is the area of the diode, $D_n$,$D_p$ is the diffusion coefficient of electrons +and holes and $L_n$,$L_p$ is the diffusion length of electrons and holes. + +Which we usually write as + +$$ I_D = I_S(e^{\frac{V_D}{V_T}} - 1 ),\text{ where } V_T = kT/q $$ + + + +## Forward voltage temperature dependence + +We can rearrange $I_D$ equation to get + +$$ V_D = V_T \ln\left(\frac{I_D}{I_S}\right) $$ + +and at first glance, it appears like $V_D$ has a positive temperature +coefficient. That is, however, wrong. + +First rewrite + +$$ V_D = V_T \ln{I_D} - V_T \ln{I_S} $$ + +$$ \ln{I_S} = 2 \ln{n_i} + \ln{Aq\left (\frac{D_n}{L_n N_A} + +\frac{D_p}{L_p N_D}\right)} $$ + +Assume that diffusion coefficient [^3], and diffusion lengths are independent of +temperature. + +That leaves $n_i$ that varies with temperature. + +$$ n_i = \sqrt{B_c B_v} T^{3/2} e^\frac{-E_g}{2 kT} $$ + +where + +$$ B_c = 2 \left[\frac{2 \pi k m_n^*}{h^2}\right]^{3/2} \text{ } B_v = 2 \left[\frac{2 \pi k m_p^*}{h^2}\right]^{3/2} $$ + + + +$$ 2 \ln{n_i} = 2\ln{\sqrt{B_c B_v}} + 3 \ln T - +\frac{V_G}{V_T}$$ + +with $V_G = E_G/q$ and inserting back into equation for $V_D$ + +$$ V_D = \frac{kT}{q}(\ell - 3 \ln T) + V_G $$ + + +Where $\ell$ is temperature independent, and given by + +$$ \ell= \ln{I_D} - \ln{\left (Aq\frac{D_n}{L_n N_A} + +\frac{D_p}{L_p N_D}\right)} - 2 \ln{\sqrt{B_c B_v}} $$ + + +From equations above we can see that at 0 K, we expect the diode voltage to be +equal to the bandgap of silicon. Diodes don't work at 0 K though. + +Although it's not trivial to see that the diode +voltage has a negative temperature coefficient, if you do compute it as in +[vd.py](https://github.com/wulffern/memos/blob/main/2021-07-08_diodes/vd.py), then you'll see it decreases. + +The slope of the diode voltage can be seen to depend on the area, the current, +doping, diffusion constant, diffusion length and the effective masses. + +Figure 3 shows the $V_D$ and the deviation of $V_D$ from a straight line. The +non-linear component of $V_D$ is only a few mV. If we could combine $V_D$ with a +voltage that increased with temperature, then we could get a stable voltage +across temperature to within a few mV. + + +![Diode forward voltage as a function of temperature \label{fig:vd}](../media/vd.pdf) + + + +## Current proportional to temperature + +Assume we have a circuit like Figure 4. + +Here we have two diodes, biased at different current densities. The voltage on +the left diode $V_{D1}$ is equal to the sum of the voltage on the right diode $V_{D2}$ and voltage +across the resistor $R_1$. The current in the two diodes are the same due to +the current mirror. A such, we have that + +$$ I_S e^\frac{qV_{D1}}{kT} = N I_S e^\frac{qV_{D2}}{kT} $$ + +Taking logarithm of both sides, and rearranging, we see that + +$$ V_{D1} - V_{D2} = \frac{kT}{q}\ln{N}$$ + +Or that the difference between two diode voltages biased at different current densities is proportional to absolute +temperature. + +In the circuit above, this $\Delta V_D$ is across the resistor +$R_1$, as such, the $I_D = \Delta V_D/R_1$. We have a current that is +proportional to temperature. + +If we copied the current, and sent it into a series combination of a resistor +$R_2$ and a diode, we could scale the $R_2$ value to give us the exactly right +slope to compensate for the negative slope of the $V_D$ voltage. + +The voltage across the resistor and diode would be constant over temperature, +with the small exception of the non-linear component of $V_D$. + +![Circuit to generate a current proportional to kT\label{fig:ptat}](../media/l3_ptat.pdf) + + + + + + +# Equations aren't real + +> Nature does not care about equations. It just is. + +We know, at the fundamental +level, nature appears to obey the mathematics on quantum mechanics, however, due to +the complexity of nature, it's not possible today (which is not the same as +impossible), to compute exactly how the current in a diode works. We can get +close, by measuring a diode we know well, and hope that the next time we make +the same diode, the behavior will be the same. + +As such, I want to warn you about the "lies" or "simplifications" we tell you. Take the +diode equation above, some parts, like the intrinsic carrier concentration $n_i$ +has roots directly from quantum mechanics, with few simplifications, which means +it's likely solid truth, at least for a single unit cell. + +But there is no reason +nature should make all unit cells the same, and infact, we know they are not the +same, we put in dopants. As we scale down to a few nano-meter transistors the simplification +that "all unit cells of silicon are the same, and extend to infinity" is no +longer true, and must be taken into account in how we describe reality. + +Other parts, like the exact value of the bandgap $E_g$, the diffusion constant +$D_p$ or diffusion length $L_p$ are macroscopic phenomena, we can't +expect them to be $100%$ true. The values would be based on measurement, but not +always exact, and maybe, if you rotate your diode, they would be different. + +You should realize that the consequence of our imperfection is that the equations in +electronics should always be taken with a grain of salt. + +Nature does not care about your equations. Nature will easily have the +superposition of trillions of electrons, and they don't have to +agree with your equations. + +But most of the time, the behavior is similar. + + +[^1]: It doesn't stop being magic just because you know how it works. Terry Pratchett, The Wee Free Men +[^2]: Simplify as much as possible, but no more. Einstein +[^3]: From the Einstein relation $D = \mu k T$ it does appear that the diffusion coefficient increases with temperature, however, the mobility decreases with temperature. I'm unsure of whether the mobility decreases with the same rate though. + diff --git a/lectures/l00_need_to_know.md b/lectures/l00_need_to_know.md new file mode 100644 index 0000000..194162f --- /dev/null +++ b/lectures/l00_need_to_know.md @@ -0,0 +1,2060 @@ +footer: Carsten Wulff 2022 +slidenumbers:true +autoscale:true +theme: Plain Jane, 1 +text: Helvetica +header: Helvetica + + + +## TFE4188 - Lecture 1 +# What I expect you to know + +## [Source](https://github.com/wulffern/aic2022/blob/main/lectures/l1_need_to_know.md) + +--- + + + + + +#[fit] Quantum Mechanics + +--- +# Want to go deeper on the physics + +[Feynman lectures on physics](https://www.feynmanlectures.caltech.edu) + +[MIT 8.04 Quantum Mechanics I](https://ocw.mit.edu/courses/physics/8-04-quantum-physics-i-spring-2013/lecture-videos/) + +[MIT 8.05 Quantum Mechanics II](https://ocw.mit.edu/courses/physics/8-04-quantum-physics-i-spring-2013/lecture-videos/) + +--- + +![inline](../media/Standard_Model_of_Elementary_Particles_Anti.pdf) + +--- + +## Classical equations +Kinetic energy + potential energy = Total Energy + +$$\frac{1}{2 m} p^2 + V = E$$ + +where $$ p = m v $$, $$m$$ is the mass, $$v$$ is the velocity and $$V$$ is the potential + +--- + +## Quantum mechanical + +State of a fermion is fully described by the probability amplitude $$\psi(x,t)$$, also called the wave function of a particle. + +The total energy of a particle is described by the Schrodinger Equation + +$$ \frac{1}{2 m} \frac{\hbar}{j^2} \frac{\partial^2}{\partial^2 x}\psi(x,t) + V(x)\psi(x,t) = -\frac{\hbar}{j}\frac{\partial}{\partial t} \psi(x,t)$$ + +--- +## Quantum mechanics key concepts + +To determine the moment or energy of multiple particles, you cannot consider them discrete entities. For example, the probabilty of finding a free electron in a particular location is given by + +$$P_1(x) = \int_{x_1}^{x_2} |\psi_1(x,0)|^2$$, where $$P_1 = \int_{-\infty}^{\infty} |\psi_1(x,0)| = 1$$ + + +However, if we have two electrons, described by $$\psi_1(x,0)$$ and $$\psi_2(x,0)$$, then $$P_{12}(x) \ne P_1(x) + P_2(x)$$, but rather $$P_{12}(x) = \int_{x_1}^{x_2} |\psi_1(x,0) + \psi_2(x,0)|^2$$ + +It is the probability amplitudes that add, not the probabilities. And to make things more interesting, one solution to the Schrodinger equation is $$\psi(x,t) = Ae^{j(kx - \omega t)}$$, where $$k$$ is the wave number, and the $$\omega$$ is the angular frequency. This is a complex function of position and time! + +--- +# Silicon crystal + +[.column] +A pure silicon crystal can be visualized by a smallest repetable unit cell. + +The unit cell is a face-centered cubic crystal with a lattice spacing of approx $$a = 5.43$$Å + +- 8 corner atoms +- 6 face atoms +- 4 additional atoms spaced at 1/4 lattice spacing from 3 face atoms and 1 corner atom + +Nearest neighbor $$d = \frac{1}{2}\left(a \sqrt{2}\right)$$ + +[.column] +![fit](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Silicon-unit-cell-3D-balls.png/628px-Silicon-unit-cell-3D-balls.png) + +--- +## Energy levels of electrons in solids (current) + +Electrons can only exist in discrete energy levels, given by the solutions to the Schrodinger equation. +Since the probability amplitudes add for electrons in close proximity, then for crystals it's more complicated. + +![inline](https://www.researchgate.net/profile/Arnab-Pariari/publication/333131266/figure/fig1/AS:759043060682752@1557981376301/A-schematic-diagram-to-show-the-discrete-energy-levels-of-an-isolated-atom-and-energy.jpg) + +--- +## Movement of electrons in solids + +Electrons in solids can move if there are allowed energy states they can occupy. + +In a semiconductor the valence band and first conduction band is separated by a band-gap (in conductors the bands overlap) + +There are two options in semiconductors + +- The valence band is not filled (holes), so electrons can move +- The electrons are given sufficient energy to reach conduction band, and are "free" to move + +--- +# Silicon crystal facts + +Although we know to an exterme precision exactly how electrons behave (Schrodinger equation). It is insainly complicated to compute the movement of electrons in a real silicon crystal with the Shrodinger equation. + +Most "facts" about silicon crystal, like bandgap, effective mass, and mobility of electrons (or holes) are emprically determined. + +In other words, we make assumptions, and grossly oversimplify, in order to handle complexity. + +--- + +#[fit] PN Junctions + +--- +$$ +q = 1.6 \times 10^{-19} [C] +$$ +$$ +k = 1.38 \times 10^{-23} [J/K] +$$ + +$$ +\mu_0 = \frac{2 \alpha}{q^2}\frac{h}{c} = 1.26 \times 10^{-6} [H/m] +$$ + +$$ +\epsilon_0 = \frac{1}{\mu_0 c^2} = 8.854 \times 10^{-12} [F/m] +$$ + +where q is unit charge, k is Boltzmann's constant, h is Plancks constant, c is speed of light and alpha is the fine structure constant + +--- + +# Computer models + +[http://bsim.berkeley.edu/models/bsim4/](http://bsim.berkeley.edu/models/bsim4/) + +[http://bsim.berkeley.edu/BSIM4/BSIM480.zip](http://bsim.berkeley.edu/BSIM4/BSIM480.zip) + + +--- + +$$ n_i \approx 1 \times 10^{16} [1/m^3] = 1 \times 10^{10} [1/cm^3]$$ at 300 K + +$$ n_i^2 = n_0 p_0 $$ + +$$ n_i = \sqrt{N_C N_V}e^{\frac{-E_g}{2kT}} $$ + +$$ N_C = 2\left(\frac{2 \pi m_{n}^* k T}{h^2}\right)^{3/2} $$ +$$ N_V = 2\left(\frac{2 \pi m_{p}^* k T}{h^2}\right)^{3/2} $$ + + + +[https://github.com/wulffern/dic2021/blob/main/2021-07-08_diodes/intrinsic.py](https://github.com/wulffern/dic2021/blob/main/2021-07-08_diodes/intrinsic.py) + +![right fit](../media/intrinsic.png) + +--- + +Solid state physics: + +$$ n_i = \sqrt{N_C N_V}e^{\frac{-E_g}{2kT}} $$ + +BSIM 4.8, Intrinsic carrier concentration (page 122) + +$$ +n_i = 1.45e10\frac{TNOM}{300.15}\sqrt{\frac{T}{300.15}}exp\left[21.5565981 - \frac{qE_g(TNOM)}{2 k_b T}\right] +$$ + +--- + +![fit](https://upload.wikimedia.org/wikipedia/commons/thumb/0/03/Simple_Periodic_Table_Chart-blocks.svg/1280px-Simple_Periodic_Table_Chart-blocks.svg.png) + +--- + +![fit](../media/pn.pdf) + +--- + +[.column] + +# Built in voltage + +Comes from Fermi-Dirac statistics + +$$ \frac{n_n}{n_p} = \frac{e^{(E_{p} - \mu) / kT} + 1}{e^{(E_{n} - \mu) / +kT} + 1} \approx e^{\frac{q \Phi_0}{kT}} $$ + +where $$ q \Phi_0 $$ is the energy ($$E_{p} - E_{n}$$) required to climb the potential barrier, $$ +kT $$ is the thermal energy, $$\mu$$ is the total chemical potential and $$n_n$$ and $$n_p$$ are the electron concentrations in the n-type and p-type. + +[.column] + +$$\Phi_0 = V_T ln\left(\frac{N_A N_D}{n_i^2}\right)$$ + +$$ V_T = \frac{kT}{q}$$ + +--- + +#[fit] $$ I_{diode} = I_s (e^{V_D/V_T} -1) $$ + +--- + +#[fit] Sesame + +--- + +Sesame is a Python3 package for solving the drift diffusion Poisson equations for multi-dimensional systems using finite differences. + +[Install instructions](https://sesame.readthedocs.io/en/latest/pre/INSTALL_beginner.html) + + + +Semiconductor current-flow equations (diffusion and degeneracy), R.Stratton, +IEEE Transactions on Electron Devices +[https://ieeexplore.ieee.org/document/1477063](https://ieeexplore.ieee.org/document/1477063) + +![right fit](../media/current_flow.png) + +--- + +![fit](../media/sesame_setup.png) + +--- + +![fit](../media/sesame_sim.png) + +--- + +![fit](../media/sesame_result.png) + +--- + +#[fit] Mosfets + +--- + +[.column] + +NMOS conduct for positive gate-to-source voltage + +![inline](../media/fig_nmos.pdf) + +[.column] + +PMOS conduct for negative gate-to-source voltage + +![inline](../media/fig_pmos.pdf) + +--- + +![inline 100%](../media/3dcross.pdf) + +--- + +# Drain Source Current ($$I_{DS}$$) + +### dicex/sim/spice/NCHIO + +--- +# Large signal model + +## $$I_{DS} = f(V_{GS},V_{DS},...)$$ + +![right fit](../media/large_signal.pdf) + +--- + +#[fit] Gate Source Voltage ($$V_{GS}$$) + +--- + +# Gate-source voltage + +| Param | Voltage [V]| +| :---:| :---:| +| VGS | 0 to 1.8 | +| VDS | 1.0 | +| VS | 0 | +| VB | 0 | + +$$i(vcur) = I_{DS} $$ + +![right fit](../media/vgate.pdf) + +--- +# Inversion level + +Define $$ V_{eff} \equiv V_{GS} - V_{tn} $$, where $$V_{tn}$$ is the "threshold voltage" + +| Veff | Inversion level | +| :---: | :---: | +| < 0 | weak inversion or subthreshold | +| 0 | moderate inversion | +| > 100 mV | strong inversion| + +![right fit](../media/vgate.pdf) + +--- + +# Weak inversion + +The drain current is low, but not zero, when $$ V_{eff} << 0$$ + +$$ +I_{DS} \approx I_{D0} \frac{W}{L} e^{V_{eff}/n V_{T}} \text{ if } V_{DS} > 3 V_{T} +$$ + +$$ +n \approx 1.5 +$$ + +![right fit](../media/vgate.pdf) + +--- +# Moderate inversion + +Very useful region in real designs. Hard for hand-calculation. Trust the model. + +![right fit](../media/vgate.pdf) + +--- + +# Strong inversion + +$$ +I_{DS} = \mu_n C_{ox} \frac{W}{L} +\begin{cases} +V_{eff} V_{DS} & \text{if }V_{DS} << V_{eff} \\[15pt] +V_{eff} V_{DS} - V_{DS}^2/2 +& \text{if } V_{DS} < V_{eff} \\[15pt] +\frac{1}{2} V_{eff}^2 +& \text{if } V_{DS} > V_{eff} \\[15pt] +\end{cases} +$$ + +![right fit](../media/vgate.pdf) + +--- + +![inline 130%](../media/accumulated.pdf) + +--- + + +![inline 130%](../media/depleted.pdf) + +--- + +![inline 130%](../media/weakinv.pdf) + +--- + +![inline 130%](../media/inversion.pdf) + +--- + +# The threshold voltage ($$ V_{tn} $$) is defined as $$ p_p = n_{ch} $$ + +--- + +# Drain-source voltage + +| Param | Voltage [V]| +| :---:| :---:| +| VGS | 0.5 | +| VDS | 0 to 1.8 | +| VS | 0 | +| VB | 0 | + +$$i(vcur) = I_{DS} $$ + +![right fit](../media/vdrain.pdf) + +--- + +# Strong inversion + +$$ +I_{DS} = \mu_n C_{ox} \frac{W}{L} +\begin{cases} +V_{eff} V_{DS} & \text{if }V_{DS} << V_{eff} \\[15pt] +V_{eff} V_{DS} - V_{DS}^2/2 +& \text{if } V_{DS} < V_{eff} \\[15pt] +\frac{1}{2} V_{eff}^2 +& \text{if } V_{DS} > V_{eff} \\[15pt] +\end{cases} +$$ + +![right fit](../media/vdrain.pdf) + +--- + +![inline 130%](../media/vds_l_veff.pdf) + +--- + +![inline 130%](../media/vds_veff.pdf) + +--- + +![inline 130%](../media/vds_h_veff.pdf) + +--- + +![original 80%](../media/drain_close.pdf) + +--- + +#[fit] Low frequency model + +--- + +## $$ g_{m} = \frac{\partial I_{DS}}{\partial V_{GS}}\ $$ + +## $$ g_{ds} = \frac{1}{r_{ds}} = \frac{\partial I_{DS}}{\partial V_{DS}}\ $$ + + +![right fit](../media/small_signal.pdf) + +--- +## Transconductance ($$ g_m $$) +[.column] + +Define $$ \ell = \mu_n C_{ox} \frac{W}{L} $$ and $$ V_{eff} = V_{GS} - V_{tn} $$ + + $$ I_{D} = \frac{1}{2} \ell (V_{eff})^2$$ and $$ V_{eff} = \sqrt{\frac{2I_{D}}{\ell}} $$ and $$ \ell = \frac{2I_D}{V_{eff}^2} $$ + + $$ g_m = \frac{ \partial I_{DS}} {\partial V_{GS}} = \ell V_{eff} = \sqrt{2 \ell I_{D}} $$ + + $$ g_m = \ell V_{eff} = 2 \frac{I_D}{V_{eff}^2} V_{eff} = \frac{2 I_D}{V_{eff}} $$ + +[.column] +--- + +Define $$ \ell = \mu_n C_{ox} \frac{W}{L} $$ and $$ V_{eff} = V_{GS} - V_{tn} $$ + + $$ I_D = \frac{1}{2} \ell V_{eff}^2[1 + \lambda V_{DS} - \lambda V_{eff})] $$ + + $$\frac{1}{r_{ds}} = g_{ds} = \frac{ \partial I_D}{\partial V_{DS} } = \lambda \frac{1}{2} \ell V_{eff}^2$$ + + Assume channel length modulation is not there, then + + $$I_D = \frac{1}{2} \ell V_{eff}^2 $$ which means $$\frac{1}{r_{ds}} = g_{ds} \approx \lambda I_D $$ + +--- + +# Intrinsic gain + +Define intrinsic gain as + + $$ A = \left|\frac{v_{out}}{v_{in}}\right| = g_m r_{ds} = \frac{g_m}{g_{ds}} $$ + + $$ A = \frac{2 I_D}{V_{eff}} \times \frac{1}{ \lambda I_D } = \frac{2}{\lambda V_{eff}} $$ + +![right fit](../media/vgaini.pdf) + + + +vgaini = Gate Source Voltage = $$V_{eff} + V_{tn} $$ + +--- + +![original fit](../media/small_signal_w_gs.pdf) + +--- + +#[fit] High frequency model + +--- + + +![inline fit](../media/hfmodel.pdf) + +--- + +![inline fit](../media/caps.pdf) + +--- +# $$C_{gs} $$ and $$C_{gd}$$ + +[.column] + +$$ +C_{gs} = +\begin{cases} +WLC_{ox} & \text{if }V_{DS} = 0 \\[15pt] +\frac{2}{3}WLC_{ox} & \text{if }V_{DS} > V_{eff} \\[15pt] +\end{cases} +$$ + +[.column] + +$$ C_{gd} = C_{ox} W L_{ov} $$ + +--- + +# $$C_{sb}$$ and $$C_{db}$$ + +Both are depletion capacitances + +[.column] +$$ C_{sb} = (A_s + A_{ch}) C_{js} $$ + +$$ C_{js} = \frac{C_{j0}}{\sqrt{1 + \frac{V_{SB}}{\Phi_0}}} $$ + +$$\Phi_0 = V_T ln\left(\frac{N_A N_D}{n_i^2}\right)$$ + +[.column] + +$$ C_{db} = A_d C_{jd} $$ + +$$ C_{js} = \frac{C_{j0}}{\sqrt{1 + \frac{V_{DB}}{\Phi_0}}} $$ + +--- + +### Be careful with $$ C_{gd} $$ (blame Miller) + +[.column] + +If $$ Y(s) = 1/sC $$ then + $$Y_1(s) = 1/sC_{in} $$ and $$Y_2(s) = 1/sC_{out}$$ where + $$ C_{in} = (1 + A) C $$, $$ C_{out} = (1 + \frac{1}{2})C $$ + + $$ C_{1} = C_{gd} g_{m} r_{ds} $$ + +**$$C_{gd}$$ can appear to be 10 to 100 times larger!** + + if gain from input to output is large + + +[.column] + +![inline fit](../media/miller.pdf) + +--- + +#[fit] Weak inversion +# or subthreshold + +--- + +If $$ V_{eff} < 0 $$ diffusion currents dominate. + + $$ I_{D} = I_{D0} \frac{W}{L} e^{V_eff / n V_T} $$, where + + $$ V_T = kT/q $$, $$n = (C_{ox} + C_{j0})/C_{ox}$$ + + $$ I_{D0} = (n - 1) \mu_n C_{ox} V_T^2 $$ + + $$ g_m = \frac{I_D}{nV_T} $$ + +![right fit](../media/weakinv.pdf) + +--- +# $$ g_m/I_D $$ or "bang for the buck" + + Subthreshold: + + $$ \frac{g_m}{I_D} = \frac{1}{nV_T} \approx 25.6 \text{ [S/A] @ 300 K} $$ + + Strong inversion: + + $$ \frac{g_m}{I_D} = \frac{2}{V_{eff}}$$ + +![right fit](../media/vgmid.pdf) + +--- + +#[fit] Velocity saturation + +--- + +[.column] + +Electron speed limit in silicon + + $$ v \approx 10^7 cm/s $$ + + $$ v = \mu_n E = \mu_n \frac{dV}{dx} $$ + + $$ \mu_n \approx 100 \text{ to } 600 \text{ } cm^2/Vs $$ in nanoscale CMOS + +[.column] + +![right fit](../media/l5_velocity.pdf) + +--- + +[.column] + +## Square law model + + $$ Q(x) = C_{ox}\left[V_{eff} - V(x)\right] $$ + + $$ v = \mu_n E = \mu_n \frac{dV}{dx} $$ + + $$ \ell = \mu_n C_{ox} \frac{W}{L} $$ + + $$ I_{D} = W Q(x) v = \ell L \left[ V_{eff} - V(x)\right] \frac{dV}{dx} $$ + + $$ I_{D} dx = \ell L \left[ V_{eff} - V(x)\right] dV $$ + +[.column] + + $$ I_{D} \int_0^L{dx} = \ell L \int_0^{V_{DS}}{\left[ V_{eff} - V(x)\right] dV} $$ + + $$ I_{D} \left[x\right]_0^L = \ell L \left[V_{eff}V - \frac{1}{2}V^2\right]_0^{V_{DS}} $$ + + $$ I_{D} L = \ell L \left[V_{eff}V_{DS} - \frac{1}{2} V_{DS}^2\right] $$ + + $$ @ V_{DS} = V_{eff} \Rightarrow I_{D} = \frac{1}{2} \ell V_{eff}^2 $$ + +--- + + +[.column] + +## Mobility Degredation + +Multiple effects degrade mobility + +- Velocity saturation +- Vertical fields reduce channel depth => more charge-carrier scattering + + $$ \ell = \mu_n C_{ox} \frac{W}{L} $$ + +[.column] + + + $$ \mu_{n\_eff} = \frac{\mu_n}{([1 + (\theta V_{eff})^m])^{1/m}} $$ + + $$ I_{D} = \frac{1}{2} \ell V_{eff}^2 \frac{1}{([1 + (\theta V_{eff})^m])^{1/m}} $$ + +From square law +$$ g_{m} = \frac{\partial I_{D}}{\partial V_{GS}} = \ell V_{eff} $$ + +With mobility degredation +$$ g_{m(mob-deg)} = \frac{\ell}{2 \theta} $$ + +--- + +#[fit] What about holes (PMOS) + +--- + +[.column] + +In PMOS holes are the charge-carrier (electron movement in valence band) + + $$ \mu_p < \mu_n $$ + +In intrinsic silicon: + $$ \mu_n \leq 1400 [cm^2/Vs] = 0.14 [m^2/Vs] $$ + $$ \mu_p \leq 450 [cm^2/Vs] = 0.045 [m^2/Vs] $$ + + $$ \mu_n \approx 3\mu_p $$ + +[.column] + + $$ v_{n\_max} \approx 2.3 \times 10^5 [m/s] $$ + $$ v_{p\_max} \approx 1.6 \times 10^5 [m/s] $$ + + + **Doping ($$N_A \text{or} N_D$$) reduces $$\mu $$** + +--- + +#[fit] OTHER + +--- + +# As we make transistors smaller, we find new effects that matter, and that must be modelled. + +### which is an opportunity for engineers to come up with cool names + +--- + +![original fit](../media/aicdn_front.png) + +[https://ieeexplore.ieee.org/document/5247174](https://ieeexplore.ieee.org/document/5247174 ) + +--- + +![original fit](../media/aicdn.pdf) + +--- + +#[fit] Drain induced barrier lowering (DIBL) + +--- + +![original fit](../media/dibl.pdf) + + +--- + +#[fit] Well Proximity Effect (WPE) + +--- + +![original fit](../media/wpe.pdf) + + +--- + +#[fit] Stress effects + +--- + +| Stress | PMOS | NMOS | +| :--: | :--: | :---:| +| Stretch Fz | Good | Good | +| Compress Fy | OK | Good | +| Compress Fx | Good | Bad | + +## What can change stress? + +![right fit](../media/stress.pdf) + +--- + + +#[fit] Gate current + +--- + +![original fit](../media/gateleakage.pdf) + +--- + +#[fit] Hot carrier injection + +--- + +![original 80%](../media/hci.pdf) + +--- + +#[fit] Channel initiated secondary-electron (CHISEL) + +--- + +![original 80%](../media/chisel.pdf) + +--- + +#[fit] Variability + +--- + +#[fit] Provide $$I_2 = 1 \mu A $$ + +Let's use off-chip resistor $$R$$, and pick $$R$$ such that $$I_1 = 1 \mu A $$ + +Use $$ \frac{W_1}{L_1} = \frac{W_2}{L_2} $$ + +**What makes $$ I_2 \ne 1 \mu A $$?** + +![right 200%](../media/fig_l8_cmsys.pdf) + +--- + +## Voltage variation + +## Systematic variations + +## Process variations + +## Temperature variation + +## Random variations + +## Noise + + +![right 200%](../media/fig_l8_cmsys.pdf) + +--- +#[fit] Voltage variation + + $$I_1 = \frac{V_{DD} - V_{GS1}}{R}$$ + + +If $$V_{DD}$$ changes, then current changes. + +**Fix**: Keep $$V_{DD}$$ constant + + +![right 200%](../media/fig_l8_cmsys.pdf) + +--- + + +# Systematic variations + +If $$ V_{DS1} \ne V_{DS2} \rightarrow I_1 \ne I_2 $$ + +If layout direction of $$ M_1 \ne M_2 \rightarrow I_1 \ne I_2 $$ + +If current direction of $$ M_1 \ne M_2 \rightarrow I_1 \ne I_2 $$ + +If $$ V_{S1} \ne V_{S2} \rightarrow I_1 \ne I_2 $$ + +If $$ V_{B1} \ne V_{B2} \rightarrow I_1 \ne I_2 $$ + +If $$ WPE_{1} \ne WPE_{2} \rightarrow I_1 \ne I_2 $$ + +If $$ Stress_{1} \ne Stress_{2} \rightarrow I_1 \ne I_2 $$ +... + +![right 200%](../media/fig_l8_cmsys.pdf) + +--- +# Process variations + +Assume strong inversion and active **$$ V_{eff} = \sqrt{\frac{2}{\mu_p C_{ox} \frac{W}{L}} I_1} $$**, $$V_{GS} = V_{eff} + V_{tp}$$ + + $$ I_1 = \frac{V_{DD} - V_{GS}}{R} = \frac{V_{DD} - \sqrt{\frac{2}{\mu_p C_{ox} \frac{W}{L}} I_1} - V_{tp}}{R} $$ + + $$\mu_p$$, $$C_{ox}$$, $$V_{tp}$$ will all vary from die to die, and wafer lot to wafer lot. + +![right 200%](../media/fig_l8_cmsys.pdf) + +--- +# Process corners + +Common to use 5 corners, or [Monte-Carlo](https://en.wikipedia.org/wiki/Monte_Carlo_method) process simulation + +| Corner | NMOS | PMOS | +| :---: | :---: | :---: | +| Mtt | Typical | Typical| +| Mss | Slow | Slow| +| Mff | Fast | Fast | +| Msf | Slowish | Fastish | +| Mfs | Fastish | Slowish | + + +![right 200%](../media/fig_l8_cmsys.pdf) + +--- +# Fix process variation + +Use calibration: measure error, tune circuit to fix error + +For every single chip, measure voltage across known resistor $$R_1$$ and tune $$R_{var}$$ such that we get $$I_1 = 1 \mu A$$ + +Be careful with multimeters, they have finite input resistance (approximately 1 M$$\Omega$$) + +![right 150%](../media/fig_l8_cmfixproc.pdf) + +--- + +# Temperature variation + +Mobility decreases with temperature + +Threshold voltage decreases with temperature. + +$$ I_D = \frac{1}{2}\mu_n C_{ox} (V_{GS} - V_{tn})^2$$ + +High $$I_D = $$ fast digital circuits + +Low $$I_D = $$ slow digital circuits + +**What is fast? High temperature or low temperature?** + +![right 150%](../media/fig_l8_cmfixproc.pdf) + +--- +# It depends on $$V_{DD}$$ + +**Fast corner** +- Mff (high mobility, low threshold voltage) +- High $$V_{DD}$$ +- High or low temperature + + +**Slow corner** +- Mss (low mobility, high threshold voltage) +- Low $$V_{DD}$$ +- High or low temperature + +![right 150%](../media/fig_l8_cmfixproc.pdf) + +--- +# How do we fix temperature variation? + +Accept it, or don't use this circuit. + +If you need stability over temperature, use 7.3.2 and 7.3.4 in CJM (SUN\_BIAS\_GF130N) + +![right 150%](../media/fig_l8_cmfixproc.pdf) + +--- + +#[fit] Random Variation + +--- +[.background-color: #000000] +[.text: #FFFFFF] + +[.column] + +[Mean](https://en.wikipedia.org/wiki/Mean) +$$ \overline{x(t)} = \lim_{T\to\infty} \frac{1}{T}\int^{+T/2}_{-T/2}{ x(t) dt} $$ + +Mean Square +$$ \overline{x^2(t)} = \lim_{T\to\infty} \frac{1}{T}\int^{+T/2}_{-T/2}{ x^2(t) dt} $$ + +[Variance](https://en.wikipedia.org/wiki/Variance) +$$ \sigma^2 = \overline{x^2(t)} - \overline{x(t)}^2$$ + +where $$\sigma$$ is the standard deviation. +If mean is removed, or is zero, then +$$ \sigma^2 = \overline{x^2(t)} $$ + +[.column] +Assume two random processes, $$x_1(t)$$ and $$x_2(t)$$ with mean of zero (or removed). + $$ x_{tot}(t) = x_1(t) + x_2(t)$$ + $$ x_{tot}^2(t) = x_1^2(t) + x_2^2(t) + 2x_1(t)x_2(t)$$ + +Variance (assuming mean of zero) +$$ \sigma^2_{tot} = \lim_{T\to\infty} \frac{1}{T}\int^{+T/2}_{-T/2}{ x_{tot}^2(t) dt} $$ +$$ \sigma^2_{tot} = \sigma_1^2 + \sigma_2^2 + \lim_{T\to\infty} \frac{1}{T}\int^{+T/2}_{-T/2}{ 2x_1(t)x_2(t) dt} $$ + +**Assuming uncorrelated processes (covariance is zero), then +$$ \sigma^2_{tot} = \sigma_1^2 + \sigma_2^2 $$** + +--- + + $$\ell = \mu_p C_{ox} \frac{W}{L}$$ + $$ I_D = \frac{1}{2} \ell (V_{GS} - V_{tp})^2$$ + + Due to doping , length, width, $$C_{ox}$$, $$V_{tp}$$, ... random varation + + $$\ell_1 \ne \ell_2$$ + + $$V_{tp1} \ne V_{tp2} $$ + +As a result $$ I_1 \ne I_2 $$, but we can make them close. + +--- +# Pelgrom's[^1] law + +Given a random gaussian process parameter $$\Delta P$$ with zero mean, the variance is given by + +$$\sigma^2 (\Delta P) = \frac{A^2_P}{WL} + S_{P}^2 D^2$$ + +where $$A_P$$ and $$S_P$$ are measured, and $$D$$ is the distance between devices + +Assume closely spaced devices ($$ D \approx 0$$) $$ \Rightarrow \sigma^2 (\Delta P) = \frac{A^2_P}{WL} $$ + + +[^1]: M. J. M. Pelgrom, C. J. Duinmaijer, and A. P. G. Welbers, “Matching properties of MOS transistors,” IEEE J. Solid-State Cir- cuits, vol. 24, no. 5, pp. 1433–1440, Oct. 1989. + +--- + +# Transistors with same $$V_{GS}$$[^2] + +$$\frac{\sigma_{I_D}^2}{I_D^2} = \frac{1}{WL}\left[\left(\frac{gm}{I_D}\right)^2 \sigma_{vt}^2 + \frac{\sigma_{\ell}^2}{\ell}\right] $$ + +Valid in weak, moderate and strong inversion + + +[^2]: Peter Kinget, see CJM + +--- + + +$$\frac{\sigma_{I_D}^2}{I_D^2} = \frac{1}{WL}\left[\left(\frac{gm}{I_D}\right)^2 \sigma_{vt}^2 + \frac{\sigma_{\ell}^2}{\ell}\right] $$ +$$\frac{\sigma_{I_D}}{I_D} \propto \frac{1}{\sqrt{WL}}$$ + +Assume $$\frac{\sigma_{I_D}}{I_D} = 10\%$$, We want $$5\%$$, how much do we need to change WL? + + +$$\frac{\frac{\sigma_{I_D}}{I_D}}{2} \propto \frac{1}{2\sqrt{WL}} = \frac{1}{\sqrt{4WL}}$$ + + +**We must quadruple the area to half the standard deviation** + +$$1 \%$$ would require **100** times the area + + +![right 150%](../media/fig_l8_cmfixproc.pdf) + +--- + +# What else can we do? + +$$\frac{\sigma_{I_D}^2}{I_D^2} = \frac{1}{WL}\left[\left(\frac{gm}{I_D}\right)^2 \sigma_{vt}^2 + \frac{\sigma_{\ell}^2}{\ell}\right] $$ + +Strong inversion $$\Rightarrow \frac{gm}{I_D} = \frac{1}{2 V_{eff}} = low$$ + +Weak inversion $$\Rightarrow \frac{gm}{I_D} = \frac{q}{n k T} \approx 25$$ + +**Current mirrors achieve best matching in strong inversion** + +![right 150%](../media/fig_l8_cmfixproc.pdf) + +--- + +$$\frac{\sigma_{I_D}^2}{I_D^2} = \frac{1}{WL}\left[\left(\frac{gm}{I_D}\right)^2 \sigma_{vt}^2 + \frac{\sigma_{\ell}^2}{\ell}\right] $$ + +$$\sigma_{I_D}^2 = \frac{1}{WL}\left[gm^2 \sigma_{vt}^2 + I_D^2\frac{\sigma_{\ell}^2}{\ell}\right] $$ + +Offset voltage for a differential pair + +$$ i_o = i_{o+} - i_{o-} = g_m v_i = g_m (v_{i+} - v_{i-})$$ + +$$ \sigma_{v_i}^2 = \frac{\sigma_{I_D}^2}{gm^2} = \frac{1}{WL}\left[\sigma_{vt}^2 + \frac{I_D^2}{gm^2}\frac{\sigma_{\ell}^2}{\ell}\right] $$ + +High $$\frac{gm}{I_D}$$ is better (best in weak inversion) + +![right 200%](../media/fig_diff.pdf) + +--- +# Transistor Noise + +**Thermal noise** +Random scattering of carriers, generation-recombination in channel? +$$ PSD_{TH}(f) = \text{Constant}$$ + + +**Popcorn noise** +Carriers get "stuck" in oxide traps (dangling bonds) for a while. Can cause a short-lived (seconds to minutes) shift in threshold voltage +$$ PSD_{GR}(f) \propto \text{Lorentzian shape} \approx \frac{A}{1 + \frac{f^2}{f_0}}$$ + +**Flicker noise** +Assume there are many sources of popcorn noise at different energy levels and time constants, then the sum of the spectral densities approaches flicker noise. +$$ PSD_{flicker}(f) \propto \frac{1}{f} $$ + +![right fit](https://upload.wikimedia.org/wikipedia/en/2/2a/Popcorn_noise_graph.png) + +--- +[.background-color: #000000] +[.text: #FFFFFF] +#[fit] Analog designer = Someone who knows how to deal with variation + +--- + +#[fit] Current Mirrors + +--- + +![fit](../media/fig_current_mirrors.pdf) + +--- + +![fit](../media/cm_gain_boost.pdf) + +--- +["High speed, high gain OTA in a digital 90nm CMOS technology" Berntsen, Wulff, Ytterdal, Norchip 2005](https://ieeexplore.ieee.org/document/1597006) + + +![original fit](../media/berntsen.png) + + +--- + +#[fit] Large signal vs small signal + +--- + +![original fit](../media/ls_vs_ss.png) + +--- + +# $$ I \ne i $$ + +# $$ V \ne v $$ + + +![left fit](../media/diode.png) + +--- + + +# $$ I = I_{bias} + i $$ + +# $$ V = V_{bias} + v $$ + + +![left fit](../media/diode.png) + +--- + + +![left fit](../media/diode.png) + +# Current Mirror + +$$M_1$$ is diode connected ($$V_G = V_D$$) + + +![inline 200%](../media/fig_cm.pdf) + +--- + +#[fit] Amplifiers + +--- + +#[fit] Source follower + +--- +# Source follower + +Input resistance $$\approx \infty$$ + +Gain $$ A = \frac{v_o}{v_i}$$ + +Output resistance $$r_{out}$$ + +![left fit](../media/sf_ls.png) + +--- + +![right fit](../media/why_sf_not.png) +![left fit](../media//why_sf.png) + +--- + +Assume 100 electrons + +[.column] + + +$$ \Delta V = Q/C = -1.6 \times 10^{-19} \times 100 / (1\times 10^{-15}) = - 16\text{ mV} $$ + +![inline fit](../media/why_sf.png) + +[.column] + +$$ \Delta V = Q/C = -1.6 \times 10^{-19} \times 100 / (1\times 10^{-12}) = - 16\text{ uV} $$ + + +![inline fit](../media/why_sf_not.png) + +--- + + +# Common gate + +Input resistance $$ r_{in} \approx \frac{1}{g_m}\left(1 + \frac{R_L}{r_{ds}}\right) $$ + +Gain $$ \frac{v_o}{v_i} = 1 + g_m r_{ds} $$ + +Output resistance $$r_{out} = r_{ds}$$ + +![left fit](../media/cg_ls_rin.png) + +--- + +# Common source + +Input resistance $$r_{in} \approx \infty$$ + +Output resistance $$r_{out} = r_{ds}$$, it's same circuit as the output of a current mirror + +Gain $$ \frac{v_o}{v_i} = - g_m r_{ds}$$ + +![left fit](../media/cs_ls_a.png) + +--- + +# Diff pairs are cool + +![left fit](../media/df_ls_a.png) + + Can choose between + + $$ v_o = g_m r_{ds} v_i$$ + + and + + $$ v_o = -g_m r_{ds} v_i$$ + + by flipping input (or output) connections + +--- + +# Operational transconductance amplifiers + +--- + +![inline](../media/ota.png) + +--- + +#[fit] Digital + +--- + +## Rules for inverting static CMOS logic + +**Pull-up** +OR $$\Rightarrow$$ PMOS in series $$\Rightarrow$$ POS +AND $$\Rightarrow$$ PMOS in paralell $$\Rightarrow$$ PAP + +**Pos**traumatic **Pap**aya + +**Pull-down** +OR $$\Rightarrow$$ NMOS in paralell $$\Rightarrow$$ NOP +AND $$\Rightarrow$$ NMOS in series $$\Rightarrow$$ NAS + + +![right fit](../media/nand_tr.png) + +--- + +[.table-separator: #000000, stroke-width(1)] +[.table: margin(8)] + +## $$ \text{Y} = \overline{\text{AB}} = \text{NOT ( A AND B)}$$ + + **AND** + PU $$\Rightarrow$$ PMOS in paralell + PD $$\Rightarrow$$ NMOS in series + + **Pos**traumatic **Pap**aya + + +![right fit ](../media/nand_tr.png) + + +| A | B | NOT(A AND B) | +|:---|:---|:---| +| 0 | 0 | 1 | +| 0 | 1 | 1 | +| 1 | 0 | 1 | +| 1 | 1 | 0 | + +--- +## SUN\_TR\_GF130N + +ssh://aurora/home/wulff/repos/sun\_tr\_gf130n.git + +| Cell | Description | +|:------------|:----------------------------------------------------| +| ANX1\_CV | AND | +| BFX1\_CV | Buffer | +| DFRNQNX1\_CV | D Flip-flop with inverted output and inverted reset | +| IVTRIX1\_CV | Tristate inverter, enable | +| IVX1\_CV | Inverter | +| NDTRIX1\_CV | Tristate NAND | +| NDX1\_CV | NAND | +| NRX1\_CV | NOR | +| ORX1\_CV | OR | +| SCX1\_CV | Schmitt-trigger | +| TAPCELLB\_CV | Bulk connection | +| TIEH\_CV | Tie high | +| TIEL\_CV | Tie low | + +--- + +![50%](../media/inv.png) ![inline](../media/nor_tr.png) ![inline](../media/nand_tr.png) + +--- + +# $$SR$$-Latch + +Use boolean expressions to figure out how gates work. + +Remember De-Morgan + +$$\overline{AB} = \overline{A}+ \overline{B}$$ +$$\overline{A+B} = \overline{A} \cdot \overline{B}$$ + + + $$ Q = \overline{R \overline{Q}} = \overline{R} + +\overline{\overline{Q}} = \overline{R} + Q $$ + + $$ \overline{Q} = \overline{S Q} = \overline{S} + +\overline{Q} = \overline{S} + \overline{Q} $$ + +![right 200% ](../media/sr.pdf) + +--- + +# $$SR$$-Latch + +$$ Q = \overline{R} + Q $$, $$ \overline{Q} =\overline{S} + \overline{Q} $$ + +| S | R | Q | ~Q | +|:---|:---|:---| :---| +| 0 | 0 | X | X | +| 0 | 1 | 0 | 1 | +| 1 | 0 | 1 | 0 | +| 1 | 1 | Q | ~Q | + + +![right 200% ](../media/sr.pdf) + +--- + +# D-Latch + +| C | D | Q | ~Q | +|:---|:---|:---| :---| +| 0 | X | Q | ~Q | +| 1 | 0 | 0 | 1 | +| 1 | 1 | 1 | 0 | + + +![right 200% ](../media/dlatch.pdf) + + +--- +[.background-color: #000000] +[.text: #FFFFFF] +# Digital can be synthesized in conductive peanut butter Barrie Gilbert? + +--- + + +# What about $$\text{Y} = \text{AB}$$ and $$\text{Y} = \text{A} + \text{B}$$? + + +[.column] + +# $$\text{Y} = \text{AB} = \overline{\overline{\text{AB}}}$$ + +**Y** = **A** AND **B** = NOT( NOT( **A** AND **B** ) ) + +![inline](../media/and.png) + +[.column] + +# $$\text{Y} = \text{A+B} = \overline{\overline{\text{A+B}}}$$ + +**Y** = **A** OR **B** = NOT( NOT( **A** OR **B** ) ) + +![inline](../media/or.png) + + +--- + +# AOI22: and or invert + + **Y** = NOT( **A** AND **B** OR **C** AND **D**) + + $$\text{Y} = \overline{\text{AB} + \text{CD}}$$ + +![right fit](../media/an2oi.pdf) + + **Pos**traumatic **Pap**aya + +--- + +![original fit](../media/inv_tg.pdf) + +--- +[.table-separator: #000000, stroke-width(1)] +[.table: margin(8)] + +# Tristate inverter + +| E | A | Y | +|:---|:---|:---| +| 0 | 0 | Z | +| 0 | 1 | Z | +| 1 | 0 | 1 | +| 1 | 1 | 0 | + +![right fit](../media/ivtrix.pdf) + +--- + +[.table-separator: #000000, stroke-width(1)] +[.table: margin(8)] + +# Mux + +| S | Y | +|:---|:---| +| 0 | NOT(P1) | +| 1 | NOT(P0) | + +![right fit](../media/mux.pdf) + +--- +D-Latch + +![original fit](../media/latch.pdf) + +--- +D-Flip Flop + +![original fit](../media/d_ff.pdf) + +--- + +![original fit](../media/digital_ff_comb.pdf) + +--- +# SystemVerilog + +```verilog +module counter( + output logic [WIDTH-1:0] out, + input logic clk, + input logic reset + ); + + parameter WIDTH = 8; + + logic [WIDTH-1:0] count; + always_comb begin + count = out + 1; + end + + always_ff @(posedge clk or posedge reset) begin + if (reset) + out <= 0; + else + out <= count; + end + +endmodule // counter +``` + +![right fit](../media/digital_ff_comb.pdf) + +--- + + +# There are other types of logic + +[.column] +- True single phase clock (TSPC) logic +- Pass transistor logic +- Transmission gate logic +- Differential logic +- Dynamic logic + +[.column] +Consider other types of logic "rule breaking", so you should know why you need it. + +--- + +![inline 110%](../media/fig_sar_logic.pdf) + +Dynamic logic => [A Compiled 9-bit 20-MS/s 3.5-fJ/conv.step SAR ADC in 28-nm FDSOI for Bluetooth Low Energy Receivers](https://ieeexplore.ieee.org/document/7906479) + +--- + +# Elmore Delay + +$$ t_{pd} \approx \sum_{\text{nodes}}{R_{\text{nodes}-to-source} C_i} $$ + +$$ = R_1C_1 + (R_1 + R_2)C_2 + ... + (R_1 + R_2 + ... + R_N) C_N$$ + +Good enough for hand calculation + +![right fit](../media/elmore.pdf) + +--- +#[fit] Best number of stages + +--- + +#[fit] Which has shortest delay? + +![left fit](../media/path.pdf) + +--- + +[.column] + +![inline](../media/path.pdf) +![inline](../media/fig_logeffort.pdf) + +[.column] + + $$H = C_{cout}/C_{in} = 64 $$ + + $$G = \prod{g_i} = \prod{1} = 1$$ + + $$B = 1$$ + + $$F = GBH = 64$$ + +*One stage* +$$f = 64 \Rightarrow D = 64 + 1 = 65$$ + +*Three stage with $$f=4$$* +$$D_F = 12, p = 3 \Rightarrow D = 12 + 3 = 15$$ + +---- +[.background-color: #000000] +[.text: #FFFFFF] + +#[fit] For close to optimal delay, use $$f = 4$$ (Used to be $$f=e$$) + +--- + + +#[fit] Pick two + +![right fit](../media/optimization.pdf) + +--- + +#[fit] Power + +--- + +# What is power? + +Instantanious power: $$ P(t) = I(t)V(t)$$ + +Energy : $$ \int_0^T{P(t)dt} $$ [J] + +Average power: $$\frac{1}{T} \int_0^T{P(t)dt} $$ [W or J/s] + + + +--- +# Power dissipated in a resistor + + Ohm's Law $$V_R = I_R R$$ + + $$P_R = V_R I_R = I_R^2 R = \frac{V_R^2}{R} $$ + +--- +# Charging a capacitor to $$V_{DD}$$ + + Capacitor differential equation $$ I_C = C\frac{dV}{dt}$$ + + $$E_{C} = \int_0^\infty{I_C V_C dt} = \int_0^\infty{ C \frac{dV}{dt} V_C dt} = \int_0^{V_C}{C V dV} = C\left[\frac{V^2}{2}\right]_0^{V_{DD}} $$ + + $$E_{C} = \frac{1}{2} C V_{DD}^2$$ + +--- +# Energy to charge a capacitor to a voltage $$V_{DD}$$ + + $$ E_{C} = \frac{1}{2} C V_{DD}^2$$ + + $$ I_{VDD} = I_C = C \frac{dV}{dt}$$ + + $$ E_{VDD} = \int_0^\infty{I_{VDD} V_{DD} dt} = \int_0^\infty{C \frac{dV}{dt} V_{DD} dt} = C V_{DD}\int_0^{V_{DD}}{dV} = C V_{DD}^2$$ + + Only half the energy is stored on the capacitor, the rest is dissipated in the PMOS + +--- +# Discharging a capacitor to $$0$$ + +$$ E_{C} = \frac{1}{2} C V_{DD}^2$$ + +Voltage is pulled to ground, and the power is dissipated in the NMOS + +--- +# Power consumption of digital circuits + +$$E_{VDD} = C V_{DD}^2$$ + +In a clock distribution network (chain of inverters), every output is charged once per clock cycle + +$$P_{VDD} = C V_{DD}^2 f$$ + +--- +# Sources of power dissipation in CMOS logic + +$$ P_{total} = P_{dynamic} + P_{static}$$ + +[.column] +**Dynamic power dissipation** + +Charging and discharging load capacitances + +*short-circut* current, when PMOS and NMOS conduct at the same time + +$$P_{dynamic} = P_{switching} + P_{short circuit}$$ + +[.column] +**Static power dissipation** + +Subthreshold leakage in OFF transistors + +Gate leakage (tunneling current) through gate dielectric + +Source/drain reverse bias PN junction leakage + +$$P_{static} = \left( I_{sub} + I_{gate} + I_{pn} \right) V_{DD}$$ + +--- +# $$ P_{switching}$$ in logic gates + +Only output node transitions from low to high consume power from $$V_{DD}$$ + +Define $$P_i$$ to be the probability that a node is 1 + +Define $$\overline{P_i} = 1 - P_i$$ to be the probability that a node is 0 + +Define **activity factor ($$\alpha_i$$)** as the **probability of switching a node from 0 to 1** + +If the probabilty is uncorrelated from cycle to cycle + +$$\alpha_i = \overline{P_i}P_i$$ + +--- +# Switching probability + +Random data $$P = 0.5$$, $$\alpha = 0.25$$ + +Clocks $$\alpha = 1$$ + +![left fit](../media/tb_sw_prob.pdf) + +--- + +# Strategies to reduce dynamic power + +1. Stop clock +1. Stop activity +1. Reduce clock frequency +1. Turn off $$V_{DD}$$ +1. Reduce $$V_{DD}$$ + +![right fit](../media/digital_ff_comb.pdf) + +--- + +## Stop clock[^3] + +![inline fit ](../media/stop_clock.pdf) + + +[^3]: Often called *clock gating* + +--- + +## Stop activity + +![inline fit ](../media/logic.pdf) ![inline fit ](../media/stop_activity.pdf) + +--- +## Reduce frequency +![inline fit ](../media/reduce_freq.pdf) + +--- +## Turn off power supply [^4] + +![inline fit ](../media/powergate.pdf) + +[^4]: Often called power gating + +--- + +### Reduce power supply ($$V_{DD}$$) + +![inline fit ](../media/reduce_vdd.pdf) + +--- + +#[fit] IC Process + +--- + +# Metal stack + +Often 5 - 10 layers of metal + +|Metal |Material | Thickness |Purpose | +| :--: | :--:|:--:| :--: | +|Metal 1 - 2 | Copper| Thin | in gate routing| +|Metal 3-4 | Copper| Thicker| Between gates routing| +|Metal Z | Copper| Very thick| Cross chip routing. Local Power/Ground routing| +|Metal Y | Copper| Ultra thick | Cross chip power routing. Often used for RF inductors.| +|RDL | Aluminium | Ultra tick | Can tolerate high forces during wire bonding.| + +![right](https://skywater-pdk.readthedocs.io/en/main/_images/metal_stack.svg) + +--- +[.background-color: #000000] +[.text: #FFFFFF] + +#[fit] Metal routing rules on IC + +Odd numbers metals $$\Rightarrow$$ Horizontal routing (as far as possible) + +Even numbers metals $$\Rightarrow$$ Vertical routing (as far as possible) + +--- + +# Lumped model + +Use 1-segment $$\pi$$-model for Elmore delay + +![inline](../media/lumped_model.png) + + + +--- +# Wire resistance + + resistivity $$\Rightarrow \rho $$ [$$\Omega$$m] + + $$ R = \frac{\rho}{t}\frac{l}{w} = R_\square \frac{l}{w}$$ + + $$ R_\square$$ = sheet resistance [$$\Omega/\square$$] + + To find resistance, count the number of squares + + $$ R = R_\square \times \text{# of squares}$$ + + +--- +# Most wires: Copper + +[.column] + +$$R_{sheet-m1} \approx \frac{1.7 \mu\Omega cm}{200 nm} \approx 0.1 \Omega/\square$$ +$$R_{sheet-m9} \approx \frac{1.7 \mu\Omega cm}{3 \mu m} \approx 0.006 \Omega/\square$$ + +[.column] +**Pitfalls** + +Cu atoms diffuse into silicon and can cause damage + +Must be surrounded by a diffusion barrier + +Difficult high current densities (mA/$$\mu$$m) +and high temperature (125 C) + +--- +# Contacts + +Contacts and vias can have 2-20 $$\Omega$$ + +Must use many contacts/vias for high current wires + +--- + +# Wire capacitance + +# $$C_{total} = C_{top} + C_{bot} + 2C_{adj}$$ + +Dense wires has about $$0.2 \text{ fF/}\mu\text{m}$$ + +--- +**Estimate delay of inverter driving a 1 mm long , 0.1 $$\mu m$$ wide metal 1 wire with inverter load at the end** + + $$R_{sheet} = 0.1 \Omega/\square$$ , $$R_{inv} = 1 k \Omega$$, + $$C_{w} = 0.2 fF/\mu m$$, $$C_{inv} = 1 fF$$ + +Use Elmore + $$t_{pd} = R_{inv}\frac{C_{wire}}{2} + (R_{wire} + R_{inv}) \left(\frac{C_{wire}}{2} + C_{inv}\right) $$ + $$= 1k \times 100f + (1k + 0.1 \times 1k/0.1)\times 101f = 0.3\text{ ns}$$ + +![right 150%](../media/wire_delay.pdf) + +--- +# Crosstalk + +A wire with high capacitance to a neighbor + +An aggressor (0-1, 1-0) injects charge into neighbor wire + +**Increases delay** + +**Noise on nonswitching wires** + + +![right fit](../media/crosstalk.pdf) + +--- + +#[fit] FSM + +--- +# Mealy machine + + +An FSM where outputs depend on current state and inputs + +![right fit](../media/mealy.pdf) + +--- +# Moore machine + + +An FSM where outputs depend on current state + +![right fit](../media/moore.pdf) + + +--- +# Mealy versus Moore + +| Parameter | Mealy | Moore | +| :--: | :--: | :--: | +| Outputs | depend on input and current state | output depend on current state| +| States | Same, or fewer states than Moore | | +| Inputs | React faster to inputs | Next clock cycle | +| Outputs | Can be asynchronous | Synchronous| +| States | Generally requires fewer states for synthesis | More states than Mealy | +| Counter | A counter is not a mealy machine | A counter is a Moore machine | +| Design | Can be tricky to design | Easy | + +--- +## dicex/sim/counter_sv/counter.v + +```verilog +module counter( + output logic [WIDTH-1:0] out, + input logic clk, + input logic reset + ); + parameter WIDTH = 8; + logic [WIDTH-1:0] count; + + always_comb begin + count = out + 1; + end + + always_ff @(posedge clk or posedge reset) begin + if (reset) + out <= 0; + else + out <= count; + end + +endmodule // counter +``` + +![right fit](../media/counter.pdf) + +--- +## Battery charger FSM + +![inline](../media/charge_graph.png) + +--- + +## Li-Ion batteries + +Most Li-Ion batteries can tolerate 1 C during fast charge + +For Biltema 18650 cells: + $$ 1\text{ C} = 2950\text{ mA}$$ + $$ 0.1\text{ C} = 295\text{ mA}$$ + +Most Li-Ion need to be charged to a termination voltage of 4.2 V + + +![right](../media/18650.jpeg) + +**Too high termination voltage, or too high charging current can cause growth of lithium dendrites, that short + and -. Will end in flames. Always check manufacturer datasheet for charging curves and voltages** + +--- + +## Battery charger - Inputs + +Voltage above $$V_{TRICKLE}$$ + +Voltage close to $$V_{TERM}$$ + +If voltage close to $$V_{TERM}$$ and current is close to $$I_{TERM}$$, then charging complete + +If charging complete, and voltage has dropped ($$V_{RECHARGE}$$), then start again + +![right 60%](../media/charge_graph.png) + +--- + +## Battery charger - States + +Trickle charge (0.1 C) + +Fast charge (1 C) + +Constant voltage + +Charging complete + + +![right 60%](../media/charge_graph.png) + +--- + +![inline](../media/bcharger.pdf) + +--- +### One way to draw FSMs - Graphviz + +``` +digraph finite_state_machine { + rankdir=LR; + size="8,5" + + node [shape = doublecircle, label="Trickle charger", fontsize=12] trkl; + node [shape = circle, label="Fast charge", fontsize=12] fast; + node [shape = circle, label="Const. Voltage", fontsize=12] vconst; + node [shape = circle, label="Done", fontsize=12] done; + + trkl -> trkl [label="vtrkl = 0"]; + trkl -> fast [label="vtrkl = 1"]; + fast -> fast [label="vterm = 0"]; + fast -> vconst [label="vterm = 1"]; + vconst-> vconst [label="iterm = 0"]; + vconst-> done [label="iterm = 1"]; + done-> done [label="vrchrg = 0"]; + done-> trkl [label="vrchrg = 1"]; + +} +``` + + dot -Tpdf bcharger.dot -o bcharger.pdf + + +--- + + + +[.column] + +![inline fit ](../media/bcharger.pdf) + +```verilog +module bcharger( output logic trkl, + output logic fast, + output logic vconst, + output logic done, + input logic vtrkl, + input logic vterm, + input logic iterm, + input logic vrchrg, + input logic clk, + input logic reset + ); + + parameter TRLK = 0, FAST = 1, VCONST = 2, DONE=3; + logic [1:0] state; + logic [1:0] next_state; + + //- Figure out the next state + always_comb begin + case (state) + TRLK: next_state = vtrkl ? FAST : TRLK; + FAST: next_state = vterm ? VCONST : FAST; + VCONST: next_state = iterm ? DONE : VCONST; + DONE: next_state = vrchrg ? TRLK :DONE; + default: next_state = TRLK; + endcase // case (state) + end + +``` + +[.column] + +```verilog + //- Control output signals + always_ff @(posedge clk or posedge reset) begin + if(reset) begin + state <= TRLK; + trkl <= 1; + fast <= 0; + vconst <= 0; + done <= 0; + end + else begin + state <= next_state; + case (state) + TRLK: begin + trkl <= 1; + fast <= 0; + vconst <= 0; + done <= 0; + end + FAST: begin + trkl <= 0; + fast <= 1; + vconst <= 0; + done <= 0; + + end + VCONST: begin + trkl <= 0; + fast <= 0; + vconst <= 1; + done <= 0; + + end + DONE: begin + trkl <= 0; + fast <= 0; + vconst <= 0; + done <= 1; + end + endcase // case (state) + end // else: !if(reset) + end +endmodule +``` +--- + +![original fit](../media/bcharger_sim.png) + +--- + +### Synthesize FSM with yosys +dicex/sim/verilog/bcharger_sv/bcharger.ys + +```tcl + +# read design +read_verilog -sv bcharger.sv; +hierarchy -top bcharger; + +# the high-level stuff +fsm; opt; memory; opt; + +# mapping to internal cell library +techmap; opt; +synth; +opt_clean; + +# mapping flip-flops +dfflibmap -liberty ../../../lib/SUN_TR_GF130N.lib + +# mapping logic +abc -liberty ../../../lib/SUN_TR_GF130N.lib + +# write synth netlist +write_verilog bcharger_netlist.v +read_verilog ../../../lib/SUN_TR_GF130N_empty.v +write_spice -big_endian -neg AVSS -pos AVDD -top bcharger bcharger_netlist.sp + +# write dot so we can make image +show -format dot -prefix bcharger_synth -colors 1 -width -stretch +clean + +``` + +--- + +![original fit](../media/bcharger_synth.pdf) + +--- + + + +#[fit] Thanks! + + + + + + + diff --git a/lectures/l00_refresher.md b/lectures/l00_refresher.md new file mode 100644 index 0000000..a06e0f2 --- /dev/null +++ b/lectures/l00_refresher.md @@ -0,0 +1,445 @@ +--- +title: A refresher of the first 4 years of electronics +layout: post +date: 2023-10-26 +permalink: refresh +--- + + + + + +* TOC +{:toc } + +# There is a standard unit of measurement + +All known physical quantities are derived from 7 base units ([SI +units](https://en.wikipedia.org/wiki/International_System_of_Units)) +, second (s), meter (m), kg (kilogram), ampere (A), kelvin (K), candela (cd). + +All other units (for example volts), are derived from the base units. + +I don't go around remembering all of them, they are easily available online. When you forget the equation for charge (Q), voltage (V) and capacitance (C), look at the units below, and you can see it's $Q = C V$[^1] + +![](https://www.nist.gov/sites/default/files/images/2021/08/23/NIST.SP_.1247.png) + + + +# Electrons + +Electrons are fundamental, they cannot (as far as we know), be divided +into smaller parts. Explained further in the [standard model of particle physics](https://en.wikipedia.org/wiki/Standard_Model) + +Electrons have a negative charge of $q \approx 1.602 \times 10^{-19}$. The proton a positive charge. The two charges balance exactly! If you have a trillion electrons and a trillion protons inside a volume, the net external charge will be $0$ (assuming we measure from some distance away). I find this fact absolutely incredible. There must be a fundamental connection between the charge of the proton and electron. It's inside that the charges balance out so exactly. + +All electrons are the same, although the quantum state can be different. + +An electron cannot occupy the same quantum state as another. This rule that applies to all Fermions (particles with spin of 1/2) + +The quantum state of an electron is fully described by it's spin, momentum (p) and position in space (r). + +# Probability + +The probability of finding an electron in a state as a function of space and time is + +$$ P = |\psi(r,t)|^2 $$ + +, where $\psi$ is named the probability amplitude, and is a complex function of space and time. In some special cases, it's + +$$ \psi(r,t) = A e^{i( kr - \omega t)}$$ + +, where A is complex number, k is the wave number, r is the position vector from +some origin, $\omega$ is the frequency and $t$ is time. + + +The energy is $E = \hbar \omega$ , where $\hbar = h/2\pi$ and $h$ is +[Planck Constant](https://en.wikipedia.org/wiki/Planck_constant) and the momentum is $p = \hbar k$ + +# Uncertainty principle + +We cannot, with ultimate precision, determine both the position and the momentum of a particle, the precision is + +$$\sigma_x \sigma_p \ge \frac{\hbar}{2}$$ + +From the [uncertainty principle](https://en.wikipedia.org/wiki/Uncertainty_principle) we can actually [estimate the size of the atom](https://wulffern.github.io/aic2023/atom) + +# States as a function of time and space + +The time-evolution of the probability amplitude is + +$$ i\hbar \frac{d}{dt} \psi(r,t) = H \psi(r,t)$$ + +, where H is named the Hamiltonian matrix, or the energy matrix or (if I understand correctly) the amplitude matrix of the probability amplitude to change from one state to another. + +For example, if we have a system with two states, a simplified version of two electrons shared between two atoms, as in $H_2$, or hydrogen gas, or co-valent bonds, then the Hamiltonian is a 2 x 2 matrix. And the $\psi$ is a vector of $[\psi_1,\psi_2]$ + +Computing the solution to the [Schrodinger Equation](https://en.wikipedia.org/wiki/Schrödinger_equation) can be tricky, because you must know the number of relevant states to know the vector size of $\psi$ and the matrix size of $H$. In addition, the $H$ can be a function of time and space (I think). + +Compared to the equations of electric fields, however, Schrodinger is easy, it's a set of linear differential equations. + +# Allowed energy levels in atoms + +Solutions to Schrodinger result in quantized energy levels for an electron bound +to an atom. + +Take hydrogen, the electron bound to the proton can only exists in quantized +energy levels. The lowest energy state can have two electrons, one with spin up, +and one with spin down. + + +From Schrodinger you can compute the energy levels, which most of us did at +some-point, although now, I can't remember how it was done. That's not important. +The important is to internalize that the energy levels in bound electrons are +discrete. + + +Electrons can transition from one energy level to another by external influence, +i.e temperature, light, or other. + + +The probability of a state transition (change in energy) can be determined from +the probability amplitude and Schrodinger. + + +# Allowed energy levels in solids + +If I have two silicon atoms spaced far apart, then the electrons can have the +same spin and same momentum around their respective nuclei. As I bring the atoms +closer, however, the probability amplitudes start to interact (or the dimensions +of the Hamiltonian matrix grow), and there can be state transitions between the +two electrons. + + +The allowed energy levels will split. If I only had two states interacting, the Hamiltonian could be + +$$ H = +\begin{bmatrix} +A & 0 \\ +0 & -A +\end{bmatrix} +$$ + +and the new energy levels could be + +$$ E_1 = E_0 + A$$ + +and + +$$ E_2 = E_0 - A$$ + +In a silicon crystal we can have trillions of atoms, and those that are close, have states that interact. **That's why crystals stay solids**. All chemical bonds are states of electrons interacting! Some are strong (co-valent bonds), some are weaker (ionic bonds), but it's all quantum states interacting. + +The discrete energy levels of the electron transition into bands of allowed energy states. + +![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Solid_state_electronic_band_structure.svg/640px-Solid_state_electronic_band_structure.svg.png) + + +For a crystal, the allowed energy bands is captured in the [band structure](https://en.wikipedia.org/wiki/Electronic_band_structure) + +# Silicon Unit Cell + +A [silicon](https://en.wikipedia.org/wiki/Silicon) crystal unit cell is a diamond faced cubic with 8 atoms in the corners spaced at 0.543 nm, 6 at the center of the +faces, and 4 atoms inside the unit cell at a nearest neighbor distance of 0.235 +nm. + +![](https://upload.wikimedia.org/wikipedia/commons/f/f1/Silicon-unit-cell-3D-balls.png) + + +# Valence band and Conduction band + +The full band structure of a silicon unit cell is complicated. For bulk silicon +we simplify, and we think of two bands. In the conduction band ($E_C$) is the +lowest energy where electrons are free (not bound to atoms). The valence band +($E_V$) is the highest band where electrons are bound to silicon atoms. + +The difference between $E_C$ and $E_V$ is a property of the material we've named the band gap. + +$$ E_G = E_C - E_V$$ + + +# Metals + +In metals, the band splitting of the energy levels causes the valence band and conduction band to overlap. As such, electrons can easily transition between bound state and free state. As such, electrons in metals are shared over large distances, and there are many electrons readily available to move under an applied field, or difference in electron density. That's why metals conduct well. + +# Insulators + +In insulating materials the difference between the conduction band and the valence band is large. As a result, it takes a large energy to excite electrons to a state where they can freely move. + +That's why glass is transparent to optical frequencies. Visible light does not have sufficient energy to excite electrons from a bound state. + +That's also why glass is opaque to ultra-violet, which has enough energy to excite electrons out of a bound state. + +Based on these two pieces of information you could estimate the bandgap of glass. + +# Semiconductors + +In a silicon the bandgap is lower than an insulator, approximately $E_G = 1.12\text{ } eV$ for silicon. + +At room temperature, that allows a small number of electrons to be excited into the conduction band, leaving behind a "hole" in the valence band. + +# Fermi level + +From Wikipedia's [Fermi level](https://en.wikipedia.org/wiki/Fermi_level) + +> In band structure theory, used in solid state physics to analyze the energy +> levels in a solid, the Fermi level can be considered to be a hypothetical +> energy level of an electron, such that at thermodynamic equilibrium this +> energy level would have a 50% probability of being occupied at any given time + +The Fermi level is closely linked to the [Fermi-Dirac +distribution](https://en.wikipedia.org/wiki/Fermi%E2%80%93Dirac_statistics) + +$$ +f(E) = \frac{1}{e^{(E - E_F)/kT} + 1} +$$ + +If the energy of the state is more than a few kT away from the Fermi-level, then + +$$ +f(E) \approx e^{(E_F - E)/kT} +$$ + + +# Band diagrams + +A [band diagram](https://en.wikipedia.org/wiki/Band_diagram) or energy level +diagrams shows the conduction band energy and valence band energy as a function +of distance in the material. + +![](https://upload.wikimedia.org/wikipedia/commons/4/43/Pn-junction_zero_bias.png) + +The horizontal axis is the distance, the vertical axis is the energy. + +The figure shows a PN-junction + +# Density of electrons/holes + +There are two components needed to determine how many electrons are in the +conduction band. The density of available states, and the probability of an +electron to be in that quantum state. + +The probability is the Fermi-Dirac distribution. The density of available states +is a complicated calculation from the band-structure of silicon. See [Diodes](https://wulffern.github.io/aic2023/2021/07/08/Diodes.html) +for details. + +$$ n_e = \int_{E_C}^{\infty} N(E)f(E) dE$$ + +The Fermi level is assumed to be independent of energy level, so we can write + +$$ n_e = e^{E_F/kT} \int_{E_C}^{\infty} N(E) e^{-E/kT}dE$$ + +for the density of electrons in the conduction band. + + +# Fields + +There are equations that relate electric field, magnetic field, charge density +and current density to each-other. + +The equations + +$$ \oint_{\partial \Omega} \mathbf{E} \cdot d\mathbf{S} = \frac{1}{\epsilon_0} \iiint_{V} \rho +\cdot dV$$ + +,relates net electric flux to net enclosed electric charge + +$$ \oint_{\partial \Omega} \mathbf{B} \cdot d\mathbf{S} = 0$$ + +,relates net magnetic flux to net enclosed magnetic charge + +$$ \oint_{\partial \Sigma} \mathbf{E} \cdot d\mathbf{\ell} = - \frac{d}{dt}\iint_\Sigma \mathbf{B} +\cdot d\mathbf{S}$$ + +,relates induced electric field to changing magnetic flux + +$$ \oint_{\partial \Sigma} \mathbf{B} \cdot d\mathbf{\ell} = \mu_0\left( +\iint_\Sigma \mathbf{J} \cdot d\mathbf{S} + \epsilon_0 \frac{d}{dt}\iint_\Sigma +\mathbf{E} \cdot d\mathbf{S} \right)$$ + +,relates induced magnetic field to changing electric flux and to current + +These are the [Maxwell +Equations](https://en.wikipedia.org/wiki/Maxwell%27s_equations), and are +non-linear time dependent differential equations. + +Under the best of circumstances they are fantastically hard to solve! But it's +how the real world works. + +The permittivity of free space is defined as + +$$\epsilon_0 = \frac{1}{\mu_0 c^2}$$ + +, where $c$ is the [speed of light](https://en.wikipedia.org/wiki/Speed_of_light), and $\mu_0$ is the [vacuum permeability](https://en.wikipedia.org/wiki/Vacuum_permeability), which, in [SI units](https://en.wikipedia.org/wiki/International_System_of_Units), is now + +$$\mu_0 = \frac{2 \alpha}{q^2}\frac{h}{c}$$ + +, where $\alpha$ is the [fine structure constant](https://en.wikipedia.org/wiki/Fine-structure_constant). + + +# Voltage + +The electric field has units voltage per meter, so the electric field is the +derivative of the voltage as a function of space. + +$$ E = \frac{dV}{dx}$$ + + +# Current + +Current has unit $A$ and charge $C$ has unit $As$, so the current is the number +of charges passing through a volume per second. + +The current density $J$ has units $A/m^2$ and is often used, since we can multiply +by the surface area of a conductor, if the current density is uniform. + +$$ I = A \times J $$ + +# Drift current + +Charges in an electric field will give rise to a drift current. + +We know from Newtons laws that force equals mass times acceleration + +$$ \vec{F} = m \vec{a}$$ + +If we assume a zero, or constant magnetic field, the force on a particle is +$\vec{F} = q\vec{E}$ + +The current density is then + +$$ \vec{J} = q\vec{E} \times n \times \mu $$ + +where $n$ is the charge density, and $\mu$ is the mobility (how easily the +charges move) and has units [$m^2/Vs$] + +Assuming $E = V/m$, we could write + +$$ J = \frac{C}{m^3}\frac{V}{m}\frac{m^2}{Vs} = \frac{C}{s}m^{-2}$$ + +So multiplying by an area $A = B m^2$ + +$$ I = q n \mu B V$$ + +and we can see that the conductance $G = q n \mu B$, and since $G = 1/R$, where +R is the resistance, we have + +$$ I = G V \Rightarrow V = RI$$ + +Or [Ohms law](https://en.wikipedia.org/wiki/Ohm%27s_law) + + +# Diffusion current + +A difference in charge density will give rise to a diffusion current, and the +current density is + +$$ J = -q D_n \frac{d \rho}{dx}$$ + +,where $D_n$ is a diffusion constant, and $\rho$ is the charge density. + +I struggled with the concepts diffusion current and drift current for a long time. Why are there two types of current? It was when I read [The Schrödinger Equation in a Classical Context: A Seminar on Superconductivity](https://www.feynmanlectures.caltech.edu/III_21.html) I realised that +the two types of current come directly from the Schrodinger equation, there is one component related to the electric field (potential energy) and a component related to the momentum (kinetic energy). + +In the absence of an electric field electrons will still jump from state to state set +by the probabilities of the Hamiltonian. If there are more electrons in an area, then it will seem +like there is an average movement of charges away from that area. That's how I think about the +equation above. + + +# Currents in a semiconductor + +Both electrons, and holes will contribute to current. + +Electrons move in the conduction band, and holes move in the valence band. + +Both holes and electrons can only move if there are available quantum states. + +For example, if the valence band is completely filled (all states filled), then +there can be no current. + +To compute the total current in a semiconductor one must compute + +$$ I = I_{n_{drift}} +I_{n_{diffusion}} + I_{p_{drift}} + I_{p_{diffusion}}$$ + +where $n$ denotes electrons, and $p$ denote holes. + +# Resistors + +We can make resistors with metal and silicon (a semiconductor) + +In metal the dominant carrier depends on the metal, but it's usually electrons. +As such, one can often ignore the hole current. + +In a semiconductor the dominant carrier depends on the Fermi level in relation +to the conduction band and valence band. If the Fermi level is close to the +valence band the dominant carrier will be holes. +If the Fermi level is close to the conduction band, the dominant carrier will be +electrons. + +That's why we often talk about "majority carriers" and "minority carriers", both +are important in semiconductors. + +# Capacitors + +A capacitor resists a change in voltage. + +$$ I = C \frac{dV}{dt}$$ + +and store energy in an electric field between two conductors with an insulator +between. + +# Inductors + +An inductor resist a change in current. + +$$ V = L \frac{dV}{dt}$$ + +and store energy in the magnetic fields in a loop of a conductor. + +# Diodes + +See [Diodes](https://wulffern.github.io/aic2023/2021/07/08/Diodes.html) for a +long explanation. + +Assume we in the silicon lattice introduce a dopant, for example phosphorus with one +more electron than silicon. Four of the electrons will be in co-valent bonds +with the silicon lattice, while the last electron is loosely bound to the +phosphorus atom. We call that a donor. + +A donor will shift the Fermi level towards the conduction band, and as such, +there will be more free electrons, as long as there is sufficient energy to +break the loose electron bond. + +A atom with one less electron, for example Boron, can be introduced in the same +way, and is called an acceptor. + +Most of the charges in a p-type (acceptors) silicon will be holes, while in +n-type it will be electrons. + +The interesting thing happens when p-type and n-type are in contact. Since we've +shifted the Fermi level of the two silicon types in opposite direction there +will be an energy difference. That energy difference must be equalized, as +such, over time, the Fermi level of the two types will align, and a junction +will form, with few free charges, a depletion region. + +The conduction band and valence band will bend, and we now have a barrier for +charge transport, a built-in electric field. + + + + + + + + + + + + + + + + + +[^1]: Although you do have to keep your symbols straight. We use "C" for Capacitance, but C can also mean Columbs. Context matters. diff --git a/lectures/l01_intro.md b/lectures/l01_intro.md new file mode 100644 index 0000000..08cab7e --- /dev/null +++ b/lectures/l01_intro.md @@ -0,0 +1,445 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme: Plain Jane, 1 +text: Helvetica +header: Helvetica + + + + + +## TFE4188 - Advanced Integrated Circuits + +# Lecture 1 - Introduction + +--- + + + +# + +--- + + +#[fit] Who + +--- + + + +Carsten Wulff [carstenw@ntnu.no](carstenw@ntnu.no) + + + +![inline](../media/timeline_white.svg) + + +--- + + + +# Teaching assistant + +- Jonathan Sæthre Ege + +--- + + + +#[fit] Why + +--- + +#[fit] I want you to learn the skills necessary to make your own ICs + + + +--- + +[.column] + + +![inline](../media/analog_world.png) + + [https://circuitcellar.com/insights/tech-the-future/kinget-the-world-is-analog/](https://circuitcellar.com/insights/tech-the-future/kinget-the-world-is-analog/) + + + +--- + +![inline](../media/dig_des.svg) + +--- + +##[fit] Will you tape-out an IC? + + + + +--- + + + +- _Project flow support_: **Confluence**, JIRA, risk management (DFMEA), failure analysis (8D) +- _Language_: **English**, **Writing English (Latex, Word, Email)** +- _Psychology_: Personalities, convincing people, presentations (Powerpoint, Deckset), **stress management (what makes your brain turn off?)** +- _DevOps_: **Linux**, bulid systems (CMake, make, ninja), continuous integration (bamboo, jenkins), **version control (git)**, containers (docker), container orchestration (swarm, kubernetes) +- _Programming_: Python, Go, C, C++, Matlab Since 1999 I’ve programmed in Python, Go, Visual BASIC, PHP, Ruby, Perl, C#, SKILL, Ocean, Verilog-A, C++, BASH, AWK, VHDL, SPICE, MATLAB, ASP, Java, C, SystemC, Verilog, and probably a few I’ve forgotten. +- _Firmware_: signal processing, algorithms +- _Infrastructure_: **Power management**, **reset**, **bias**, **clocks** +- _Domains_: CPUs, peripherals, memories, bus systems +- _Sub-systems_: **Radio’s**, **analog-to-digital converters**, **comparators** +- _Blocks_: **Analog Radio**, Digital radio baseband +- _Modules_: Transmitter, **receiver**, de-modulator, timing recovery, state machines +- _Designs_: **Opamps**, **amplifiers**, **current-mirrors**, adders, random access memory blocks, standard cells +- _Tools_: **schematic**, **layout**, **parasitic extraction**, synthesis, place-and-route, **simulation**, (System)Verilog, **netlist** +- _Physics_: transistor, pn junctions, quantum mechanics + +--- +[.background-color: #000000] +[.text: #FFFFFF] + + + +> Find a problem that you really want to solve, and learn programming to solve it. There is no point in saying "I want to learn programming", then sit down with a book to read about programming, and expect that you will learn programming that way. It will not happen. The only way to learn programming is to do it, a lot. +-- Carsten Wulff + + + + +``` perl +s/programming/analog design/ig +``` + +--- + +### Zen of IC design (stolen from Zen of Python) + + + +[.column] +- Beautiful is better than ugly. +- Explicit is better than implicit. +- Simple is better than complex. +- Complex is better than complicated. +- Readability counts (especially schematics). +- Special cases aren't special enough to break the rules. +- Although practicality beats purity. + +[.column] + +- In the face of ambiguity, refuse the temptation to guess. +- There should be one __and preferably only one__ obvious way to do it. +- Now is better than never. +- Although never is often better than *right* now. +- If the implementation is hard to explain, it's a bad idea. +- If the implementation is easy to explain, it may be a good idea. + +--- + +# My Goal + + + +- Enable you to read the book +- Enable you to read papers (latest research) +- Correct misunderstandings of the topic +- Answer any questions you have on the chapters + + + +--- + + + +[.column] +# Plan + +**Lectures:** +Thursday at 08:15 - 10:00 + +The "lectures" will be Q & A's on the topic. If no questions, then I'll ramble on + +**Exercise Hours:** +Friday at 14:15 - 16:00 + +The TA will be in the "exercise hours", and I also will hopefully join most days. + + +--- + + + +## + +- [Description](https://www.ntnu.no/studier/emner/TFE4188#tab=omEmnet) + +- [Time schedule](https://tp.uio.no/ntnu/timeplan/?id=TFE4188&sem=24v&sort=form&type=course) + +- [Lecture plan](https://wulffern.github.io/aic2024/plan/) + +- [Syllabus](https://wulffern.github.io/aic2024/syllabus/) + +- [Youtube Videos](https://youtube.com/playlist?list=PLybHXZ9FyEhZ3HT2KPzjY2bmMJupRX2M6&si=gLMDbo0leoEBZsm0) + + +--- + + + + + +![inline](../media/cjm.png) ![inline](../media/cfas.png) + + +--- + + + +## Exam + +- May/June 2022? +- 4 hours +- A - F grade (F = Fail) + +--- + + +#[fit] Time to take responsibility for your own future + +--- + + + +## Exercises + +- Exercises on blackboard now +- Solutions on blackboard after the deadline +- **One compulsory exercise: Exercise 0 - Skywater 130nm tutorial** +- For the rest, two options: + - Don't do the exercises, don't get feedback + - Do the exercises, hand them in within deadline, get feedback +- The TA's will only support the exercises in the marked weeks + +--- + + + +# Project + +Counts for 45 % of the grade + +No exam without project. + +Strict deadline 29 of April. If you hand in 30 of April at 00:00:01, then you fail the course. + +--- + + + +# CNR (2024) + +*"In an insane world, it was the sanest choice."* - Sarah Connor, Terminator 2: Judgment Day + + +**Design a integrated temperature sensor with digital read-out** + +--- + +## Milestones + +[.column] + + $$I = f(T)$$ + + $$t = f(I)$$ + + $$D = f(t)$$ + + Layout + + Report + +[.column] + + + + +--- + +#[fit] Software + + +Open source software (xschem, ngspice, sky130B PDK, Magic VLSI, netgen) + + + + [rply\_ex0\_sky130nm](https://wulffern.github.io/rply_ex0_sky130nm) + + + + + [aicex](https://wulffern.github.io/aicex) + +--- + + + +# Lower your expectations on EDA software + +Expect that you will spend at least $$2\pi$$ times more time than planned *(mostly due to software issues)* + +--- + + + +#[fit] Questions + +--- + + + +# Do +- google +- ask a someone in your class +- use the "øvingstime and labratorieøvelse" to talk to teaching assistants and hopefully me. Don't ask about future exercises +- come to the office (B311) on Fridays + +--- + + + +#[fit] Thanks! + + diff --git a/lectures/l02_esd.md b/lectures/l02_esd.md new file mode 100644 index 0000000..e1f314c --- /dev/null +++ b/lectures/l02_esd.md @@ -0,0 +1,543 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme: Plain Jane, 1 +text: Helvetica +header: Helvetica + + + + + + + + +## [TFE4188 - Introduction to Lecture 2](https://wulffern.github.io/aic2023/2023/01/19/Lecture-2-IC-and-ESD.html) +# ICs and ESD + +--- + + + +# Goal + +Understand the **real-world** constraints on our IC + +Understand why you must **always handle ESD** on an IC + +--- + + + +#[fit] RPLY + +The project for 2023 is to design an integrated temperature sensor. The hope is that some will tapeout on the Google/Efabless Open MPW shuttle + +--- + + + +# The **real world** constrains our IC + +--- + +## **Q:** What blocks must our IC include? + + + + +--- + + +#[fit] ESD + +--- + +# Electrostatic Discharge + +If you make an IC, you must consider Electrostatic Discharge (ESD) Protection circuits + + + +![right 110%](https://media.wiley.com/product_data/coverImage300/18/04714987/0471498718.jpg) + + + +Standards for testing at [JEDEC](https://www.jedec.org/category/technology-focus-area/esd-electrostatic-discharge-0) + +--- + + +## When do ESD events occur? + +[.column] + +## Before/during PCB + +**Human body model (HBM)** + + + +**Charged device model (CDM)** + + + +[.column] + +## After PCB + +**Human body model (HBM)** + +**System level ESD** + + + +--- +## Human body model (HBM) + +- Models a person touching a device with a finger +- **Long** duration (around 100 ns) +- Acts like a current source into a pin +- Can usually be handled in the I/O ring +- 4 kV HBM ESD is 2.67 A peak current + +![right fit](../media/esd_hbm_finger.pdf) + +--- + +# An ESD zap example + + Imagine a ESD zap between VSS and VDD. How can we protect the device? + + + + +![left fit](../media/esd_hbm_model.pdf) + +--- + +#[fit] Permutations + + + +![right fit](../media/l02_hbm_overview.pdf) + +--- + + + + +![inline fit](../media/l02_01.pdf) + +--- + + + +![inline fit](../media/l02_02.pdf) + +--- + + + +![inline fit](../media/l02_all.pdf) + +--- + +## **Q:** Why does this work? + +![left fit](../media/l02_ggnmos.pdf) + + + +--- + + + +If you don't do the layout right[^3] + + + +[.column] + +![fit](../ip/esd_layout.pdf) + +[.column] + +![fit ](../ip/esd_damage.pdf) + + +[^3]: [New Ballasting Layout Schemes to Improve ESD Robustness of I/O Buffers in Fully Silicided CMOS Process](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5299049) + +--- + +## **Q:** How can current in one place lead to a current somewhere else? + + + +![left fit](../media/l02_latchup.pdf) + + + + +--- + +You must **always handle ESD** on an IC + +- Do everything yourself +- Use libraries from foundry +- Get help [www.sofics.com](http://www.sofics.com) + + +--- + + +#[fit] Thanks! + + + diff --git a/lectures/l03_refbias.md b/lectures/l03_refbias.md new file mode 100644 index 0000000..bb25e1f --- /dev/null +++ b/lectures/l03_refbias.md @@ -0,0 +1,390 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme: Plain Jane, 1 +text: Helvetica +header: Helvetica + + + +## TFE4188 - Lecture 3 +# Reference and bias + +--- + +# Goal for today + +Understand **why** we need reference and bias circuits + +Introduction to **circuit architectures** + +--- + + +#[fit] Why + +--- + + + + + +![left fit](../media/l3_sources.pdf) + +--- + + + +![fit](../media/l3_vsrc.pdf) + +--- + + + +![fit](../media/l3_isrc.pdf) + +--- + + +## **Q:** What quantity do we have access to on an IC that is independent of PVT? + + +![left 50%](https://upload.wikimedia.org/wikipedia/commons/b/b8/Man-scratching-head.gif) + +--- + +#[fit] Bandgap voltage reference + +--- + +![left fit](../media/l3_bjtonly.pdf) + +## **Q:** How does VBE change with temperature? + + + + $$ I_D = I_S \left(e^{\frac{V_{BE}}{V_T}} - 1\right) + I_B$$ + + + + $$ I_D \approx I_S e^{\frac{ V_{BE}}{V_T}}$$ + + + + $$V_T = \frac{kT}{q}$$ + + + $$ V_{BE} = \frac{k T}{q} \ln{\frac{I_D}{I_S}}$$ + + + + +--- + +## **Q:** The current is proportional to temperature (PTAT), why? + + + +![left fit](../media/l3_ptat.pdf) + +--- + +## **Q:** How can we combine a CTAT voltage with a PTAT current to get a constant voltage? + +--- + + + +![original](../media/l3_bgsim.pdf) + +--- + + + +![original](../media/l3_bgsimtfs.pdf) + +--- + +## **Q:** How does a VI converter circuit work? + + + +![inline 200%](../media/l3_vi.pdf) + + +--- + +#[fit] Low voltage bandgap + +--- + + + +## **Q:** What is the current in R1 and R2? + + + + + +![right fit](../media/l3_ptat1.pdf) + + +--- + +## **Q:** Is the current through R2 the same without the OTA? + + + + +![right fit](../media/l3_ptat2.pdf) + + + + +--- + + + +#[fit] Bias + Sometimes we just need a current + +--- + + +## **Q:** Why is 1/Z proportional to transistor transconductance? + +![left fit](../media/l3_gmcell.pdf) + + + + +--- + + +#[fit] Thanks! + +--- diff --git a/lectures/l04_afe.md b/lectures/l04_afe.md new file mode 100644 index 0000000..d485f4e --- /dev/null +++ b/lectures/l04_afe.md @@ -0,0 +1,673 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme: Plain Jane, 1 +text: Helvetica +header: Helvetica + + + +## TFE4188 - Lecture 4 +# Analog frontend and filters +--- + + + +#[fit] Why + +--- + + + +The world is analog and is written in the mathematics of calculus [^1] + + +$$ \oint_{\partial \Omega} \mathbf{E} \cdot d\mathbf{S} = \frac{1}{\epsilon_0} \iiint_{V} \rho +\cdot dV$$ +Relates net electric flux to net enclosed electric charge + +$$ \oint_{\partial \Omega} \mathbf{B} \cdot d\mathbf{S} = 0$$ +Relates net magnetic flux to net enclosed magnetic charge + +$$ \oint_{\partial \Sigma} \mathbf{E} \cdot d\mathbf{\ell} = - \frac{d}{dt}\iint_\Sigma \mathbf{B} +\cdot d\mathbf{S}$$ +Relates induced electric field to changing magnetic flux + +$$ \oint_{\partial \Sigma} \mathbf{B} \cdot d\mathbf{\ell} = \mu_0\left( +\iint_\Sigma \mathbf{J} \cdot d\mathbf{S} + \epsilon_0 \frac{d}{dt}\iint_\Sigma +\mathbf{E} \cdot d\mathbf{S} \right)$$ +Relates induced magnetic field to changing electric flux and to current + +![right](../media/earth.png) + +[^1]: [Maxwell's equations](https://en.wikipedia.org/wiki/Maxwell%27s_equations) + +--- + + + +The behavior of particles is written in the mathematics of quantum mechanics + +$$\psi(x,t) = Ae^{j(kx - \omega t)}$$ +Probability amplitude of a particle + + +$$ \frac{1}{2 m} \frac{\hbar}{j^2} \frac{\partial^2}{\partial^2 x}\psi(x,t) + +U(x)\psi(x,t) = -\frac{\hbar}{j}\frac{\partial}{\partial t} \psi(x,t)$$ +Time evolution of the energy of a particle[^2] + + +$$ \frac{n_n}{n_p} = \frac{e^{(E_{p} - \mu) / kT} + 1}{e^{(E_{n} - \mu) / +kT} + 1} $$ +Relates the average number of fermions in thermal equlilibrium to the +energy of a single-particle state[^3] + +[^2]: [Schrödinger equation](https://en.wikipedia.org/wiki/Schrödinger_equation) + +[^3]: [Fermi-Dirac statistics](https://en.wikipedia.org/wiki/Fermi–Dirac_statistics) + +![left](../media/quantum.png) + +--- + + + +[.table-separator: #000000, stroke-width(1)] +[.table: margin(8)] + + + +The abstract digital world is written in the mathematics of boolean algebra[^4] + + +$$ 1 = \text{True} $$, $$ 0 = \text{False} $$ + + +| A | B | NOT(A AND B) | +|:---|:---|:---| +| 0 | 0 | 1 | +| 0 | 1 | 1 | +| 1 | 0 | 1 | +| 1 | 1 | 0 | + +All digital processing can be made with the NOT(A AND B) function! + +![right](../media/zero.png) + +[^4]: [Boolean algebra](https://en.wikipedia.org/wiki/Boolean_algebra) + +--- + + + +# People that make digital circuits can easily reuse the work of others + +![right](../media/digital_shoulder.png) + +--- + + + +# People that make analog circuits can learn from others, but need to deal with the real world on their own + +![left](../media/analog_designer.png) + +--- + + + +### Should we do as much as possible in the abstract digital world? + +![inline](../media/analog_designer.png) ![right](../media/digital_shoulder.png) + +--- + + + + + + + +![fit](../media/l4_achai.pdf) + +--- + + + +![fit](../media/l4_radio.pdf) + +--- + + +##[fit] You must know application before you make the AFE! + +--- + +#[fit] Filters + + + +--- + + + +# [fit] A combination of 1'st and 2'nd order stages can synthesize any order filter + +--- + + + +# First order filter + + + +![left fit](../media/l4_first_order.pdf) + +$$ H(s) =\frac{V_o(s)}{V_i(s)} = \frac{ k_1 s + k_0 }{s + w_o}$$ + + +## **Q:** Try to calculate the transfer function from the figure + + + + +--- +# Second order filter + +Bi-quadratic is a general purpose second order filter. + + + +![left fit](../media/l4_biquad.pdf) + + + $$ H(s) = \frac{k_2 s^2 + k_1 s + k_0}{s^2 + \frac{\omega_0}{Q} s + + \omega_o^2}$$ + +## **Q:** Try to calculate the transfer function from the figure + + + +--- + + +## How do we implement the filter sections? + + + +--- + +#[fit] Gm-C + +--- + + + + + +![left fit](../media/l4_gmc.pdf) + + + +$$ V_o = \frac{I_o}{s C} = \frac{\omega_{ti}}{s} V_i $$ + +$$ \omega_{ti} = \frac{G_m}{C}$$ + + +## **Q:** gm = Gm ? + +--- + + + +![fit left ](../media/l4_gmc_diff.pdf) + +$$ s C V_o = G_m Vi $$ + +$$ H(s) = \frac{V_o}{V_i} = \frac{G_m}{sC}$$ + +--- + + + +![fit left ](../media/l4_gmc_diff1.pdf) + +## **Q:** Calculate the transfer function + +--- + + + + +![left fit](../media/l4_gmc1st.pdf) + + + + +$$ H(s) = \frac{ k_1 s + k_0 }{s + w_o}$$ + +$$ H(s) = \frac{s \frac{C_x}{C_a + C_x} + \frac{G_{m1}}{C_a + C_x}}{s + + \frac{G_{m2}}{C_a + C_x}}$$ + +## **Q:** Try and calculate the transfer function + + + +--- + +![fit right](../media/l4_gmcbi.pdf) + + +$$ H(s) = \frac{k_2 s^2 + k_1 s + k_0}{s^2 + \frac{\omega_0}{Q} s + + \omega_o^2}$$ + +$$ H(s) = \frac{ s^2\frac{C_X}{C_X + C_B} + s\frac{G_{m5}}{C_X + C_B} + \frac{G_{m2}G_{m4}}{C_A(C_X + C_B)}} +{s^2 + s\frac{G_{m2}}{C_X + C_B} + \frac{G_{m1}G_{m2}}{C_A(C_X + C_B)} }$$ + + + +--- + +## **Q:** Try and figure out how we could make a transconductor + + + +--- + +#[fit] Active-RC + + + +--- + +## General purpose first order filter + + + + +![left fit](../media/l4_activerc_first.pdf) + +$$ H(s) = \frac{ k_1 s + k_0 }{s + w_o}$$ + +$$ H(s) = \frac{ -\frac{C_1}{C_2}s -\frac{G_1}{ C_2}}{s + \frac{G_2}{ C_2}}$$ + +## **Q:** Try and calculate the transfer function + + + + + + + +--- +## General purpose biquad + + + + +![left fit](../media/l4_activebiquad.pdf) + + + +$$ H(s) = \frac{k_2 s^2 + k_1 s + k_0}{s^2 + \frac{\omega_0}{Q} s + + \omega_o^2}$$ + +$$H(s) = \frac{\left[ \frac{C_1}{C_B}s^2 + \frac{G_2}{C_B}s + (\frac{G_1G_3}{C_A C_B})\right]}{\left[ s^2 + \frac{G_5}{C_B}s + \frac{G_3 G_4}{C_A C_B}\right]}$$ + +--- + +# The OTA is not ideal + +![left fit](../media/l4_activerc.pdf) + + $$ H(s) \approx \frac{A_0}{(1 + s A_o R C)(1 + \frac{s}{w_{ta}})}$$ + + where $$A_0$$ is the gain of the amplifier, and $$\omega_{ta}$$ is the unity-gain frequency. + +## **Q:** In what region does this equation match an ideal integrator 1/sRC response? + + + + +--- + +[A 56 mW Continuous-Time Quadrature Cascaded Sigma-Delta Modulator With 77 dB DR in a Near Zero-IF +20 MHz Band](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4381437) + + + + +![inline](../media/qt_sd.png)![inline](../ip/qt_sd_response.png) + +--- + + +#[fit] Thanks! + +--- diff --git a/lectures/l05_sc.md b/lectures/l05_sc.md new file mode 100644 index 0000000..e045b54 --- /dev/null +++ b/lectures/l05_sc.md @@ -0,0 +1,1036 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme: Plain Jane, 1 +text: Helvetica +header: Helvetica + + + + + + +## TFE4188 - Introduction to Lecture 5 +# Switched-Capacitor Circuits + +--- + + + + + +# Goal + +Understand **why** we would use switched capacitor circuits + +Introduction to **discrete-time**, and **switched capacitor principles** and the **circuits** we need + +--- + + + +#[fit] Why + +--- + +# Active-RC + + + +![left fit](../media/l4_activebiquad.pdf) + + + + +$$H(s) = \frac{\left[ \frac{C_1}{C_B}s^2 + \frac{G_2}{C_B}s + (\frac{G_1G_3}{C_A C_B})\right]}{\left[ s^2 + \frac{G_5}{C_B}s + \frac{G_3 G_4}{C_A C_B}\right]}$$ + + + + +$$\omega_{p|z} \propto \frac{G}{C} = \frac{1}{RC}$$ + + + +--- + + +# Gm-C + + +![fit right](../media/l4_gmcbi.pdf) + +$$ H(s) = \frac{\left[ s^2\frac{C_X}{C_X + C_B} + s\frac{G_{m5}}{C_X + C_B} + \frac{G_{m2}G_{m4}}{C_A(C_X + C_B)}\right]} +{\left[s^2 + s\frac{G_{m2}}{C_X + C_B} + \frac{G_{m1}G_{m2}}{C_A(C_X + C_B)} \right]}$$ + + + + +$$\omega_{p|z} \propto \frac{G_m}{C}$$ + + + +--- + +# Switched capacitor circuits + + + +[A pipelined 5-Msample/s 9-bit analog-to-digital converter](https://ieeexplore.ieee.org/document/1052843) + + + +![right fit](../media/lewis.png) + + + +$$\omega_{p|z} \propto \frac{C_1}{C_2}$$ + + + + +--- + +# Discrete-Time Signals + + +--- + +[.column] + +Define $$ x_c$$ as a continuous time, continuous value signal + +Define $$ +\ell(t) = \begin{cases} +1 & \text{if } t \geq 0 \\ +0 & \text{if } t < 0 +\end{cases} +$$ + + + +Define $$ x_{sn}(t) = \frac{x_c(nT)}{\tau}[\ell(t-nT) - \ell(t - nT - \tau)]$$ + + + +Define $$ x_s(t) = \sum_{n=-\infty}^{\infty}{x_{sn}(t)}$$ + + + +[.column] + +Think of a sampled version of an analog signal as an infinite sum of pulse trains where the area under the pulse train is equal to the analog signal. + +__Why do this?__ + + +--- + + + + + +[.column] + +If $$ x_s(t) = \sum_{n=-\infty}^{\infty}{x_{sn}(t)}$$ + +Then $$ X_{sn}(s) = \frac{1}{\tau}\frac{1 - e^{-s\tau}}{s} x_c(nT)e^{-snT} $$ + +And $$ X_s(s) = \frac{1}{\tau}\frac{1 - e^{-s\tau}}{s} \sum_{n=-\infty}^{\infty}x_c(nT)e^{-snT}$$ + +Thus $$ \lim_{\tau \to 0} \rightarrow X_s(s) = \sum_{n=-\infty}^{\infty}x_c(nT)e^{-snT}$$ + +Or $$ X_s(j\omega) = \frac{1}{T}\sum_{k=-\infty}^{\infty} X_c\left(j\omega - \frac{j k 2 \pi}{T}\right)$$ + +[.column] + +**The spectrum of a sampled signal is an infinite sum of frequency shifted spectra** + +or equivalenty + +**When you sample a signal, then there will be copies of the input spectrum at every $$ nf_s$$** + +However, if you do an FFT of a sampled signal, then all those infinite spectra will fold down between $$ 0 \to f_{s1}/2$$ or $$- f_{s1}/2 \to f_{s1}/2$$ for a complex FFT + + + +--- + +[dt.py](https://github.com/wulffern/aic2023/blob/main/ex/dt.py) + +```python +#- Create a time vector +N = 2**13 +t = np.linspace(0,N,N) + +#- Create the "continuous time" signal with multiple sinusoidal signals and some noise +f1 = 233/N +fd = 1/N*119 +x_s = np.sin(2*np.pi*f1*t) + 1/1024*np.random.randn(N) + 0.5*np.sin(2*np.pi*(f1-fd)*t) + 0.5*np.sin(2*np.pi*(f1+fd)*t) + +#- Create the sampling vector, and the sampled signal +t_s_unit = [1,1,0,0,0,0,0,0] +t_s = np.tile(t_s_unit,int(N/len(t_s_unit))) +x_sn = x_s*t_s + +#- Convert to frequency domain with a hanning window to avoid FFT bin +#- energy spread +Hann = True +if(Hann): + w = np.hanning(N+1) +else: + w = np.ones(N+1) +X_s = np.fft.fftshift(np.fft.fft(np.multiply(w[0:N],x_s))) +X_sn = np.fft.fftshift(np.fft.fft(np.multiply(w[0:N],x_sn))) +``` + +--- + + + +![fit](../media/l5_dtfig.pdf) + +--- + + + +![fit](../media/l5_sh.pdf) + +--- + + + +![fit](../media/l5_shaaf.pdf) + +--- + + + +![fit](../media/l5_subsample.pdf) + +--- + + + +[.column] + +$$ X_s(s) = \sum_{n=-\infty}^{\infty}x_c(nT)e^{-snT}$$ + + + +$$ X_s(z) = \sum_{n=-\infty}^{\infty}x_c[n]z^{-n}$$ + + + + +[.column] + + +For discrete time signal processing we use Z-transform + + +If you're unfamiliar with the Z-transform, read the book or search [https://en.wikipedia.org/wiki/Z-transform](https://en.wikipedia.org/wiki/Z-transform) + + + + +--- + +##[fit] Pole-Zero plots + +If you're not comfortable with pole/zero plots, have a look at + +[What does the Laplace Transform really tell us](https://www.youtube.com/watch?v=n2y7n6jw5d0) + + + +![left fit](../media/l5_sdomain.pdf) + +--- +##[fit] Z-domain + +Spectra repeat every $$2\pi$$ + + +Bi-linear transform + +$$ s = \frac{z -1}{z + 1}$$ + +Warning: First-order approximation [https://en.wikipedia.org/wiki/Bilinear_transform](https://en.wikipedia.org/wiki/Bilinear_transform) + + +![left fit](../media/l5_zdomain.pdf) + +--- +## First order filter + + + +$$ y[n+1] = bx[n] + ay[n] \Rightarrow Y z = b X + a Y$$ + + + +$$ y[n] = b x[n-1] + ay[n-1] \Rightarrow Y = b X z^{-1} + a Y z^{-1} $$ + + + +$$ H(z) = \frac{b}{z-a}$$ + + +Infinite-impulse response (IIR) + +$$ h[n] = \begin{cases} k & \text{if } n < 1 \\ a^{n-1}b + a^n k & \text{if } n \geq 1 \end{cases}$$ + + + Head's up: Fig 13.12 in AIC is wrong + + + +![left fit](../media/l5_zunstable.pdf) + + + + +--- + +## Finite-impulse response(FIR) + + + +$$ H(z) = \frac{1}{3}\sum_{i=0}^2 z^{-1}$$ + +![left fit](../media/l5_fir.pdf) + +--- + +#[fit] Switched-Capacitor + + +--- + + + +## **Q:** How do switched capacitor circuits work? + +--- + + + + +![original fit](../media/l5_scintro.pdf) + +--- + + + +#[fit] Principles + + +--- + +## Switched capacitor gain circuit + +--- + + + +![left fit](../media/l5_scamp.pdf) + + + + +![right fit](../media/l5_scfig.pdf) + +--- + + + + +$$ V_o[n+1] = \frac{C_1}{C_2}V_i[n]$$ + +$$ V_o z = \frac{C_1}{C_2} V_i$$ + +$$ \frac{V_o}{V_i} = H(z) = \frac{C_1}{C_2}z^{-1}$$ + +--- + +## Switched capacitor integrator + + + +--- + +![left fit](../media/l5_scint.pdf) + + + +![right fit](../media/l5_scifig.pdf) + +--- + + + + +$$ V_o[n] = V_o[n-1] + \frac{C_1}{C_2}V_i[n-1]$$ + +$$V_o - z^{-1}V_o = \frac{C_1}{C_2}z^{-1}V_i $$ + + + +$$ H(z) = \frac{C_1}{C_2}\frac{z^{-1}}{1-z^{-1} } = +\frac{C_1}{C_2}\frac{1}{z-1} $$ + +--- + + + +#[fit] Both phases add noise, $$ V_n^2 > \frac{2 k T}{C}$$ + +--- + + + +[.background-color: #000000] +[.text: #FFFFFF] + +[.column] + + + +[Mean](https://en.wikipedia.org/wiki/Mean) +$$ \overline{x(t)} = \lim_{T\to\infty} \frac{1}{T}\int^{+T/2}_{-T/2}{ x(t) dt} $$ + + + +Mean Square +$$ \overline{x^2(t)} = \lim_{T\to\infty} \frac{1}{T}\int^{+T/2}_{-T/2}{ x^2(t) dt} $$ + + + +[Variance](https://en.wikipedia.org/wiki/Variance) +$$ \sigma^2 = \overline{x^2(t)} - \overline{x(t)}^2$$ + +where $$\sigma$$ is the standard deviation. +If mean is removed, or is zero, then +$$ \sigma^2 = \overline{x^2(t)} $$ + +[.column] +Assume two random processes, $$x_1(t)$$ and $$x_2(t)$$ with mean of zero (or removed). + $$ x_{tot}(t) = x_1(t) + x_2(t)$$ + $$ x_{tot}^2(t) = x_1^2(t) + x_2^2(t) + 2x_1(t)x_2(t)$$ + +Variance (assuming mean of zero) +$$ \sigma^2_{tot} = \lim_{T\to\infty} \frac{1}{T}\int^{+T/2}_{-T/2}{ x_{tot}^2(t) dt} $$ +$$ \sigma^2_{tot} = \sigma_1^2 + \sigma_2^2 + \lim_{T\to\infty} \frac{1}{T}\int^{+T/2}_{-T/2}{ 2x_1(t)x_2(t) dt} $$ + +**Assuming uncorrelated processes (covariance is zero), then +$$ \sigma^2_{tot} = \sigma_1^2 + \sigma_2^2 $$** + + + +--- + +## Sub-circuits for SC-circuits + + + +--- + + + +#[fit] OTA + +--- + + + +## **Q:** How many different OTAs do you know? + +--- + + + +![fit](../media/diff_ota.png) + +--- + + + +![fit](../media/diff_ota_bias.png) + + + +--- + + + +#[fit] Switches + +--- + + + +![original fit](../media/l5_sw1.pdf) + +--- + + + +![original fit](../media/l5_sw2.pdf) + +--- + + + +![original fit](../media/l5_sw3.pdf) + +--- + + + +#[fit] Non-overlapping clocks + +--- + + + + +![original fit](../media/l5_novl.pdf) + +--- + + + +#[fit] Example + +--- + + + +## **Q:** What is the gain? + +--- + + + +![fit](../media/l5_scex.pdf) + +--- + + + +# In the book that you really should read + +Parasitic sensitive integrator + +Gain circuit that zero's OTA offset + +Correlated double sampling + +VCO + +Peak detectors + +--- + + + +#[fit] Thanks! + +--- diff --git a/lectures/l06_adc.md b/lectures/l06_adc.md new file mode 100644 index 0000000..3c25874 --- /dev/null +++ b/lectures/l06_adc.md @@ -0,0 +1,953 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme: Plain Jane, 1 +text: Helvetica +header: Helvetica + + + + +## TFE4188 - Introduction to Lecture 6 +# Oversampling and Sigma-Delta ADCs + + + +--- + + + + + +## Goal for today + +Understand **why** there are different ADCs + +Introduction to **oversampling** and **delta-sigma** modulators + +--- + + + +[1999, R. Walden: Analog-to-digital converter survey and analysis](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=761034) + + + +![original 100%](../media/l6_walden.png) + +--- + +[B. Murmann, ADC Performance Survey 1997-2022 (ISSCC & VLSI Symposium)](https://web.stanford.edu/~murmann/adcsurvey.html) + + + +$$ FOM_W = \frac{P}{2^B f_s}$$ + +Below 10 fJ/conv.step is good. + +Below 1 fJ/conv.step is extreme. + + + +![left fit](../media/l6_mwald.pdf) + +--- + +People from NTNU have made some of the worlds best ADCs + + + +[A Compiled 9-bit 20-MS/s 3.5-fJ/conv.step SAR ADC in 28-nm FDSOI for Bluetooth Low Energy Receivers](https://ieeexplore.ieee.org/document/7906479) + +[A 68 dB SNDR Compiled Noise-Shaping SAR ADC With On-Chip CDAC +Calibration](https://ieeexplore.ieee.org/document/9056925) + + + +![left fit](../media/our_work.png) + +--- + + + +[B. Murmann, ADC Performance Survey 1997-2022 (ISSCC & VLSI Symposium)](https://web.stanford.edu/~murmann/adcsurvey.html) + + + +$$FOM_S = SNDR + 10\log\left(\frac{f_s/2}{P}\right)$$ + +Above 180 dB is extreme + +![right fit](../media/l6_msch.pdf) + +--- + +#[fit] Quantization + +--- + + + +![inline fit](../media/l6_adc.pdf) + +--- + + + +![inline fit](../media/l6_ct.pdf) + +--- + + + + +![inline fit](../media/l6_cten.pdf) + +--- + + + +[.column] + + See [The intermodulation and distortion due to quantization of sinusoids](https://ieeexplore.ieee.org/document/1164729) for details + + + + +$$e_n(t) = \sum_{p=1}^\infty{A_p\sin{p\omega t}}$$ + +where p is the harmonic index, and + + $$ +A_p = +\begin{cases} +\delta_{p1}A + \sum_{m = + 1}^\infty{\frac{2}{m\pi}J_p(2m\pi A)} &, p = \text{ odd} \\ + 0 &, p = \text{ even} +\end{cases} +$$ + + $$ +\delta_{p1} +\begin{cases} +1 &, p=1 \\ +0 &, p \neq 1 +\end{cases} +$$ + +and $$J_p(x)$$ is a Bessel function of the first kind, _A_ is the amplitude of the input signal. + +[.column] + +If we approximate the amplitude of the input signal as + +$$A = \frac{2^n - 1}{2} \approx 2^{n-1}$$ + +where n is the number of bits, we can rewrite as + + + + + +--- + +$$e_n(t) = \sum_{p=1}^\infty{A_p\sin{p\omega t}}$$ + +$$ A_p = \delta_{p1}2^{n-1} + \sum_{m=1}^\infty{\frac{2}{m\pi}J_p(2m\pi + 2^{n-1})}, p=odd$$ + + + + +--- + +$$\overline{e_n(t)} = 0 $$ + + + +$$\overline{e_n(t)^2} = \frac{\Delta^2}{12}$$ + +--- + + + +$$ SQNR = 10 \log\left(\frac{A^2/2}{\Delta^2/12}\right) = 10 \log\left(\frac{6 A^2}{\Delta^2}\right) $$ + +$$ \Delta = \frac{2A}{2^B}$$ + +$$ SQNR = 10 \log\left(\frac{6 A^2}{4 A^2/2^B}\right) = 20 B \log 2 + 10 \log 6/4$$ + +$$ SQNR \approx 6.02 B + 1.76$$ + + + +--- + +![fit](../media/l6_q_1.pdf) + + + +--- + +![fit](../media/l6_q_10.pdf) + + + + +--- + +#[fit] Oversampling + +--- + + +in-band quantization noise for a oversampling ratio (OSR) + +$$ \overline{e_n(t)^2} =\frac{\Delta^2}{12 OSR}$$ + + + +$$ SQNR = 10 \log\left(\frac{6 A^2}{\Delta^2/OSR}\right) = 10 \log\left(\frac{6 A^2}{\Delta^2}\right) + 10 \log(OSR)$$ + +$$ SQNR \approx 6.02B + 1.76 + 10 \log(OSR)$$ + + + +$$ 10 \log(2) \approx 3 dB$$ + + + +$$ 10 \log(4) \approx 6 dB$$ + + +0.5-bit per doubling of OSR + +--- + + + +```python +def oversample(x,OSR): + N = len(x) + y = np.zeros(N) + + for n in range(0,N): + for k in range(0,OSR): + m = n+k + if (m < N): + y[n] += x[m] + return y +``` + + +--- + + + +![fit](../media/l6_osr_2.pdf) + +--- + + + +![fit](../media/l6_osr_4.pdf) + + + + + +--- + + +#[fit] Noise Shaping + + + + +--- + +![inline fit](../media/l4_sdloop.pdf) + +--- + + + +![inline fit](../media/l4_sd.pdf) + +--- + + + + + +![left fit](../media/l6_sdadc.pdf) + + +## Sample domain + +$$ y[n] = e[n] + h*(u[n] - y[n])$$ + +## Z-Domain + +$$ Y(z) = E(z) + H(z)\left[U(z) - Y(z)\right]$$ + +--- + +[.column] + +## Signal transfer function + +Assume U and E are uncorrelated, and E is zero + +$$Y = HU - HY $$ + +$$ STF = \frac{Y}{U} = \frac{H}{1 + H} = \frac{1}{1 + \frac{1}{H}}$$ + + + +[.column] + +## Noise transfer function + +Assume U is zero + +$$ Y = E + HY \rightarrow NTF = \frac{1}{1 + H}$$ + + + +--- + +## Combined transfer function + + + +$$Y(z) = STF(z) U(z) + NTF(z) E(z)$$ + + + +--- + +#[fit] First-Order Noise-Shaping + +--- + + + + +$$H(z) = \frac{1}{z-1}$$ + + + +$$STF = \frac{1/(z-1)}{1 + 1/(z-1)} = \frac{1}{z} = z^{-1}$$ + + + +$$NFT = \frac{1}{1 + 1/(z-1)} = \frac{z-1}{z} = 1 - z^{-1}$$ + +--- + + + +$$z = e^{sT} \overset{s=j\omega}{\rightarrow} e^{j\omega T} = e^{j2 \pi f/f_s}$$ + + + +$$NTF(f) = 1- e^{-j2 \pi f/f_s} $$ + +$$ = \frac{e^{j \pi f/f_s} -e^{-j \pi f/f_s}}{2j}\times 2j \times e^{-j\pi f/f_s}$$ + +$$ = \sin{\frac{\pi f}{f_s}} \times 2j \times e^{-j \pi f/f_s}$$ + + + + + +$$|NFT(f)| = \left|2 \sin\left(\frac{\pi f}{f_s}\right)\right|$$ + +--- + + + +$$ P_s = A^2/2$$ + + + + +$$ P_n = \int_{-f_0}^{f_0} \frac{\Delta^2}{12}\frac{1}{f_s}\left[2 \sin\left(\frac{\pi f}{f_s}\right)\right]^2 dt$$ + + + +$$ \vdots $$ + + +$$SQNR = 6.02 B + 1.76 - 5.17 + 30 \log(OSR)$$ + + + + + +--- + +Assume 1-bit quantizer, what would be the maximum ENOB? + +| OSR | Oversampling | First-Order | Second Order | +|:----:|:------------:|:-----------:|:------------:| +| 4 | 2 | 3.1 | 3.9 | +| 64 | 4 | 9.1 | 13.9 | +| 1024 | 6 | 15.1 | 23.9 | + + + +--- + + + + +```python +# x_sn is discrete time, continuous value input +dither = 0 +M = len(x_sn) +y_sd = np.zeros(M) +x = np.zeros(M) +for n in range(1,M): + x[n] = x[n-1] + (x_sn[n]-y_sd[n-1]) + y_sd[n] = np.round(x[n]*2**bits + + dither*np.random.randn()/4)/2**bits +``` +--- + + + +![fit](../media/l6_sd_d0_b1.pdf) + +--- + + + +![fit](../media/l6_sd_d1_b1.pdf) + +--- + + + +[A 56 mW Continuous-Time Quadrature Cascaded Sigma-Delta Modulator With 77 dB DR in a Near Zero-IF +20 MHz Band](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4381437) + + +![inline](../media/qt_sd.png)![inline](../ip/qt_sd_response.png) + +--- + + +[Analogue-to-digital converter](https://patents.google.com/patent/US8947280B2/en?inventor=carsten+wulff&oq=carsten+wulff) + +![inline](../media/l6_patent.pdf) + +--- + +#[fit] Thanks! + diff --git a/lectures/l07_vreg.md b/lectures/l07_vreg.md new file mode 100644 index 0000000..367e0de --- /dev/null +++ b/lectures/l07_vreg.md @@ -0,0 +1,600 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme:Plain Jane,1 + + + +## TFE4188 - Introduction to Lecture 7 +# Voltage regulation + + + +--- + + + + + +# Goal + +**Why** do we need voltage regulation + +Introduction to **linear regulators** + +Introduction to **switched regulators** + +--- + + + +#[fit] Why + +--- + +# Voltage source + + + +![left 70%](../media/lindens_handbook_of_batteries.png) + + + +| |Chemistry| Voltage [V] | +|----|:----|----:| +| Primary Cell| LiFeS2 + Zn/Alk/MnO2 + LiMnO2 | 0.8 - 3.6 | +| Secondary Cell| Li-Ion | 2.5 - 4.3 | +| USB | - | 4.0 - 6.5 (20)| + +--- + + + + +[.column] + +## Core voltage + + + +| Node [nm] | Voltage [V] | +|:---------:|:-----------:| +| 180 | 1.8 | +| 130 | 1.5 | +| 55 | 1.2 | +| 22 | 0.8 | + +[.column] + + + +## IO voltage + + + +| Voltage [V]| +| ----:| +|5.0| +|**3.0**| +|*1.8*| +|1.2| + +--- + + + +![original fit](../media/l9_sarc.pdf) + +--- + + + + +| Name | Voltage | Min [nA] | Max [mA] | PWR DR [dB] | +|:---------:|:--: |:--------:|:--------:|:-----------:| +| VDD\_VBUS |5 |10 | 500 | 77 | +| VDD\_VBAT |4 |10 | 400 | 76 | +| VDD\_IO |1.8 |10 | 50 | 67 | +| VDD\_CORE |0.8 |10 | 350 | 75 | + +--- + + + +![original fit](../media/l9_nrf53.pdf) + +--- + + + +#[fit] Linear Regulators + +--- + + + +## PMOS pass-fet + + + + +![left fit](../media/l9_ldo_pmos.pdf) + +--- + +## NMOS pass-fet + + + +![right fit](../media/l9_ldo_nmos.pdf) + +--- + + + +#[fit]LDO's in JSSC + +--- + + + +[A Scalable High-Current High-Accuracy Dual-Loop Four-Phase Switching LDO for Microprocessors](https://ieeexplore.ieee.org/document/9639005) + +![inline fit](../ip/l9_jssc_ldo2.pdf) + +--- + + + +![original fit](../ip/l9_jssc_ldo2_arch0.pdf) + +--- + + + +![original fit](../ip/l9_jssc_ldo2_arch.pdf) + +--- + + + +#[fit] Switched Regulators + +--- + + + +![left fit](../media/l9_mouser.png) + + +[Reference Guide to Switched DC/DC Conversion](https://emea.info.mouser.com/dc-dc-converter-guide?cid=homepage&pid=mouser) + +--- + +## Inductive DC/DC converters + +--- + + + +![left fit](../media/l7_buck.pdf) + + + + +$$I_x(t) = \frac{1}{L} \int{V_x(t) dt}$$ + + + +$$V_o(t) = \frac{1}{C} \int{(I_x(t) - I_o(t))}dt$$ + + + + +--- + +## Pulse width modulation (PWM) + + + +[Jupyter PWM BUCK model](https://github.com/wulffern/aic2023/blob/main/jupyter/buck.ipynb) + + + +![right fit](../media/l07_buck_pwm_fig.svg) + + + + +--- + +![original fit](../media/l9_sw_nRF53.png) + +--- + +## Pulsed Frequency Mode (PFM) + + + +![right fit](../media/l9_sw_arch.pdf) + +--- + + + + + +![fit](../media/l9_sw_state.pdf) + +--- + + + +[Jupyter PFM BUCK model](https://github.com/wulffern/aic2023/blob/main/jupyter/buck_pfm.ipynb) + +![right fit](../media/l07_buck_pfm_fig.svg) + +--- + + + + + +#[fit] BUCKs in JSSC + +--- + + + +[A 10-MHz 2–800-mA 0.5–1.5-V 90% Peak Efficiency Time-Based Buck Converter With Seamless Transition Between PWM/PFM Modes](https://ieeexplore.ieee.org/document/8187654) + + + +![inline fit](../ip/l9_jssc_sw3.pdf) + +--- + + + +![original fit](../ip/l9_jssc_sw3_why.pdf) + +--- + + + +![original fit](../ip/l9_jssc_sw3_arch.pdf) + +--- + + +## Boost + +![right fit](../media/l9_sw_boost.pdf) + +--- + +#[fit] Thanks! diff --git a/lectures/l08_pll.md b/lectures/l08_pll.md new file mode 100644 index 0000000..9c49e54 --- /dev/null +++ b/lectures/l08_pll.md @@ -0,0 +1,612 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme:Plain Jane,1 + + + +## TFE4188 - Introduction to Lecture 8 +# Clocks and PLLs + + + + +--- + + + + + +# Goal + +**Why** do we need to generate clocks + +Introduction to **PLLs** + +--- + + + +#[fit] Why + +--- + + + +1. 32 MHz crystal +2. 32 KiHz crystal +3. In PCB antenna +4. DC/DC inductor + + +![left](../media/l10_dk.pdf) + + + +--- + + + +![fit](../media/l10_clockic.pdf) + +--- + + + +![fit](../media/logic.pdf) + +--- + +#[fit] PLL + + + +--- + +![fit](../media/l10_fb.pdf) + +--- + + + +![fit](../media/l10_freq_fb.pdf) + +--- + + + +![fit](../media/l08_sun_pll.pdf) + +--- + +#[fit]PLLs need calculation! + + \#noCowboyDesign + + + + +--- + +$$ \phi(t) = 2 \pi \int_0^t f(t) dt$$ + +--- + + + + +![left fit](../media/l10_pll_sm.pdf) + +## Loop gain + + + + +$$ \frac{\phi_d}{\phi_{in}} = \frac{1}{1 + L(s)}$$ + + +$$ L(s) = \frac{ K_{osc} K_{pd} K_{lp} H_{lp}(s) }{N s} $$ + + + + + +--- + +## Controlled oscillator + + + +$$K_{osc} = 2 \pi\frac{ df}{dV_{cntl}}$$ + + + +![right fit](../media/SUN_PLL_ROSC.pdf) + +--- + + +### [SUN\_PLL\_SKY130NM/sim/ROSC/](https://github.com/wulffern/sun_pll_sky130nm/tree/main/sim/ROSC) + + + +![right fit](../media/SUN_PLL_ROSC_KVCO.pdf) + +--- + +## Phase detector and charge pump + + + + +$$ K_{pd} = \frac{I_{cp}}{2 \pi} $$ + + +![right fit](../media/SUN_PLL_CP.pdf) + +--- + +## Loop filter + + + + +$$ K_{lp}H_{lp}(s)= K_{lp}\left(\frac{1}{s} + \frac{1}{\omega_z}\right) $$ + +$$ K_{lp}H_{lp}(s) = \frac{1}{s(C_1 + C_2)}\frac{1 + s R C_1}{1 + +sR\frac{C_1C_2}{C_1 + C_2}}$$ + + +![right fit](../media/SUN_PLL_LP.pdf) + +--- + +## Divider + + + +$$ K_{div} = \frac{1}{N}$$ + + +![right fit](../media/SUN_PLL_DIV.pdf) + + +--- +[.column] + + +## Loop transfer function + + + +$$ L(s) = \frac{ K_{osc} K_{pd} K_{lp} H_{lp}(s) }{N s} $$ + +[.column] + + +### Python model + + +[sun\_pll\_sky130nm/py/pll.py](https://github.com/wulffern/sun_pll_sky130nm/blob/main/py/pll.py) + + +--- + + + +![fit](../media/pll.pdf) + +--- + + + +![fit](../media/sun_pll_lay_typ.pdf) + + + +--- + + + + + +--- + +![left fit](../media/sun_pll_layout0.png) +![right fit](../media/sun_pll_layout1.png) + + + + + + +--- + + + +## [SUN\_PLL\_SKY130NM](https://github.com/wulffern/sun_pll_sky130nm) + +--- + + +#[fit] JSSC PLLs + +--- + + +![fit](../ip/l10_jssc_pll1.pdf) + +--- + + +![fit](../ip/l10_jssc_pll1_1.pdf) + +--- + + +![fit](../ip/l10_jssc_pll2_0.pdf) + +--- + + +![fit](../ip/l10_jssc_pll2_1.pdf) + +--- + + +![fit](../ip/l10_jssc_pll3_0.pdf) + +--- + + +![fit](../ip/l10_jssc_pll3_1.pdf) + +--- + + + +#[fit] Thanks! + + diff --git a/lectures/l09_osc.ipynb b/lectures/l09_osc.ipynb new file mode 100644 index 0000000..0c5899d --- /dev/null +++ b/lectures/l09_osc.ipynb @@ -0,0 +1,548 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# TFE4188 - Lecture 10 - Oscillators" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Oscillations refresher" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "\n", + "Assume a complex number\n", + "\n", + "$$z = a + ib$$\n", + "\n", + "What happens when we do\n", + "\n", + "$$ y = e^{zt}$$\n", + "\n", + "where $t$ is time?\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "def plotiqax(axsize):\n", + " fig,ax = plt.subplots(1, 1)\n", + " ax.axis([-axsize,axsize,-axsize,axsize])\n", + " ax.spines['left'].set_position('center')\n", + " ax.spines['bottom'].set_position('center')\n", + " ax.spines['right'].set_color('none')\n", + " ax.spines['top'].set_color('none')\n", + " ax.xaxis.set_ticks_position('bottom')\n", + " ax.yaxis.set_ticks_position('left')\n", + " ax.grid(True)\n", + " return ax" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGTCAYAAACIx3DvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAsMElEQVR4nO3df1jVZZ7/8ddRDyCDiiIIaipqSplJUhpMoxAqqFcLm5eTrXNprlm5Olemm2vujK41rWWWTa1lbiU5hTnulTg2rg2h6Pg7f7D+SLnSVCYFf0BSasIR7u8ffj0T8UPRw33wnOfjus51zflw35/7/Z6bYy8+53PAYYwxAgAAsKSJtwsAAAD+hfABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AD5k7ty5uu+++9SiRQtFREQoPT1d+fn515y3YsUKxcTEKCgoSL1799aaNWssVAvAXxE+AB+yYcMGTZo0Sdu2bVN2drZcLpeGDBmiCxcu1Dpny5YtevTRRzV+/Hjt2bNH6enpSk9P1/79+y1WDsCfOPjDcoDvOnPmjCIiIrRhwwYNGDCgxjGPPPKILly4oE8//dR97P7771dsbKwWLVpkq1QAfoQrH4APKy0tlSS1adOm1jFbt27VoEGDqhxLSUnR1q1ba51TVlam7777zv0oLS3VmTNnxM8yAK5HM5uLrVq1yuZygF+rrKzUf/7nf+qOO+7QkSNHdOTIkRrHFRYW6m9/+1uV12dRUZGOHz9e62t22bJlWr58ebXjmZmZCg4O9kwDABqNtLQ0j57PaviQpMGDB8vpdNpe1mtcLpeys7Pp2080pr4nT56sM2fOaP369erYsWOt4xwOh2JjYzVs2DD3sYKCAmVlZVU59mPJyclauHCh+3lJSYl69OihpKQkhYWFea6JRq4x7bdN9O1/fXua9fDhdDr9atOuom//4u2+J0+erDVr1mjjxo2Kjo6uc2xkZKSKi4ur1Hv27FlFRkbW2oPT6VRISEiNx9lv/0HfuFHc8wH4EGOMJk+erJUrV2rdunXXDB6SFB8fr5ycnCrHsrOzFR8f31BlAvBz1q98AGg4kyZNUmZmplatWqUWLVqoqKhIktSqVSs1b95ckjRmzBh16NBBc+fOlSQ9/fTTGjhwoF599VUNHz5cH3/8sXbu3KnFixd7rQ8Avo0rH4APefvtt1VaWqrExERFRUW5Hz++ObSgoECFhYXu5wkJCcrMzNTixYvVp08f/c///I+ysrJ01113eaMFAH6AKx+AD7mej7rm5uZWOzZy5EiNHDmyASoCgOq48gEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgfgYzZu3KiHHnpI7du3l8PhUFZWVp3jc3Nz5XA4qj2KiorsFAzA7xA+AB9z4cIF9enTRwsXLqzXvPz8fBUWFrofERERDVQhAH/XzNsFAPCsoUOHaujQofWeFxERodDQUM8XBAA/YT18uFwu20t61dV+6ds/NMa+L1++XGc9ly9fliTFxsaqrKxMvXr10m9/+1slJCTUOqesrExlZWXu5yUlJZKu9N2Yem9ojXG/baBv/+vb6XR69JwOY4zx6BnrsGrVKltLAZCUnp6uGTNm6P777691zIkTJ7R//35169ZNly9fVnZ2tnJzczVv3jx169atxjnLli3T8uXLqx3PzMxUcHCwx+oH0DikpaV59HzWw8fgwYM9nqAaM5fLpezsbPr2E42t74CAAK1YsaLe/3AkJyfrtttuU0ZGRo1fr+nKR48ePVRYWKiwsLCbKfmW0tj22xb69r++Pf1DhfW3XZxOp19t2lX07V8aU9/NmjWrdy39+/fXpk2bap3ndDoVEhJS4/HG0rdN9O1f/LVvT+LTLgCqycvLU1RUlLfLAOCj+LQL4GPOnz+vw4cPu58fPXpUeXl5atOmjTp16qTnnntOJ06c0NKlSyVJr7/+uqKjo9WrVy9dunRJ7777rtatW6e//OUv3moBgI8jfAA+ZufOnUpKSnI/nzp1qiRp7NixysjIUGFhoQoKCtxfLy8v17Rp03TixAkFBwfr7rvv1ueff17lHADgSYQPwMckJiaqrvvIf3oT6fTp0zV9+vQGrgoA/o57PgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGBVM28XAMC/VFQa7ThaotPfX1JEiyD1i26jpk0c3i4LgEVc+QB8zMaNG/XQQw+pffv2cjgcysrKuuac3Nxc9e3bV4GBgerevbsyMjIapLa1+wv1wMvr9Oh/b9PTH+fp0f/epgdeXqe1+wsbZD0AjRPhA/AxFy5cUJ8+fbRw4cLrGn/06FENHz5cSUlJysvL05QpU/T444/rs88+82hda/cXauKHu1VYeqnK8aLSS5r44W4CCOBHeNsF8DFDhw7V0KFDr3v8okWLFB0drVdffVWSdMcdd2jTpk1asGCBUlJSPFJTRaXRnNVfytTwNSPJIWnO6i81+M5I3oIB/ID18OFyuWwv6VVX+6Vv/9AY+758+XKd9WzZskUPPvhglTGDBg3StGnTap1XVlamsrIy9/OSkhJJV/quac72oyXVrnj8mJFUWHpJWw+fVv/oNtdqqdFojPttA337X99Op9Oj57QePrKzs20v2SjQt39pTH3v2rWrzn84vv76a3Xp0kVr1qxxHzt+/Li+++47rVy5UoGBgdXmLFu2TMuXL692fP369QoODq5ew1mHpKbXrPUvf92u4oM1XR9p3BrTfttE3/4jLS3No+ezHj4GDx7s8QTVmLlcLmVnZ9O3n2iMfcfFxWnYsGG1fj04OFg9e/asMsbhuPLWR2pqqpo3b15tTnJycpV7SkpKStSjRw8lJSUpLCys2viwoyVa+tXOa9Y65Bf9b7krH41tv22gb//r29Oshw+n0+lXm3YVffuXxtR3s2bN6qwlKipKZ8+erTKmuLhYLVu2VMuWLWuc43Q6FRISUuPxmtaK7x6hqFZBKiq9VON9Hw5Jka2CFN894pa856Mx7bdN9I0bxaddAD8XHx+vnJycKseys7MVHx/vsTWaNnFo9kN3SroSNH7s6vPZD915SwYPAPVH+AB8zPnz55WXl6e8vDxJVz5Km5eXp4KCAknSc889pzFjxrjHP/XUU/r66681ffp0HTp0SG+99Zb++Mc/6plnnvFoXal3RentX/VVZKugKscjWwXp7V/1VepdUR5dD0DjxUdtAR+zc+dOJSUluZ9PnTpVkjR27FhlZGSosLDQHUQkKTo6Wn/+85/1zDPP6Pe//706duyod99912Mfs/2x1LuiNPjOSH7DKeDnCB+Aj0lMTJQxtX9ipKbfXpqYmKg9e/Y0YFV/17SJQ/Hdqt+UCsB/8LYLAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIH4IMWLlyoLl26KCgoSP3799eOHTtqHZuRkSGHw1HlERQUZLFaAP6G8AH4mOXLl2vq1KmaPXu2du/erT59+iglJUWnT5+udU7Lli1VWFjofhw/ftxixQD8DeED8DGvvfaaJkyYoHHjxunOO+/UokWLFBwcrPfff7/WOQ6HQ5GRke5Hu3btLFYMwN80s72gy+WyvaRXXe2Xvv2Dt/suLy/Xrl279Oyzz1ap4cEHH9TmzZtrrKuiokLnz59X586dVVlZqdjYWL3wwgvq1atXreuUlZWprKzM/bykpETSlb79ac+9vd/eQt/+17fT6fToOR3GGOPRM9Zh1apVtpYC/FJJSYn++Z//WS+99JJiYmLcxzMyMnTgwAG98sor1eYcOnRIhYWF6ty5sy5evKisrCx9+eWXeuONN9S2bdsa11m2bJmWL19e7XhmZqaCg4M91xCARiEtLc2j57MePgYPHuzxBNWYuVwuZWdn07ef8HbfJ0+eVJcuXbRx40bdf//97uMzZszQX//6V23evPma53C5XLr77rv1y1/+UnPmzKlxTE1XPnr06KHCwkKFhYXdfCO3CG/vt7fQt//17ekfKqy/7eJ0Ov1q066ib//irb6joqLUtGlTFRcXV1n/7NmzioqKuq6anE6n7rnnHh09erTW8U6nUyEhITUeZ7/9B33jRnHDKeBDAgICFBcXp5ycHPexyspK5eTkKD4+/rrOUVFRoX379ikqKqqhygTg56xf+QDQsKZOnaqxY8fq3nvvVb9+/fT666/rwoULGjdunCRpzJgx6tChg+bOnStJev7553X//fere/fuOnfunF555RUdP35cjz/+uDfbAODDCB+Aj3nkkUd05swZzZo1S0VFRYqNjdXatWvdH58tKChQkyZ/v+j57bffasKECSoqKlLr1q0VFxenLVu26M477/RWCwB8HOED8EGTJ0/W5MmTa/xabm5ulecLFizQggULLFQFAFdwzwcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB+AD1q4cKG6dOmioKAg9e/fXzt27Khz/IoVKxQTE6OgoCD17t1ba9assVQpAH9E+AB8zPLlyzV16lTNnj1bu3fvVp8+fZSSkqLTp0/XOH7Lli169NFHNX78eO3Zs0fp6elKT0/X/v37LVcOwF8QPgAf89prr2nChAkaN26c7rzzTi1atEjBwcF6//33axz/+9//XqmpqXr22Wd1xx136IUXXlDfvn31X//1X5YrB+AvmtlayBijixcvqri4WE6n09ayXudyueibvq0pLy/Xzp07NWnSJBUXF7uPP/DAA8rNzdWECROqzdm8ebMmTpxYZfwvfvELrVmzpsqxHysrK1N5ebn7+bfffitJKikp8VQrtwRv77e30Lf/9R0cHKwWLVrI4XB45JwOY4zxyJmu4cyZM4qIiLCxFAAA8LDTp08rPDzcI+eyduUjICBAQUFB2rdvn1q3bm1rWa/79ttv1bt3b/r2E97uu7CwUL1799b//u//6r777nMfnz17trZu3aq//OUv1eZERkZq4cKFGjFihPvYe++9p1deeUWHDh2qcZ2fXvn429/+pgEDBmj37t3q1KmTBztq3Ly9395C3/7X9+23366AgACPndNa+HA4HLp06ZJat26tsLAwW8s2CvRN37a0aNFCTZs21aVLl6qs//3336tjx4411hQVFaWLFy9W+dqFCxfUvn37evfAfvsP+vavviV57C0XiRtOAZ8SEBCguLg45eTkuI9VVlYqJydH8fHxNc6Jj4+vMl6SsrOzax0PADfL2pUPAHZMnTpVY8eO1b333qt+/frp9ddf14ULFzRu3DhJ0pgxY9ShQwfNnTtXkvT0009r4MCBevXVVzV8+HB9/PHH2rlzpxYvXuzNNgD4MGvhIzAwUI888ogCAwNtLdko0Dd92/bII4/ozJkzmjVrloqKihQbG6u1a9eqXbt2kqSCggI1afL3i54JCQnKzMzUb37zG82cOVO33367srKydNddd133mlffC/bke8K3gsaw395A3/7X9+zZsz3at7VPu0jSqlWrNGzYML/7iNKaNWvo20/4a9/FxcVq27atzp4961fvhfvrftO3//Xt6X655wMAAFhF+AAAAFYRPgAAgFWEDwAAYFWDhI9jx45p/Pjxio6OVvPmzdWtWzfNnj1bLperznmXLl3SpEmTFBYWppCQEI0YMUKnTp1qiBIbzIsvvqiEhAQFBwcrNDT0uuY89thjcjgcVR6pqakNW6iH3UjfxhjNmjVLUVFRat68uQYNGqSvvvqqYQv1sJKSEo0ePVotW7ZUaGionnjiCf3www91zklMTKy230899ZSlim/cwoUL1aVLFwUFBal///7asWNHneNXrFihmJgYBQUFqXfv3lqzZo2lSj2rPn1nZGRU29ugoCCL1d68jRs36qGHHlL79u3lcDiUlZV1zTm5ubnq27evAgMD1b17d2VkZDR4nZ5W375zc3Or7bXD4VBRUZGdgj1k7ty5uu+++9SiRQtFREQoPT1d+fn515x3s6/vBgkfhw4dUmVlpd555x0dOHBACxYs0KJFi/Thhx/WOe+ZZ57R6tWrtWLFCm3YsEEnT57Uww8/3BAlNpjy8nKNHDlSEydOrNe81NRUFRYWuh/Lli1roAobxo30PW/ePL3xxhtatGiRtm/frp/97GdKSUnRpUuXGrBSzxo9erQOHDig7Oxsffrpp9q0aZPeeuuta86bMGFClf2eN2+ehWpv3PLlyzV16lTNnj1bu3fvVp8+fZSSkqLTp0/XOH7Lli169NFHNX78eO3Zs0fp6elKT0/X/v37LVd+c+rbtyS1bNmyyt4eP37cYsU378KFC+rTp48WLlx4XeOPHj2q4cOHKykpSXl5eZoyZYoef/xxffbZZw1cqWfVt++r8vPzq+z3rfY3zDZs2KBJkyZp27Ztys7Olsvl0pAhQ3ThwoVa53jk9W0smTdvnmnXrp0pLy+v8evnzp0zTqfTrFixwn3s4MGDRpLZunWrrTI9ZsmSJaZVq1amvLzcZGVl1dq3McaMHTvWpKWl2SuuAV1v35WVlSYyMtK88sor7mPnzp0zgYGBZtmyZbbKvSlffvmlkWS++OIL97HVq1cbh8Nhjh07Vuu8gQMHmqefftpChZ7Tr18/M2nSJPfziooK0759ezN37lxjjDFnz541kszZs2eNMcb88pe/NMOHD69yjv79+5snn3zSXtEecK2+f/p9fvX731dIMitXrqx2/Md9T58+3fTq1avK1x955BGTkpJiqUrPu56+169fbySZb7/91np9Den06dNGktmwYYP72E//HffE69vaPR+lpaUKCQmp9eu7du2Sy+XSoEGD3MdiYmLUqVMnbd261UaJXpWbm6uIiAj17Nmz2p8390VHjx5VUVFRlf1u1aqV+vfvf8vs99atWxUaGqp7773XfSw5OVkOh+Oab0l89NFHatu2re666y4999xzunjxYkOXe8PKy8u1a9euKnvVpEkTDRo0qNa92rp1a5XxkpSSknLL7K10Y31L0vnz59W5c2fddtttSktL04EDB2yU6zW+sNc3IzY2VlFRURo8eLA2b97s7XJuWmlpqSSpTZs2tY7xxJ5b+Q2nhw8f1ptvvqlf/epXtY4pKipSQEBAtfsF2rVrd8u9h1ZfqampevjhhxUdHa0jR45o5syZGjp0qLZu3aqmTZt6u7wGcXVPr/7Wzatupf0uKiqqdom1WbNmatGiRZ33Kv3TP/2TOnfurPbt22vv3r36t3/7N+Xn5+uTTz5p6JJvyNmzZ1VRUVHjXtX2V2+Liopu6b2Vbqzvnj176v3339fdd9+t0tJSzZ8/XwkJCTpw4IA6duxoo2zratvr7777Tj/88IOaN2/upcoaVlRUlBYtWqR7771XZWVlevfdd5WYmKjt27erb9++3i7vhlRWVmrKlCn6+c9/XudvOPbE67teVz5mzJhR4w02P3789EV54sQJpaamauTIkRoyZEh9lms0bqTv+hg1apT+4R/+Qb1791Z6ero+/fRTffHFF8rNzfVcEzegofturBq67yeeeEIpKSnq3bu3Ro8eraVLl2rlypU6cuSIB7uAN8THx2vMmDGKjY3VwIED9cknnyg8PFzvvPOOt0uDh/Xs2VNPPvmk4uLilJCQoPfff18JCQlasGCBt0u7YZMmTdL+/fv18ccfN/ha9bryMW3aND322GN1junatav7f588eVJJSUlKSEjQ4sWLtXr16lrnRUZGqry8XOfOnaty9ePUqVOKjIysT5keV9++b1bXrl3Vtm1bHT58WMnJyR47b301ZN9X9/TUqVOKiopyHz916pRiY2Nv6Jyecr19R0ZGVrvx8PLly/r++++r/VRQl/79+0u6coWwW7du9a63obVt21ZNmzatdjWnrtdmZGRkvcY3RjfS9085nU7dc889Onz4cEOU2CjUttctW7b02asetenXr582bdrk7TJuyOTJk/Xpp59q48aN17xK54nXd73CR3h4uMLDw69r7IkTJ5SUlKS4uDgtWbKkyh+yqklcXJycTqdycnI0YsQISVfuIi4oKPD6n/auT9+e8M0336i4uLjKf5S9oSH7jo6OVmRkpHJyctxh47vvvtP27dvr/UkhT7vevuPj43Xu3Dnt2rVLcXFxkqT169fLGKN+/fpd93p5eXmS5PX9rk1AQIDi4uKUk5Oj9PR0SVcuz+bk5Gjy5Mk1zomPj1dOTo6mTJniPpadne3113J93EjfP1VRUaF9+/Zp2LBhDVipd8XHx1f7mOWttteekpeX12hfx7UxxujXv/61Vq5cqdzcXEVHR19zjkde3zdzV2xtvvnmG9O9e3eTnJxsvvnmG1NYWGgKCwvNkiVL3HfNfvPNN6Znz55m+/bt7nlPPfWU6dSpk1m3bp3ZuXOniY+PN/Hx8Q1RYoM5fvy42bNnj5kzZ44JCQkxO3bsMK+99popKSlxj+nZs6f55JNPjDHGfP/99+Zf//VfzdatW83Ro0fN559/bvr27Wtuv/12c+nSJW+1UW/17dsYY1566SUTGhpqVq1aZfbu3WvS0tJMdHS0+eGHH7zRwg1JTU0199xzj9m+fbvZtGmT6d69u/nFL35R6/f54cOHzfPPP2927txpjh49alatWmW6du1qBgwY4M02runjjz82gYGBJiMjw3z55ZfmiSeeMKGhoaaoqMgYc+Xud/3o0y6bN282zZo1M/Pn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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "a = 0.1\n", + "b = 1\n", + "z = a + 1j*b\n", + "plotiqax(2).plot(a,b,marker=\"o\")\n", + "pass" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t = np.linspace(0,np.pi*10,1000)\n", + "z = 0.1 + 1j*1\n", + "y = np.exp(z*t)\n", + "plotiqax(2).plot(np.real(y),np.imag(y))\n", + "pass" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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GZdccgl27dpV9JrR0VFcf/31mDRpEurq6nDppZeip6dHUsRi8b3vfQ9nn302bTi2ePFi/Md//Af9+ok8NuPhG9/4BgzDwA033EA/dyKP0Ve+8hUYhlH0MXv2bPr1E3lsAOCDDz7AZz7zGUyaNAnV1dU466yz8OKLL9KvT7S1WRMcRnj88cexevVq3H777XjppZcwd+5cLF26FAcPHpQdmnAMDQ1h7ty5eOCBB8b9+re+9S3cd999WLduHbZu3Yra2losXboUo6OjgiMVj+eeew7XX389XnjhBWzcuBGZTAYXXHABhoaG6Gu++MUv4umnn8YTTzyB5557Dvv378d//+//XWLU4nDyySfjG9/4BrZv344XX3wRf/mXf4mLL74Yr7/+OoATe2zG4o9//CP+9V//FWeffXbR50/0Mfrwhz+MAwcO0I///M//pF87kcfm2LFjOPfccxGPx/Ef//EfeOONN/Cd73wHzc3N9DUTbm22NJjgnHPOsa6//nr671wuZ3V2dlpr166VGJV8ALCefPJJ+m/TNK2Ojg7r29/+Nv1cb2+vlUwmrZ/+9KcSIpSLgwcPWgCs5557zrKs/FjE43HriSeeoK/ZuXOnBcDasmWLrDClorm52frBD36gx8aBgYEB67TTTrM2btxoffKTn7S+8IUvWJal58/tt99uzZ07d9yvnehjc/PNN1vnnXdeya9PxLVZKzgMkE6nsX37dnR1ddHPRSIRdHV1YcuWLRIjUw+7d+9Gd3d30Vg1NjZi0aJFJ+RY9fX1AQBaWloAANu3b0cmkykan9mzZ2PatGkn3PjkcjmsX78eQ0NDWLx4sR4bB66//npcdNFFRWMB6PkDAG+99RY6Ozsxa9YsXHnlldi7dy8APTa//OUvsXDhQlx22WWYPHky5s+fjwcffJB+fSKuzZrgMMDhw4eRy+XQ3t5e9Pn29nZ0d3dLikpNkPHQY5W/1f6GG27AueeeizPPPBNAfnwSiQSampqKXnsijc+rr76Kuro6JJNJXHvttXjyyScxZ84cPTYFrF+/Hi+99BLWrl173NdO9DFatGgRfvSjH2HDhg343ve+h927d+MTn/gEBgYGTvixeffdd/G9730Pp512Gp555hlcd911+Id/+Ac88sgjACbm2nxC3iauoaECrr/+erz22mtFHgEN4PTTT8eOHTvQ19eHn//85/jsZz+L5557TnZYSmDfvn34whe+gI0bN6Kqqkp2OMrhwgsvpP9/9tlnY9GiRZg+fTp+9rOfobq6WmJk8mGaJhYuXIi77roLADB//ny89tprWLduHT772c9Kjo4PtILDAK2trYhGo8e58Xt6etDR0SEpKjVBxuNEH6tVq1bhV7/6FX73u9/h5JNPpp/v6OhAOp1Gb29v0etPpPFJJBI49dRTsWDBAqxduxZz587FP/3TP+mxQT7NcvDgQXzkIx9BLBZDLBbDc889h/vuuw+xWAzt7e0n/Bg50dTUhA996EN4++23T/j5M2XKFMyZM6foc2eccQZN4U3EtVkTHAZIJBJYsGABNm3aRD9nmiY2bdqExYsXS4xMPcycORMdHR1FY9Xf34+tW7eeEGNlWRZWrVqFJ598Es8++yxmzpxZ9PUFCxYgHo8Xjc+uXbuwd+/eE2J8xoNpmkilUnpsACxZsgSvvvoqduzYQT8WLlyIK6+8kv7/iT5GTgwODuKdd97BlClTTvj5c+655x7XkuLPf/4zpk+fDmCCrs2yXc4TBevXr7eSyaT1ox/9yHrjjTesa665xmpqarK6u7tlhyYcAwMD1ssvv2y9/PLLFgDrnnvusV5++WXrvffesyzLsr7xjW9YTU1N1r/9279Zr7zyinXxxRdbM2fOtEZGRiRHzh/XXXed1djYaG3evNk6cOAA/RgeHqavufbaa61p06ZZzz77rPXiiy9aixcvthYvXiwxanG45ZZbrOeee87avXu39corr1i33HKLZRiG9Zvf/MayrBN7bErBWUVlWSf2GN14443W5s2brd27d1t/+MMfrK6uLqu1tdU6ePCgZVkn9ths27bNisVi1te//nXrrbfesh577DGrpqbG+vGPf0xfM9HWZk1wGOL++++3pk2bZiUSCeucc86xXnjhBdkhScHvfvc7C8BxH5/97Gcty8qXI956661We3u7lUwmrSVLlli7du2SG7QgjDcuAKwf/vCH9DUjIyPW5z//eau5udmqqamx/tt/+2/WgQMH5AUtEP/zf/5Pa/r06VYikbDa2tqsJUuWUHJjWSf22JTCWIJzIo/R5Zdfbk2ZMsVKJBLWSSedZF1++eXW22+/Tb9+Io+NZVnW008/bZ155plWMpm0Zs+ebX3/+98v+vpEW5sNy7IsOdqRhoaGhoaGhgYfaA+OhoaGhoaGxoSDJjgaGhoaGhoaEw6a4GhoaGhoaGhMOGiCo6GhoaGhoTHhoAmOhoaGhoaGxoSDJjgaGhoaGhoaEw6a4GhoaGhoaGhMOGiCo6GhoaGhoTHhoAmOhoaGhoaGxoSDJjgaGhoaGhoaEw6a4GhoaGhoaGhMOGiCo6GhoaGhoTHh8P8Dd5oWZDDiDG8AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t1 = np.linspace(0,np.pi*20,1000)\n", + "a1 = 0\n", + "b1 = 1\n", + "z1 = a1 + 1j*b1\n", + "z2 = a1 - 1j*b1\n", + "y1 = (np.exp(z1*t1) + np.exp(z2*t1))/2\n", + "plt.plot(t1,np.real(y1))\n", + "pass" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGTCAYAAACIx3DvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAArVklEQVR4nO3dfXRU1b3/8c8Ak4Q0YCAkJIBgeIwPSDAIJK2QiJAAyyaVS9XSH0gpKhf6U7FS5LZwweVFgYqtF0WWSuRqIqU/IUUpNkYC5VkeshCErIJASpzwFBMFJBmS/fuDy9RIEghM9oSZ92utWatzZu9zvt/uDH5yzpmJwxhjBAAAYEkzXxcAAAACC+EDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4APzI3Llzdffdd6tVq1aKiopSRkaGCgsLrzhvxYoViouLU0hIiHr37q01a9ZYqBZAoCJ8AH5k/fr1mjx5srZu3arc3Fy53W4NGzZMZ8+erXPO5s2b9fDDD2vChAnavXu3MjIylJGRob1791qsHEAgcfCH5QD/dfLkSUVFRWn9+vUaNGhQrWMefPBBnT17Vh988IFn28CBAxUfH6/FixfbKhVAAOHMB+DHysvLJUlt27atc8yWLVt033331diWmpqqLVu21DmnoqJCX3/9tedRXl6ukydPit9lAFyNFjYPlpOTY/NwQECrrq7Wf/3Xf+nWW2/VoUOHdOjQoVrHuVwu/fOf/6zx/iwpKdHRo0frfM9mZ2dr+fLll23PyspSaGiodxoA0GSkp6d7dX9Ww4ckDR06VE6n0/Zhfcbtdis3N5e+A0RT6nvKlCk6efKk1q1bp06dOtU5zuFwKD4+XiNGjPBsKyoq0qpVq2ps+64hQ4Zo0aJFnuelpaXq2bOnUlJSFBER4b0mmrimtN420Xfg9e1t1sOH0+kMqEW7hL4Di6/7njJlitasWaMNGzYoNja23rHR0dE6ffp0jXpPnTql6OjoOntwOp0KCwurdTvrHTjoG9eKez4AP2KM0ZQpU7Ry5Up98sknVwwekpSYmKi8vLwa23Jzc5WYmNhYZQIIcNbPfABoPJMnT1ZWVpZycnLUqlUrlZSUSJJuuukmtWzZUpI0duxYdezYUXPnzpUkPfHEExo8eLB+//vfa+TIkXrvvfe0Y8cOLVmyxGd9APBvnPkA/Mhrr72m8vJyJScnKyYmxvP47s2hRUVFcrlcnudJSUnKysrSkiVL1KdPH/35z3/WqlWrdMcdd/iiBQABgDMfgB+5mo+65ufnX7Zt9OjRGj16dCNUBACX48wHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfgJ/ZsGGD7r//fnXo0EEOh0OrVq2qd3x+fr4cDsdlj5KSEjsFAwg4hA/Az5w9e1Z9+vTRokWLGjSvsLBQLpfL84iKimqkCgEEuha+LgCAdw0fPlzDhw9v8LyoqCiFh4d7vyAA+B7r4cPtdts+pE9d6pe+A0NT7PvChQv11nPhwgVJUnx8vCoqKnT77bfrd7/7nZKSkuqcU1FRoYqKCs/z0tJSSRf7bkq9N7amuN420Hfg9e10Or26T4cxxnh1j/XIycmxdSgAkjIyMjR9+nQNHDiwzjHFxcXau3evunXrpgsXLig3N1f5+fmaN2+eunXrVuuc7OxsLV++/LLtWVlZCg0N9Vr9AJqG9PR0r+7PevgYOnSo1xNUU+Z2u5Wbm0vfAaKp9R0UFKQVK1Y0+B+OIUOG6Oabb1ZmZmatr9d25qNnz55yuVyKiIi4npJvKE1tvW2h78Dr29u/VFi/7OJ0OgNq0S6h78DSlPpu0aJFg2sZMGCANm7cWOc8p9OpsLCwWrc3lb5tou/AEqh9exOfdgFwmYKCAsXExPi6DAB+ik+7AH7mzJkzOnjwoOf54cOHVVBQoLZt26pz58569tlnVVxcrGXLlkmSXn75ZcXGxur222/X+fPn9cYbb+iTTz7R3/72N1+1AMDPET4AP7Njxw6lpKR4nk+dOlWSNG7cOGVmZsrlcqmoqMjzemVlpZ5++mkVFxcrNDRUd955pz7++OMa+wAAbyJ8AH4mOTlZ9d1H/v2bSKdNm6Zp06Y1clUA8C/c8wEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrWvi6AABNR1W10fbDpTrxzXlFtQpR/9i2at7M4euyAPgZwgfgZzZs2KD58+dr586dcrlcWrlypTIyMuqdk5+frykvvKHybkPVvFU7z/aYm0I06/7blHZHTCNXDSCQcNkF8DNnz55Vnz59tGjRoqsaf/jwYf3k/87WmT4P1QgeklRSfl6T3tmltXtdjVEqgADFmQ/AzwwfPlzDhw+/6vGvLl6s8JRfyjguv7xiJDkkzV79uYbeFs0lGABeYT18uN1u24f0qUv90ndgaIp9X7hwod568vcek+k9qM7XjSRX+XltOXhCA2LbSpIqKipUUVHhGVNaWirpYt9NqffG1hTX2wb6Dry+nU6nV/fpMMYYr+6xHjk5ObYOBUBSRkaGpk+froEDB9Y5ZvK8pWpxz8Qr7mtsjyoltLv4z0V2draWL19+2ZisrCyFhoZee8EAmqT09HSv7s96+Bg6dKjXE1RT5na7lZubS98Boqn1HRQUpBUrVtT7D0fcoB+ravCUK+7rnV/0q/fMR8+ePeVyuRQREXH9hd8gmtp620Lfgde3t3+psH7Zxel0BtSiXULfgaUp9d2iRYt6a+ngPKeT5rwqHCGq7TcRh6Tom0KU2D3Kc8+H0+lUWFjYZWObUt820XdgCdS+vYlPuwABLilxoLRrhaSLQeO7Lj2fdf9t3GwKwGsIH4CfOXPmjAoKClRQUCDp4kdpCwoKVFRUJEl69tlnNXbsWM/4xx9/XP/cvFqJ1fsUEdq8xr6ibwrRaz+/i+/5AOBVfNQW8DM7duxQSkqK5/nUqVMlSePGjVNmZqZcLpcniEhSbGysPvzwQz311FP6fP8sdYwfpJ/87BH928hhfMMpgEZB+AD8THJysuq7jzwzM7PWObt3727EqgDgX7jsAgAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAKsIHAACwivABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAfihRYsW6ZZbblFISIgGDBig7du31zk2MzNTDoejxiMkJMRitQACDeED8DPLly/X1KlTNWvWLO3atUt9+vRRamqqTpw4Ueec1q1by+VyeR5Hjx61WDGAQEP4APzMSy+9pIkTJ2r8+PG67bbbtHjxYoWGhuqtt96qc47D4VB0dLTn0b59e4sVAwg0LWwf0O122z6kT13ql74Dg6/7rqys1M6dO/XMM8/UqOHee+/Vpk2baq2rqqpKZ86cUZcuXVRdXa34+Hg999xzuv322+s8TkVFhSoqKjzPS0tLJV3sO5DW3Nfr7Sv0HXh9O51Or+7TYYwxXt1jPXJycmwdCghIpaWl+sUvfqEXXnhBcXFxnu2ZmZnat2+f5s+ff9mcAwcOyOVyqUuXLjp37pxWrVqlzz//XH/84x/Vrl27Wo+TnZ2t5cuXX7Y9KytLoaGh3msIQJOQnp7u1f1ZDx9Dhw71eoJqytxut3Jzc+k7QPi67y+//FK33HKLNmzYoIEDB3q2T58+XX//+9+1adOmK+7D7Xbrzjvv1E9/+lPNnj271jG1nfno2bOnXC6XIiIirr+RG4Sv19tX6Dvw+vb2LxXWL7s4nc6AWrRL6Duw+KrvmJgYNW/eXKdPn65x/FOnTikmJuaqanI6nerbt68OHz5c53in06mwsLBat7PegYO+ca244RTwI0FBQUpISFBeXp5nW3V1tfLy8pSYmHhV+6iqqtJnn32mmJiYxioTQICzfuYDQOOaOnWqxo0bp379+ql///56+eWXdfbsWY0fP16SNHbsWHXs2FFz586VJM2ZM0cDBw5U9+7dVVZWpvnz5+vo0aP65S9/6cs2APgxwgfgZx588EGdPHlSM2fOVElJieLj47V27VrPx2eLiorUrNm/Tnp+9dVXmjhxokpKStSmTRslJCRo8+bNuu2223zVAgA/R/gA/NCUKVM0ZcqUWl/Lz8+v8XzhwoVauHChhaoA4CLu+QAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QMAAFhF+AAAAFYRPgAAgFWEDwAAYBXhAwAAWEX4AAAAVhE+AACAVYQPAABgFeEDAABYRfgAAABWET4AAIBVhA8AAGAV4QPwQ4sWLdItt9yikJAQDRgwQNu3b693/IoVKxQXF6eQkBD17t1ba9assVQpgEBE+AD8zPLlyzV16lTNmjVLu3btUp8+fZSamqoTJ07UOn7z5s16+OGHNWHCBO3evVsZGRnKyMjQ3r17LVcOIFAQPgA/89JLL2nixIkaP368brvtNi1evFihoaF66623ah3/hz/8QWlpaXrmmWd066236rnnntNdd92l//7v/7ZcOYBA0cLWgYwxOnfunE6fPi2n02nrsD7ndrvpm76tqays1I4dOzR58mSdPn3as/1HP/qR8vPzNXHixMvmbNq0SZMmTaox/p577tGaNWtqbPuuiooKVVZWep5/9dVXkqTS0lJvtXJD8PV6+wp9B17foaGhatWqlRwOh1f26TDGGK/s6QpOnjypqKgoG4cCAABeduLECUVGRnplX9bOfAQFBSkkJESfffaZ2rRpY+uwPvfVV1+pd+/e9B0gfN23y+VS79699de//lV33323Z/usWbO0ZcsW/e1vf7tsTnR0tBYtWqRRo0Z5tr355puaP3++Dhw4UOtxvn/m45///KcGDRqkXbt2qXPnzl7sqGnz9Xr7Cn0HXt89evRQUFCQ1/ZpLXw4HA6dP39ebdq0UUREhK3DNgn0Td+2tGrVSs2bN9f58+drHP+bb75Rp06daq0pJiZG586dq/Ha2bNn1aFDhwb3wHoHDvoOrL4lee2Si8QNp4BfCQoKUkJCgvLy8jzbqqurlZeXp8TExFrnJCYm1hgvSbm5uXWOB4DrZe3MBwA7pk6dqnHjxqlfv37q37+/Xn75ZZ09e1bjx4+XJI0dO1YdO3bU3LlzJUlPPPGEBg8erN///vcaOXKk3nvvPe3YsUNLlizxZRsA/Ji18BEcHKwHH3xQwcHBtg7ZJNA3fdv24IMP6uTJk5o5c6ZKSkoUHx+vtWvXqn379pKkoqIiNWv2r5OeSUlJysrK0m9/+1vNmDFDPXr00KpVq3THHXdc9TEvXQv25jXhG0FTWG9foO/A63vWrFle7dvap10kKScnRyNGjAi4jyitWbOGvgNEoPZ9+vRptWvXTqdOnQqoa+GBut70HXh9e7tf7vkAAABWET4AAIBVhA8AAGAV4QMAAFjVKOHjyJEjmjBhgmJjY9WyZUt169ZNs2bNktvtrnfe+fPnNXnyZEVERCgsLEyjRo3S8ePHG6PERvP8888rKSlJoaGhCg8Pv6o5jzzyiBwOR41HWlpa4xbqZdfStzFGM2fOVExMjFq2bKn77rtP//jHPxq3UC8rLS3VmDFj1Lp1a4WHh+vRRx/Vt99+W++c5OTky9b78ccft1TxtVu0aJFuueUWhYSEaMCAAdq+fXu941esWKG4uDiFhISod+/eWrNmjaVKvashfWdmZl62tiEhIRarvX4bNmzQ/fffrw4dOsjhcGjVqlVXnJOfn6+77rpLwcHB6t69uzIzMxu9Tm9raN/5+fmXrbXD4VBJSYmdgr1k7ty5uvvuu9WqVStFRUUpIyNDhYWFV5x3ve/vRgkfBw4cUHV1tV5//XXt27dPCxcu1OLFi/XOO+/UO++pp57S6tWrtWLFCq1fv15ffvmlHnjggcYosdFUVlZq9OjRmjRpUoPmpaWlyeVyeR7Z2dmNVGHjuJa+582bpz/+8Y9avHixtm3bph/84AdKTU3V+fPnG7FS7xozZoz27dun3NxcffDBB9q4caNeffXVK86bOHFijfWeN2+ehWqv3fLlyzV16lTNmjVLu3btUp8+fZSamqoTJ07UOn7z5s16+OGHNWHCBO3evVsZGRnKyMjQ3r17LVd+fRratyS1bt26xtoePXrUYsXX7+zZs+rTp48WLVp0VeMPHz6skSNHKiUlRQUFBXryySf1y1/+Uh999FEjV+pdDe37ksLCwhrrfaP9DbP169dr8uTJ2rp1q3Jzc+V2uzVs2DCdPXu2zjleeX8bS+bNm2fat29vKisra329rKzMOJ1Os2LFCs+2/fv3G0lmy5Yttsr0mqVLl5qbbrrJVFZWmlWrVtXZtzHGjBs3zqSnp9srrhFdbd/V1dUmOjrazJ8/37OtrKzMBAcHm+zsbFvlXpfPP//cSDKffvqpZ9vq1auNw+EwR44cqXPe4MGDzRNPPGGhQu/p37+/mTx5sud5VVWV6dChg5k7d64xxphTp04ZSebUqVPGGGN++tOfmpEjR9bYx4ABA8xjjz1mr2gvuFLf3/85v/Tz7y8kmZUrV162/bt9T5s2zdx+++01Xn/wwQdNamqqpSq972r6XrdunZFkvvrqK+v1NaYTJ04YSWb9+vWebd//d9wb729r93yUl5crLCysztd37twpt9ut++67z7MtLi5OnTt31pYtW2yU6FP5+fmKiopSr169Lvvz5v7o8OHDKikpqbHeN910kwYMGHDDrPeWLVsUHh6ufv36ebYNGTJEDofjipck3n33XbVr10533HGHnn32WZ07d66xy71mlZWV2rlzZ421atasme67774612rLli01xktSamrqDbO20rX1LUlnzpxRly5ddPPNNys9PV379u2zUa7P+MNaX4/4+HjFxMRo6NCh2rRpk6/LuW7l5eWSpLZt29Y5xhtrbuUbTg8ePKhXXnlFP//5z+scU1JSoqCgoMvuF2jfvv0Ndw2todLS0vTAAw8oNjZWhw4d0owZMzR8+HBt2bJFzZs393V5jeLSml761s1LbqT1LikpuewUa4sWLdSqVat671X62c9+pi5duqhDhw7as2ePfvOb36iwsFDvv/9+Y5d8TU6dOqWqqqpa16quv3pbUlJyQ6+tdG199+rVS2+99ZbuvPNOlZeXa8GCBUpKStK+ffvUqVMnG2VbV9daf/311/r222/VsmVLH1XWuGJiYrR48WL169dPFRUVeuONN5ScnKxt27bprrvu8nV516S6ulpPPvmkfvjDH9b7DcfeeH836MzH9OnTa73B5ruP778pi4uLlZaWptGjR2vYsGENOVyTcS19N8RDDz2kH//4x+rdu7cyMjL0wQcf6NNPP1V+fr73mrgGjd13U9XYfT/66KNKTU1V7969NWbMGC1btkwrV67UoUOHvNgFfCExMVFjx45VfHy8Bg8erPfff1+RkZF6/fXXfV0avKxXr1567LHHlJCQoKSkJL311ltKSkrSwoULfV3aNZs8ebL27t2r9957r9GP1aAzH08//bQeeeSResd07drV87+//PJLpaSkKCkpSUuWLNHq1avrnBcdHa3KykqVlZXVOPtx/PhxRUdHN6RMr2to39era9euateunQ4ePKghQ4Z4bb8N1Zh9X1rT48ePKyYmxrP9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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = plotiqax(2)\n", + "ax.plot(np.real(z1),np.imag(z1),marker=\"o\")\n", + "ax.plot(np.real(z2),np.imag(z2),marker=\"o\")\n", + "pass" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Crystal oscillator\n", + "\n", + "A crystal is a piezo electric device, mechanical forces convert to a voltage and visa versa.\n", + "\n", + "The great thing about crystals is that the mechanical resonance is accurate, relatively independent of environmental conditions, and has a high quality factor.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "A common model of the crystal is shown below\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Am I wrong?\n", + "\n", + "I have a problem with calculating input impedances and transfer functions. I don't trust my own brain when it comes the algebra of expanding symbolic functions. \n", + "\n", + "In [The Crystal Oscillator](https://ieeexplore.ieee.org/document/7954123) the input impedance is reported as (assuming $R_s = 0$)\n", + "\n", + "$$ Z_{in} \\approx \\frac{L C_F s^2 + 1}{L C_F C_p s^2 + C_F + C_P}$$\n", + "\n", + "When I compute $Z_{in}$ by hand I got \n", + "\n", + "$$ Z_{in} = \\frac{s^2 C_F L + 1}{s^3 C_P L C_F + s C_P + s C_F}$$\n", + "\n", + "So did I do it wrong? " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Enter [Sympy](https://docs.sympy.org/latest/index.html)\n", + "Python is fantastic, especially the libraries. Imagine that someone has spent their time on making a symbolic library. \n", + "\n", + "Computers are fantastic at mundane algorithms like algebra. I love to use computers to verify whether I'm right or wrong." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/latex": [ + "$\\displaystyle \\frac{C_{F} L s^{2}}{C_{F} C_{P} L s^{3} + C_{F} C_{P} R s^{2} + C_{F} s + C_{P} s} + \\frac{C_{F} R s}{C_{F} C_{P} L s^{3} + C_{F} C_{P} R s^{2} + C_{F} s + C_{P} s} + \\frac{1}{C_{F} C_{P} L s^{3} + C_{F} C_{P} R s^{2} + C_{F} s + C_{P} s}$" + ], + "text/plain": [ + " 2 \n", + " C_F⋅L⋅s C_F⋅R⋅s 1 \n", + "─────────────────────────────────────────── + ─────────────────────────────────────────── + ───────────────────────────────────────────\n", + " 3 2 3 2 3 2 \n", + "C_F⋅C_P⋅L⋅s + C_F⋅C_P⋅R⋅s + C_F⋅s + C_P⋅s C_F⋅C_P⋅L⋅s + C_F⋅C_P⋅R⋅s + C_F⋅s + C_P⋅s C_F⋅C_P⋅L⋅s + C_F⋅C_P⋅R⋅s + C_F⋅s + C_P⋅s" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sympy import *\n", + "init_printing()\n", + "#- Define the symbols\n", + "Gin,Zin,s,Cf,L,Cp,R,Z = symbols(\"G_{in} Z_{in} s C_F L C_P R Z\")\n", + "\n", + "#- Compute impedance\n", + "Gin = 1/(R + s*L + 1/(s*Cf)) + s*Cp\n", + "Zin = expand(simplify(1/Gin))\n", + "Zin" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/latex": [ + "$\\displaystyle \\frac{C_{F} L s^{2}}{C_{F} C_{P} L s^{3} + C_{F} s + C_{P} s} + \\frac{1}{C_{F} C_{P} L s^{3} + C_{F} s + C_{P} s}$" + ], + "text/plain": [ + " 2 \n", + " C_F⋅L⋅s 1 \n", + "──────────────────────────── + ────────────────────────────\n", + " 3 3 \n", + "C_F⋅C_P⋅L⋅s + C_F⋅s + C_P⋅s C_F⋅C_P⋅L⋅s + C_F⋅s + C_P⋅s" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Zin.subs({R:0})" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/latex": [ + "$\\displaystyle \\left[ - \\sqrt{- \\frac{1}{C_{F} L}}, \\ \\sqrt{- \\frac{1}{C_{F} L}}\\right]$" + ], + "text/plain": [ + "⎡ _______ _______⎤\n", + "⎢ ╱ -1 ╱ -1 ⎥\n", + "⎢- ╱ ───── , ╱ ───── ⎥\n", + "⎣ ╲╱ C_F⋅L ╲╱ C_F⋅L ⎦" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve(Zin.subs({R:0}),s)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Nope, I was right. And probably so was Bezhad. Is my initial setup of the equations wrong?\n", + "\n", + "Next, check the Impedance with some values." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from sympy.utilities.lambdify import lambdify\n", + "\n", + "#- Evaluate for some numerical values\n", + "Z = Zin.subs({R:50,Cf:5e-15,Cp:5e-12,L:50e-3})\n", + "\n", + "#- Translate to numpy \n", + "f = np.linspace(10.05e6,10.08e6,1000)\n", + "w = 1j*2*np.pi*f\n", + "func = lambdify(s, Z,'numpy') \n", + "Znum = func(w)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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644fDdcFYwuMLgsA0IGIhu758+dL8o9A//73v4/4VPKcnJw29++55x4NHDhQJ598smpqavTkk0/q+eef16mnnhqsb9iwYfriiy90/PHHR7Q2AACAQ7F0a6Wufm659tQ3KzvFrr//crTG9MsyuiwAQAhRmYd06623Rv3c7ebmZj333HO67LLLZDKZtHz5crndbk2ePDm4z9ChQ9W3b18tXrw4qrUBAAAcjOe+2K6L/vGF9tQ366heaXr92okEbgCIExEb6R49erQWLlyozMxMjRo1qsPrRH711Vdhf/1XX31V1dXVuuSSSyRJZWVlstlsysjIaLNfbm6uysrKDngcl8sll8sVvO90OiVJbrdbbrc77HWHQ6CuWK0PxqNHEAo9glDokehobvHq9rfX6cVl30mSzjo6T3efe5QSbZaY/m9PfyAUegShxEOPdLa2iIXuc845J7hw2rnnnhuplzmgJ598UmeccYZ69ep1SMe5++67NWfOnHbbFyxYoKSkpEM6dqQVFRUZXQJiHD2CUOgRhEKPRE6tW5q/3qLNtSaZ5NNZfb2anPydPnz/O6NL6zT6A6HQIwgllnukoaGhU/uZfD6fL8K1RN327ds1YMAAvfLKKzrnnHMkSR988IFOO+00VVVVtRnt7tevn2bMmKGZM2fu91j7G+kuKChQRUWF0tLSIvpzdJXb7VZRUZGmTJkiq5VLh6A9egSh0CMIhR6JrG9Knbr6+ZXaWdOkFHuCHjj/aE0akhP6iTGC/kAo9AhCiYcecTqdys7OVk1NTYfZMCrX6Q5obm7Wrl275PV622zv27dvWF9n/vz56tmzp84666zgtjFjxshqtWrhwoU677zzJEnr169XcXGxxo8ff8Bj2e32Npc6C7BarTH7jx8QDzXCWPQIQqFHEAo9En6vryrVDf9dpSa3VwOyk/X4xWM1qGeK0WV1Cf2BUOgRhBLLPdLZuqISujds2KDLL79cixYtarPd5/PJZDK1uczXofJ6vZo/f76mT5+uhIS9P156erouv/xyzZo1S1lZWUpLS9Nvf/tbjR8/npXLAQCA4Txen+5fsF6PfrRZknTKkBw9eOEopSfG5i+bAIDOiUrovvTSS5WQkKA333xT+fn5HS6qdqjef/99FRcX67LLLmv32F/+8heZzWadd955crlcmjZtmv72t79FrBYAAIDOcDa59bsX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z1dzZNu2bSIpKUkEBweLoKAg0b9/f/HOO+8Iq9XqtdeC3CmRHw7Lli0TnTp1EjqdTgwdOlTk5OS49F+5ckVMnTpVBAcHC71eL2bOnOny26rUOnw1Rw4fPiySk5NFaGioCAgIEL169RIvvPCCy+94U+tQMkcWLlwo4uPj633v4L6Ib/DVHOG+iG9QKj9OnjwpJk2aJKKjo4VOpxP9+vVz+wkxX9kXkYTgNfWJiIiIiIiIvIHf6SYiIiIiIiLyEhbdRERERERERF7CopuIiIiIiIjIS1h0ExEREREREXkJi24iIiIiIiIiL2HRTUREREREROQlLLqJiIiIiIiIvIRFNxEREREREZGXsOgmIiIiRaWnp0OSJEiShM2bNysaS3Z2thzLPffco2gsRETUPrDoJiIiamHORaTzraCgQOnQfFZaWhqKioowduxYuc3xuh08eNBlrNFoREREBCRJQnZ2tst4T0V7enp6kwvoYcOGoaioCFOmTLmep0FEROSGRTcREZEXOIpI51vXrl3dxplMJgWi8z1arRYxMTHQarUu7fHx8VizZo1L2+eff47g4GCvxKHRaBATE4PAwECvzE9ERDcfFt1ERERe4CginW9qtRopKSn429/+hnnz5iEyMhJjxowBABw7dgxjx45FcHAwOnbsiGnTpuHy5cvyfFVVVZg+fTqCg4MRGxuLV155BSkpKZg3b548xtOR3rCwMGRlZcnL586dw5QpUxAWFobw8HBMnDgRZ86ckfsdR4VXrFiB2NhYREREYO7cuTCbzfIYo9GIBQsWID4+HlqtFomJicjIyIAQAomJiVixYoVLDHl5edd9pH/GjBlYt24dampq5LbMzEzMmDGj2XMBwJkzZzyehZCSknJd8xERETWGRTcREVEre//996HRaLBv3z688847KCsrw6hRozBgwAAcOnQIX331FUpKSlxOcZ4/fz52796NLVu24JtvvkF2djZ++OGHZm3XbDZjzJgxCAkJQU5ODvbt24fg4GCkpaW5HHHftWsXCgsLsWvXLrz//vvIyspyKdynT5+OTz75BK+//jp++eUXvPvuuwgODoYkSZg1a5bbkek1a9Zg+PDhSExMbPZrNWjQICQkJGDTpk0AgLNnz2LPnj2YNm1as+cC7EfOnc8+OHLkCCIiIjB8+PDrmo+IiKgxfkoHQERE1B598cUXLqdAjx07Fhs3bgQA9OjRAy+//LLc99xzz2HAgAF44YUX5LbMzEzEx8fj5MmTiIuLQ0ZGBj788EOMHj0agL1w79SpU7NiWr9+PWw2G1avXg1JkgDYC+KwsDBkZ2fjzjvvBAB06NABb775JtRqNXr27Inx48djx44dmDNnDk6ePIkNGzZg+/btSE1NBQB069ZN3kZ6ejoWL16M7777DkOGDIHZbMbHH3/sdvS7OWbNmoXMzEw8+OCDyMrKwrhx4xAVFeVx7NSpU6FWq13ajEYjxo8fDwBQq9WIiYkBABgMBtxzzz0YOnQolixZct3xERERNYRFNxERkReMHDkSq1atkpeDgoLkx4MGDXIZe/ToUezatcvj95QLCwtRU1MDk8mE5ORkuT08PBy33nprs2I6evQoCgoKEBIS4tJuMBhQWFgoL/fu3dulcI2NjcVPP/0EwH6quFqtxogRIzxuIy4uDuPHj0dmZiaGDBmC//znPzAajZg8eXKzYnX24IMP4qmnnsKpU6eQlZWF119/vd6xK1eulD8McFiwYAGsVqvb2FmzZqGiogLbt2+HSsWT/4iIyDtYdBMREXlBUFBQvadTOxfgAFBZWYkJEybgpZdechsbGxvb5O9CS5IEIYRLm/N3sSsrKzFo0CB89NFHbus6Hzn29/d3m9dmswFAky4w9te//hXTpk3DypUrsWbNGtx3333Q6XRNeg6eRERE4K677sLs2bNhMBgwduxYVFRUeBwbExPj9rqHhISgrKzMpe25557D119/je+++87tQwgiIqKWxKKbiIhIYQMHDsSmTZuQkJAAPz/3t+bu3bvD398fubm56Ny5MwDgv//9L06ePOlyxDkqKgpFRUXycn5+Pqqrq122s379ekRHR0Ov119XrH379oXNZsPu3bvdjig7jBs3DkFBQVi1ahW++uor7Nmz57q25WzWrFkYN24cFixY4Hb6eHNt2rQJS5cuxbZt29C9e/cbjo2IiKghPJeKiIhIYXPnzkVpaSmmTp2K77//HoWFhfj6668xc+ZMWK1WBAcHY/bs2Zg/fz527tyJY8eOIT093e2U6FGjRuHNN9/EkSNHcOjQITzyyCMuR60feOABREZGYuLEicjJycHp06eRnZ2Nxx57DOfPn29SrAkJCZgxYwZmzZqFzZs3y3Ns2LBBHqNWq5Geno6FCxeiR48eGDp06A2/Rmlpabh06RKWLl16Q/McO3YM06dPx4IFC9C7d28UFxejuLgYpaWlNxwjERGRJyy6iYiIFBYXF4d9+/bBarXizjvvRN++fTFv3jyEhYXJhfXy5ctx++23Y8KECUhNTcWf//xnt++Gv/LKK4iPj8ftt9+O+++/H//4xz9cTuvW6XTYs2cPOnfujEmTJqFXr17yKdvNOfK9atUq3HvvvXj00UfRs2dPzJkzB1VVVS5jZs+eDZPJhJkzZ97AK3ONJEmIjIyERqO5oXkOHTqE6upqPPfcc4iNjZVvkyZNapE4iYiI6pJE3S9/ERERUZuQkpKCpKQkvPbaa0qH4iYnJwejR4/GuXPn0LFjxwbHpqeno6yszO03xpXkizEREVHbxCPdRERE1GKMRiPOnz+PJUuWYPLkyY0W3A6On1j74osvvBxhw3JychAcHOzxYnNERETXgxdSIyIiohbzySefYPbs2UhKSsLatWubtM7LL7+Mp59+GoD9au1KGjx4MPLy8gDA40+4ERERNRdPLyciIiIiIiLyEp5eTkREREREROQlLLqJiIiIiIiIvIRFNxEREREREZGXsOgmIiIiIiIi8hIW3URERERERERewqKbiIiIiIiIyEtYdBMRERERERF5CYtuIiIiIiIiIi9h0U1ERERERETkJf8PGU5KLtGdnAoAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(2,1,figsize=(10,6),sharex=True)\n", + "ax[0].plot(f*1e-6,20*np.log10(np.abs(Znum)))\n", + "ax[0].grid(True)\n", + "ax[0].set_ylabel(\"Magnitude\")\n", + "ax[1].plot(f*1e-6,(np.angle(Znum) - np.max(np.angle(Znum)))/(np.pi*2)*360)\n", + "ax[1].set_xlabel(\"Frequency [MHz]\")\n", + "ax[1].set_ylabel(\"Phase\")\n", + "ax[1].grid(True)\n", + "plt.tight_layout()\n", + "plt.savefig(\"../media/xosc_res.svg\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Discovery\n", + "\n", + "Nope, I did everything right. The reason Bezhad ignores the $1/s$ is that when we look close to the resonance frequencies the impedance of the $1/sCp$ does not change much, as such ignore." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Pierce oscillator\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "![](https://www.iqdfrequencyproducts.com/media/c/blg/411/1438250963/rc/2000/1047/90/quartz-crystal-stability-how-myths-and-misconceptions-mask-good-value.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Ring oscillator\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Digitally controlled oscillator\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# LC oscillators\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# RC oscillators\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Questions\n", + "\n", + "- Layout \n", + " " + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lectures/l09_osc.md b/lectures/l09_osc.md new file mode 100644 index 0000000..cbfb4e7 --- /dev/null +++ b/lectures/l09_osc.md @@ -0,0 +1,492 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme:Plain Jane,1 + + + +## TFE4188 - Introduction to Lecture 9 +# Oscillators + + + +--- + +# Goal + + + +Introduction to **Crystal Oscillators** + +Introduction to **VCOs** + +Introduction to **Relaxation-oscillators** + +--- + + + +# Crystal oscillators + +--- + + + +![fit](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Quartz_crystal_internal.jpg/440px-Quartz_crystal_internal.jpg) + +--- + + + + +![fit](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Crystal_modes_multilingual.svg/300px-Crystal_modes_multilingual.svg.png) + +--- + + + +![left fit](../media/xosc_model.svg) + +Assuming zero series resistance + +$$ Z_{in} = \frac{s^2 C_F L + 1}{s^3 C_P L C_F + s C_P + s C_F}$$ + + + + +Since the 1/(sCp) does not change much at resonance, then + +$$ Z_{in} \approx \frac{L C_F s^2 + 1}{L C_F C_p s^2 + C_F + C_P}$$ + +See [Crystal oscillator impedance](https://github.com/wulffern/aic2023/blob/main/jupyter/xosc.ipynb) for a detailed explanation. + +--- + + + +![fit](../media/xosc_res.svg) + +--- + + + +![right fit](../media/xosc_pierce.pdf) + + + +**Negative transconductance compensate crystal series resistance** + + +**Long startup time caused by high Q** + + + +**Can fine tune frequency with parasitic capacitance** + + + +--- + +![fit](https://www.iqdfrequencyproducts.com/media/c/blg/411/1438250963/rc/2000/1047/90/quartz-crystal-stability-how-myths-and-misconceptions-mask-good-value.jpg) + +--- + +# Controlled Oscillators + + + + +--- + +## Ring oscillator + + + +$$ t_{pd} \approx R C $$ + +$$ R \approx \frac{1}{gm} \approx \frac{1}{\mu_n C_{ox} \frac{W}{L} (VDD - V_{th})}$$ + +$$ C \approx \frac{2}{3} C_{ox} W L$$ + +![left](../media/osc_ring.svg) + +--- + + + +$$ t_{pd} \approx \frac{2/3 C_{ox} W L}{\frac{W}{L} \mu_n C_{ox}(VDD - V_{th})}$$ + +$$ f = \frac{1}{2 N t_{pd}} = \frac{\mu_n (VDD-V_{th})}{\frac{4}{3} N L^2}$$ + +$$ K_{vco} = 2 \pi \frac{\partial f}{\partial VDD} = \frac{2 \pi \mu_n}{\frac{4}{3} N L^2}$$ + + + + +--- +## Capacitive load + + + +$$ f = \frac{\mu_n C_{ox} \frac{W}{L} (VDD - V_{th})}{2N\left(\frac{2}{3}C_{ox}WL + C\right)}$$ + +$$ K_{vco} = \frac{2 \pi \mu_n C_{ox} \frac{W}{L}}{2N\left(\frac{2}{3}C_{ox}WL + C\right)}$$ + + + + +![left](../media/osc_ring_c.svg) + +--- +## Realistic + + + +![left](../media/osc_ring_adv.svg) + + + + +$$ I = C \frac{dV}{dt}$$ + +$$ f \approx \frac{ I_{control} + \frac{1}{2}\mu_p C_{ox} \frac{W}{L} (VDD - V_{control} - +V_{th})^2}{C \frac{VDD}{2} N}$$ + +$$ K_{vco} = 2 \pi \frac{\partial f}{\partial V_{control}}$$ + +$$ K_{vco} = 2 \pi \frac{\mu_p C_{ox} W/L }{C\frac{VDD}{2}N}$$ + + + +--- + +## Digitally controlled oscillator + + + +![left](../media/osc_ring_cap.svg) + +--- + +## Differential + + +potentially less sensitive to supply noise + + +![left](../media/osc_ring_diff.svg) + +--- + +## LC oscillator + + + + +![left](../media/lcosc.svg) + + +$$ f \propto \frac{1}{\sqrt{LC}}$$ + + +--- + +# Relaxation oscillators + + + +![inline](../media/rcosc.svg) + +--- + + + +##[fit]Q: Show that Fo is 1/(2RC) + +--- + +# Additional material + +## Crystal oscillators + +[The Crystal Oscillator - A Circuit for All Seasons](https://ieeexplore.ieee.org/document/7954123) + +[High-performance crystal oscillator circuits: theory and application](https://ieeexplore.ieee.org/document/318) + +[Ultra-low Power 32kHz Crystal Oscillators: Fundamentals and Design Techniques](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9542926) + +[A Sub-nW Single-Supply 32-kHz Sub-Harmonic Pulse Injection Crystal Oscillator](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9173539) + +## CMOS oscillators + +[The Ring Oscillator - A Circuit for All Seasons +](https://ieeexplore.ieee.org/document/8901474) + +[A Study of Phase Noise in CMOS Oscillators](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=494195) + +[An Ultra-Low-Noise Swing-Boosted Differential Relaxation Oscillator in 0.18-um CMOS](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9081906) + +--- + + +#[fit] Thanks! diff --git a/lectures/l10_lpradio.md b/lectures/l10_lpradio.md new file mode 100644 index 0000000..fcfaf52 --- /dev/null +++ b/lectures/l10_lpradio.md @@ -0,0 +1,1053 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme:Plain Jane,1 + +[.background-color: #00A9CE] + + + +## TFE4188 - Lecture 10 +# Low Power Radio + + + +--- + + + +# Goal + +Let's make a radio (or at least, let's **pretend**) + + + +--- + +[.background-color: #00A9CE] + + + +## Problem statement: + +#[fit] Make the best radio ICs for gaming mice + +--- + + + + +## What do we need to know? +- Data Rate +- Carrier Frequency & Range +- Power supply + +--- + + + +#[fit] Data Rate + +--- + +[.column] + +## Data + + + +| What | Bits | Why | +| ---- | ---- | ---- | +| X displacement | 8 | | +| Y displacement | 8 | | +| CRC | 4 | Bit errors| +| Buttons| 16 | On-hot coding. Most mice have buttons| +| Preamble| 8 | Synchronization| +| Address | 32 | Unique identifier | +| Total | 76 | | + + +[.column] + +## Rate + + + +Assume 1 ms update rate + +--- +## Data Rate + + + +Application Data Rate > 76 bits/ms = 76 kbps + +Assume 30 % packet loss + +Raw Data Rate > 228 kbps + +Multiply by $$\pi$$ > 716 kbps + +Round to nearest nice number = 1Mbps + + + + +--- + +# [fit] Carrier Frequency & Range + + +--- +## ISM (industrial, scientific and medical) bands + + + +![inline](../media/ism.png) + +--- + +## Antenna + + +[.column] +assume $$\lambda/4$$ is an OK antenna size ($$\lambda = c/f$$) + + + +[.column] +| ISM band |$$\lambda/4$$ | Unit|OK/NOK| +|---|---:|---:|---:| +| 40.68 MHz | 1.8 | m |:x:| +| 433.92 MHz | 17 | cm|:x:| +| 915 MHz | 8.2 | cm|| +| 2450 MHz | 3.06 | cm|:white_check_mark:| +| 5800 MHz | 1.29 | cm|:white_check_mark:| +| 24.125 GHz | 3.1 | mm|:white_check_mark:| +| 61.25 GHz | 1.2 | mm|:white_check_mark:| + +--- + +## Range (Friis) + + + +[.column] + +Assume no antenna gain, power density p at distance D is + +$$ p = \frac{P_{TX}}{4 \pi D^2}$$ + +Assume reciever antenna has no gain, then the effective aperture is + +$$ A_e = \frac{\lambda^2}{4 \pi}$$ + +[.column] + +Power received is then + +$$P_{RX} = \frac{P_{TX}}{D^2} \left[\frac{\lambda}{4 \pi}\right]^2$$ + +Or in terms of distance + +$$ D = 10^\frac{P_{TX} - P_{RX} + 20 log_{10}\left(\frac{c}{4 \pi f}\right)}{20} $$ + +--- + +## Range (Free space) + + + +Assume TX = 0 dBm, assume RX sensitivity is -80 dBm + +| Freq | **$$20 log_{10}\left(c/4 \pi f\right)$$** [dB]| D [m]| OK/NOK| +| ----|:----:| ---: | ---:| +| 915 MHz | -31.7 | 260.9 | :white_check_mark:| +| **2.45 GHz** | **-40.2** | **97.4** |:white_check_mark:| +| 5.80 GHz | -47.7 | 41.2 |:white_check_mark:| +| 24.12 GHz | -60.1 | 9.9 | :x:| +| 61.25 GHz | -68.2 | 3.9 | :x:| +| 160 GHz | -76.52| 1.5 | :x:| + +--- + +## Range (Real world) + + + +path loss factor, $$ n \in [1.6,6]$$, $$ D = 10^\frac{P_{TX} - P_{RX} + 20 log_{10}\left(\frac{c}{4 \pi f}\right)}{n +\times 10} $$ + + + +| Freq | **$$20 log_{10}\left(c/4 \pi f\right)$$** [dB]| D@n=2 [m]|D@n=6 [m] | OK/NOK| +| ----|:----:| ---: | ---:| ---:| +| **2.45 GHz** | **-40.2** | **97.4** | **4.6** |:white_check_mark:| +| 5.80 GHz | -47.7 | 41.2 | 3.45 |:white_check_mark:| +| 24.12 GHz | -60.1 | 9.9 | 2.1 | :x:| + + +--- + +# [fit] Power supply + + + +--- + +## Battery + +![left 70%](../media/lindens_handbook_of_batteries.png) + +Mouse is maybe AA, 3000 mAh + +|Cell |Chemistry| Voltage (V) | Capacity (Ah) | +|----|:----|----:| ---:| +| AA |LiFeS2 | 1.0 - 1.8 | 3 | + | 2xAA |LiFeS2 | 2.0 - 3.6 | 3 | +| AA |Zn/Alk/MnO2 | 0.8 - 1.6 | 3 | +| 2xAA |Zn/Alk/MnO2 | 1.6 - 3.2 | 3 | + + + + +--- +[.background-color: #00A9CE] + +# Decisions we must make + + + +--- + +## Modulation scheme + + + +| Scheme | Acronym|Pro | Con | +| ----| ----|----| ----| +| Binary phase shift keying | BPSK | Simple | Not constant envelope| +| Quadrature phase-shift keying | QPSK |2bits/symbol| Not constant envelope| +| Offset QPSK |OQPSK| 2bits/symbol | Constant envelope with half-sine pulse shaping| +| Gaussian Frequency Shift Keying | GFSK | 1 bit/symbol| Constant envelope| +| Quadrature amplitude modulation| QAM | > 1024 bits/symbol| Really non-constant envelope| + +--- + + + +![left fit](../media/l7_bpsk_real.pdf) + + + +![right fit](../media/l7_bpsk_circuit.pdf) + +--- + + + +![left fit](../media/l7_qpsk.pdf) + + +![inline fit](../media/l7_const_env.pdf) + +![inline fit](../media/l7_polar.pdf) + +![inline fit](../media/l8_cartesian.pdf) + +--- + + + + +![left fit](../media/l8_8psk.pdf) + + + + +![right fit](../media/EDR.png) + +--- + + + + +![original fit](../media/l8_16qam.pdf) + + + +--- + + + +## Single carrier, or multi carrier? + +Bluetooth, 802.15.4, ANT all use one carrier +- Simple TX, constant envelope + +WiFi, LTE ++ all use Orthogonal frequency division multiplexing (OFDM) +- Complex TX, non-constant envelope + + +--- + + + +#[fit] Let's make the best, highest data rate radio! + +#[fit]\#racetoidle + +--- + +## Use a Software Defined Radio + + + +![left fit](../media/lg_lna_adc.pdf) + + + +ADC FOM $$ = \frac{P}{2 BW 2^n}$$ + +State of the art FOM $$\approx 5 \text{ fJ/step}$$ + + $$ BW = 2.5\text{ GHz}$$ + + $$ DR = 100\text{ dB} = (96-1.76)/6.02 \approx 16\text{ bit} $$ + + $$ P = 5\text{ fF} \times 5 \text{ GHz} \times 2^{16} = 1.6\text{ W}$$ + + + +--- + + +## WiFi 6 + + + +[An 802.11ax 4 × 4 High-Efficiency WLAN AP Transceiver SoC Supporting 1024-QAM With Frequency-Dependent IQ Calibration and Integrated Interference Analyzer](https://ieeexplore.ieee.org/document/8528383) + +--- + + + +![ fit](../media/wifi6_arch.gif) + + +--- + + + + +![inline](../media/wifi6_qam.gif) + +--- + + + + +![inline](../media/wifi6_power.gif) + + +--- + + + +## [fit] Crap, complex! +## [fit] Crap, too high power! + +--- +[.background-color: #00A9CE] + + + +![fit](https://www.bluetooth.com/wp-content/themes/bluetooth/images/logos/bluetooth-logo-color-black.svg) + + +--- + + + +# [Bluetooth](https://www.bluetooth.com/specifications/specs/core-specification-5-4/) + +- Compromise between speed, power and cost +- "Simple" to use +- "Simple" to implement + +--- + + + + +## Bluetooth Basic Rate/Extended Data rate + +- 2.400 GHz to 2.4835 GHz +- 1 MHz channel spacing +- 78 Channels +- Up to 20 dBm +- Minimum -70 dBm sensitivity (1 Mbps) +- 1 MHz GFSK (1 Mbps), pi/4-DQPSK (2 Mbps), 8DPSK (3 Mbps) + + + +--- + +## Bluetooth Low Energy + +- 2.400 GHz to 2.480 GHz +- 2 MHz channel spacing +- 40 Channels (3 primary advertising channels) +- Up to 20 dBm +- Minimum -70 dBm sensitivity (1 Mbps) +- 1 MHz GFSK (1 Mbps, 500 kbps, 125 kbps), 2 MHz GFSK (2 Mbps) + +--- + + + +![inline](https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/map.PNG) + +--- + + + +![inline](https://devzone.nordicsemi.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-12-DZ-21/ble_5F00_connection.jpg) + +--- + + + +![inline](https://devzone.nordicsemi.com/resized-image/__size/1042x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-28/2148.pastedimage1646833758482v3.png) + +--- + +For further information [Building a Bluetooth application on nRF Connect SDK](https://devzone.nordicsemi.com/guides/nrf-connect-sdk-guides/b/software/posts/building-a-ble-application-on-ncs-comparing-and-contrasting-to-softdevice-based-ble-applications) + + + +![right](../media/bluetooth_future.png) + +--- +[.background-color: #00A9CE] + + + +#[fit] Low Power Recievers + +--- + +# Algorithm to design state-of-the-art LE radio +- Find most recent digest from International Solid State Circuit Conference (ISSCC) +- Find Bluetooth low energy papers +- Pick the best blocks from each paper + +--- + + + +![](../media/sony_architecture.png) + +--- + + + +| Blocks | Key parameter | Architecture | Complexity (nr people) | +|-------------------|---------------------------------------|---------------|------------------------| +| Antenna | Gain, impedance | ?? | <1 | +| RF match | loss, input impedance | PI-match? | <1 | +| Low noise amp | NF, current, linearity | LNTA | 1 | +| Mixer | NF, current, linearity | Passive | 1 | +| Anti-alias filter | NF, linearity | TIA + AFIR | 1 | +| ADC | Sample rate, dynamic range, linearity | NS-SAR | 1 - 2 | +| PLL | Freq accuracy, phase noise, current | AD-PLL | 2-3 | +| Baseband | Eb/N0, gate count, current. | SystemVerilog | > 10 | + +--- + +## [fit] LNTA + +--- + + + +![](../media/lnta1.png) + +--- + +![](../media/lnta2.png) + +--- + +![](../media/lnta3.png) + +--- + +## [fit] MIXER + + + +--- + +![](../media/mixer.png) + + +--- + + + + +![](../media/divider.png) + +--- + +## [fit] AAF + + + +--- + +![](../media/aaf1.png) + +--- + +![](../media/aaf2.png) + +--- + + + +![](../media/aaf4.png) + +--- + +## [fit] ADC + + + +--- + +![fit](../media/garvik.png) + +--- + + + + +![fit](../media/wulff.png) + +--- + + + +![fit](../media/fig_sar_logic.pdf) + +--- + + + + +![fit](../media/fig_toplevel.pdf) + + +--- + +## [fit] AD-PLL + + + +--- +#Phase Locked loops + +[.column] + +![inline](../media/basic_pll.png) + +[.column] +- Read Razavi's PLL book + +--- +AD-PLL with Bang-Bang phase detector for steady-state + +![inline](../media/pll_master_arch_28feb2020.pdf) + +--- + +##[fit] Baseband + + + +--- + + +|Baseband block | Why | +|---|---| +| Mixer? | If we're using low intermediate frequency to avoid DC offset problems and flicker noise| +| Channel filters?| If the AAF is insufficient for adjacent channel| +| Power detection | To be able to control the gain of the radio| +| Phase extraction| Assuming we're using FSK| +| Timing recovery | Figure out when to slice the symbol| +| Bit detection | single slice, multi-bit slice, correlators etc| +| Address detection | Is the packet for us?| +| Header detection | What does the packet contain| +| CRC | Does the packet have bit errors| +| Payload de-crypt| Most links are encrypted by AES| +| Memory access| Payload need to be stored until CPU can do something| + +--- + +# What do we really want, in the end? + + + + +$$P_{RX_{sens}} = -174 dBm + 10 \times log10(DR) + NF + Eb/N0$$ + +for example, for nRF5340 + + +$$ P_{RX_{sens}} + 174 - 60 = NF + Eb/N0 = 17 dB$$ + + + +![right 100%](../media/nrf53_rx.png) + +--- + + + +![fit](../media/nrf53.png) + +--- + + + +![150%](../media/nRF52832 CIAA.png) + +--- + +#[fit] Thanks! + +--- + +# References + +"A 0.5V BLE Transceiver with a 1.9mW RX Achieving -96.4dBm Sensitivity and 4.1dB Adjacent Channel Rejection at 1MHz Offset in 22nm FDSOI", M. Tamura, Sony Semiconductor Solutions, Atsugi, Japan, 30.5, ISSCC 2020 + +"A 370uW 5.5dB-NF BLE/BT5.0/IEEE 802.15.4-Compliant Receiver with >63dB Adjacent Channel Rejection at >2 Channels Offset in 22nm FDSOI", B. J. Thijssen, University of Twente, Enschede, The Netherlands + +"A 68 dB SNDR Compiled Noise-Shaping SAR ADC With On-Chip CDAC Calibration", H. Garvik, C. Wulff, T. Ytterdal + +"A Compiled 9-bit 20-MS/s 3.5-fJ/conv.step SAR ADC in 28-nm FDSOI for Bluetooth Low Energy Recievers", C. Wulff, T. Ytterdal + +Cole Nielsen, + +"Python Framework for Design and Simulation of Integer-N ADPLLs", Cole Nielsen, + +Design of CMOS Phase-Locked Loops, Behzad Razavi, University of California, Los Angeles + + + + + + + diff --git a/lectures/l11_aver.md b/lectures/l11_aver.md new file mode 100644 index 0000000..d16b8ef --- /dev/null +++ b/lectures/l11_aver.md @@ -0,0 +1,621 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme:Plain Jane,1 + + + +# TFE4188 - Lecture 11 +# Analog SystemVerilog + + + +--- + + + +# Goal + +Explain why we need **Analog SystemVerilog** models + +Introduction to Analog SystemVerilog + +--- + + + + + + +#[fit] Why + + + +--- + + + + + + +![](../media/dig_des.svg) + +--- + +# Digital simulation + + + +- The order of execution of events at the same time-step do not matter + +- The system is causal. Changes in the future do not affect signals in the past or the now + + + + +![left fit](../media/eventqueue.png) + + + + +--- + +![left fit](../media/systemdotnet.png) + +### Digital Simulators + + + +**Commercial** + +- [Cadence Excelium](https://www.cadence.com/ko_KR/home/tools/system-design-and-verification/simulation-and-testbench-verification/xcelium-simulator.html) +- [Siemens Questa](https://eda.sw.siemens.com/en-US/ic/questa/simulation/advanced-simulator/) +- [Synopsys VCS](https://www.synopsys.com/verification/simulation/vcs.html) + +**Open Source** +- [iverilog/vpp](https://github.com/steveicarus/iverilog) +- [Verilator](https://www.veripool.org/verilator/) +- [SystemDotNet](https://sourceforge.net/projects/systemdotnet/) + + + +--- + + + +### Counter + + + +[.column] + +```verilog +module counter( + output logic [WIDTH-1:0] out, + input logic clk, + input logic reset + ); + + parameter WIDTH = 8; + + logic [WIDTH-1:0] count; + always_comb begin + count = out + 1; + end + + always_ff @(posedge clk or posedge reset) begin + if (reset) + out <= 0; + else + out <= count; + end + +endmodule // counter +``` + +[.column] + + + + + +```bash +Assume `clk, reset, out = 0` + +Assume event with `clk = 1` + +0: Set `out = count` in next event (1) + +1: Set `count = out + 1` using + logic (may consume multiple events) + +X: no further events +``` +--- + + + + +![](../media/sv_counter.png) + + +--- + +# Transient analog simulation + + +[.column] + + +parse spice netlist, and setup partial/ordinary differential equations for node matrix + + + +$$ +\begin{pmatrix} +G_{11} &G_{12} &\cdots &G_{1N} \\ +G_{21} &G_{22} &\cdots &G_{2N} \\ +\vdots &\vdots &\ddots & \vdots\\ +G_{N1} &G_{N2} &\cdots &G_{NN} +\end{pmatrix} +\begin{pmatrix} +v_1\\ +v_2\\ +\vdots\\ +v_N +\end{pmatrix}= +\begin{pmatrix} +i_1\\ +i_2\\ +\vdots\\ +i_N +\end{pmatrix} +$$ + + +[.column] + + +model the non-linear current/voltage behavior between all nodes + + +numerical methods to compute time evolution + + + +- [Euler](https://aquaulb.github.io/book_solving_pde_mooc/solving_pde_mooc/notebooks/02_TimeIntegration/02_01_EulerMethod.html) +- [Runge-Kutta](https://aquaulb.github.io/book_solving_pde_mooc/solving_pde_mooc/notebooks/02_TimeIntegration/02_02_RungeKutta.html) +- [Crank-Nicolson](https://en.wikipedia.org/wiki/Crank%E2%80%93Nicolson_method) +- [Gear](https://ieeexplore.ieee.org/document/1083221) + + + + +--- + +[.column] + +[SPICE (Simulation Program with Integrated Circuit Emphasis)](https://www2.eecs.berkeley.edu/Pubs/TechRpts/1973/ERL-m-382.pdf) +published in 1973 by Nagel and Pederson + +[.column] + + + + +**Commercial** +- [Cadence Spectre](https://www.cadence.com/ko_KR/home/tools/custom-ic-analog-rf-design/circuit-simulation/spectre-simulation-platform.html) +- [Siemens Eldo](https://eda.sw.siemens.com/en-US/ic/eldo/) +- [Synopsys HSPICE](https://www.synopsys.com/implementation-and-signoff/ams-simulation/primesim-hspice.html) + + +**Free** +- [Aimspice](http://aimspice.com) +- [Analog Devices LTspice](https://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html) +- [xyce](https://xyce.sandia.gov) + +**Open Source** +- [ngspice](http://ngspice.sourceforge.net) + + +--- + + + + +![fit](../media/mixed_simulator.pdf) + +--- + + + +#[fit] Analog SystemVerilog Example + +--- + +[.column] + + + +# TFE4152 2021 - Project + + +Be inspired by the ISSCC paper, and design a similar system. + +Design analog circuits in SPICE + +Design digital circuits in SystemVerilog + + +[A 10 000 Frames/s CMOS Digital Pixel Sensor](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=972156) + +[.column] + +![inline fit](../ip/block_diagram_modified.pdf) + + +--- + + + +![left fit](../ip/pixelSensor.png) + +![right fit](../ip/timing_diagram.png) + +--- + + + +![original fit](../media/pixelSensorModel.pdf) + +--- + + + +# What you got + + + +[github.com/wulffern/dicex](https://github.com/wulffern/dicex) + +``` +project/ +├── spice/ +│   ├── Makefile # See https://www.gnu.org/software/make/manual/html_node/Introduction.html +│   ├── pixelSensor.cir # Almost empty circuit for pixelSensor +│   └── pixelSensor_tb.cir # SPICE testbench for pixelSensor, emulates verilog +└── verilog/ + ├── Makefile + ├── pixelSensor.fl # Verilog file list + ├── pixelSensor_tb.gtkw # Save file for GTKWave + ├── pixelSensor_tb.v # Verilog testbench for pixelSensor + └── pixelSensor.v # Verilog model of analog pixelSensor circuit +``` + + +--- + + + +[.column] + +```verilog + +module PIXEL_SENSOR + ( + input logic VBN1, + input logic RAMP, + input logic RESET, + input logic ERASE, + input logic EXPOSE, + input logic READ, + inout [7:0] DATA + + ); + + real v_erase = 1.2; + real lsb = v_erase/255; + parameter real dv_pixel = 0.5; + + real tmp; + logic cmp; + real adc; + + logic [7:0] p_data; + + //---------------------------------------------------------------- + // ERASE + //---------------------------------------------------------------- + // Reset the pixel value on pixRst + always @(ERASE) begin + tmp = v_erase; + p_data = 0; + cmp = 0; + adc = 0; + end + +``` + + + +[.column] + +```verilog + //---------------------------------------------------------------- + // SENSOR + //---------------------------------------------------------------- + // Use bias to provide a clock for integration when exposing + always @(posedge VBN1) begin + if(EXPOSE) + tmp = tmp - dv_pixel*lsb; + end + + //---------------------------------------------------------------- + // Comparator + //---------------------------------------------------------------- + // Use ramp to provide a clock for ADC conversion, assume that ramp + // and DATA are synchronous + always @(posedge RAMP) begin + adc = adc + lsb; + if(adc > tmp) + cmp <= 1; + end + + //---------------------------------------------------------------- + // Memory latch + //---------------------------------------------------------------- + always_comb begin + if(!cmp) begin + p_data = DATA; + end + + end + + //---------------------------------------------------------------- + // Readout + //---------------------------------------------------------------- + // Assign data to bus when pixRead = 0 + assign DATA = READ ? p_data : 8'bZ; + +endmodule // re_control + +``` + + + + +--- + + + +![](https://youtu.be/gNpPslQZT-Y) + +--- + +#[fit] Thanks! diff --git a/lectures/l12_chinf.md b/lectures/l12_chinf.md new file mode 100644 index 0000000..bf10a70 --- /dev/null +++ b/lectures/l12_chinf.md @@ -0,0 +1,318 @@ +footer: Carsten Wulff 2021 +slidenumbers:true +autoscale:true +theme:Plain Jane,1 + +# TFE4188 - Lecture 11 +# Chip infrastructure + +--- +# Housekeeping + +[Syllabus](https://github.com/wulffern/aic2022/blob/main/syllabus.md) + +Exam + +Project + +--- + +#[fit] I want you to learn the necessary skills to make your own ICs + +--- + +#[fit] Exam + +--- + +- 19'th and 20'th of May +- Oral, approx 40 minutes +- 55% of the final grade +- A - F grade (F = Fail) +- Book a slot [https://www.ntnu.no/wiki/display/tfe4487/Oral+exam+2022](https://www.ntnu.no/wiki/display/tfe4487/Oral+exam+2022) + +--- + +![left fit](../media/l12_ldo.pdf) + +# Possible exam questions + +Q1: What circuit could the picture be? + +Q2: How would you make the bias current? + +Q3: How could we make the output voltage process independent? + +--- + +![fit](../media/l12_ex1.pdf) + +--- + + +# Q4: Draw a block diagram of a PLL, and explain. + +--- + +#[fit] Project + +--- + +45 % of final grade + +Deadline: 22 of April. Upload project paper on blackboard. + +Strict deadline, if you hand in 23 of April at 00:00:01, then it's a fail. + +--- + +#[fit] Project Report $$\Rightarrow$$ Paper + +#[fit] [A Compiled 9-bit 20-MS/s 3.5-fJ/conv.step SAR ADC in 28-nm FDSOI for Bluetooth Low Energy Receivers](https://ieeexplore.ieee.org/document/7906479) + +[IEEE journal template](https://ctan.org/pkg/ieeetran?lang=en), [Example](https://github.com/wulffern/jssc2017) + +Must use `\documentclass[journal,11pt,letterpaper]{IEEEtran}` + +Strict page limit for report, max 8 pages (excluding bio and references). More than 8 pages $$\Rightarrow$$ Fail + +--- + +# [Grading of the project](https://www.ntnu.no/wiki/display/tfe4487/Grading+of+the+project) + +--- + +# [Tapeout Review](https://www.ntnu.no/wiki/display/tfe4487/Tapeout+Review) + +--- + +4'th of April, presentation of project + +2 - 5 slides + +Why, how, what + + +Affects coolness + +--- + + + +| Week | Book | Monday | Project plan | Exercise | +|------|----------------------|------------------------------------------------------------------------------|--------------------------|----------| +| 2 | CJM 1-6 | Course intro, what I expect you to know, project, analog design fundamentals | Specification | | +| 3 | Slides | ESD and IC Input/Output | Specification | x | +| 4 | CJM 7,8 | Reference and bias | Specification | | +| 5 | CJM 12 | Analog Front-end | M1. Specification review | x | +| 6 | CJM 11-14 | Switched capacitor circuits | Design | | +| 7 | JSSC, CJM 18 | State-of-the-art ADCs | Design | x | +| 8 | Slides | Low power radio recievers | Design | | +| 9 | Slides | Communication standards from circuit perspective | M2. Design review | x | +| 10 | CJM 7.4, CFAS,+DC/DC | Voltage regulation | Layout | | +| 11 | CJM 19, CFAS | Clock generation | Layout | x | +| 12 | Paper | Energy sources | Layout/LPE simulation | | +| 13 | Slides | **Chip infrastructure** | Layout/LPE simulation | x | +| 14 | | Tapeout review | M4. Tapeout review | | +| 15 | | Easter | | | +| 16 | | Easter | | | +| 17 | | Exam repetition | | | + +--- + + +# Goal + +Few words on **I/O** + +Understand **why** we need power on reset and brown out reset + +Understand **how** POR/BOR could made + +Thoughts on infrastructure + +--- + +#[fit] I/O + +--- + +#[fit] Input buffer + +![right fit](../media/fig_methodology.pdf) + +--- + +![fit](../media/l12_in1.pdf) + +--- + +#[fit] Digital output + +--- + +![fit](../media/l12_do1.pdf) + +--- + +![fit](../media/l12_do2.pdf) + +--- + +![fit](../media/l12_do3.pdf) + +--- + +![fit](../media/l12_do4.pdf) + +--- + +#[fit] Latch-up + +Logic cells close to large NMOS pad drivers are prone to latch-up. + +The latch-up process can start with electrons injected into the p-type substrate. + +![right 200%](../media/fig_inv.pdf) + +--- +# Latch-up + +1. Electrons injected into substrate, diffuse around, but will be accelerated by n-well to p-substrate built in voltage. Can end up in n-well +2. PMOS drain can be forward biased by reduced n-well potential. Hole injection into n-well. Holes diffuse around, but will be accelerated by n-well to p-substrate built in voltage. Can end up in p-substrate under NMOS +3. NMOS source pn-junction can be forward biased. Electrons injected into p-substrate. Diffuse around, but will be accelerated by n-well to p-substrate built in voltage. +4. Go to 2 (latch-up) + +![right fit](../media/scr_eh.pdf) + +--- + +# High-speed I/O + +# [LVDS](https://ieeexplore.ieee.org/search/searchresult.jsp?queryText=LVDS&highlight=true&returnFacets=ALL&returnType=SEARCH&matchPubs=true&refinements=PublicationTitle:IEEE%20Journal%20of%20Solid-State%20Circuits) + +# [SERDES](https://ieeexplore.ieee.org/search/searchresult.jsp?queryText=SERDES&highlight=true&returnType=SEARCH&matchPubs=true&sortType=newest&returnFacets=ALL&refinements=PublicationTitle:IEEE%20Journal%20of%20Solid-State%20Circuits) + +--- + +#[fit] POR / BOR + +--- + +![fit](../media/logic.pdf) + + +--- + +![fit](../media/nRF53.png) + +--- + +![fit](../media/l12_reset.pdf) + +--- + +![fit](../media/l12_reset1.pdf) + +--- + +![fit](../media/l12_reset2.pdf) + + +--- + +![fit](../ip/l12_por0.pdf) + +--- + +![fit](../ip/l12_por1.pdf) + +--- + + +![fit](../ip/l12_por2.pdf) + +--- + +![fit](../ip/l12_por3.pdf) + +--- + +![fit](../ip/l12_por4.pdf) + +--- + +![fit](../ip/l12_por5.pdf) + +--- + +![fit](../ip/l12_por6.pdf) + +--- + +#[fit] Infrastructure + +--- + + +![fit](https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Skyscrapercompare.svg/750px-Skyscrapercompare.svg.png) + + +--- + +![left fit](https://upload.wikimedia.org/wikipedia/en/9/93/Burj_Khalifa.jpg) + +![right fit](https://static.boredpanda.com/blog/wp-content/uploads/2020/12/sustainable-tiny-home-project-escape-vista-boho-xl-ikea-50-1.jpg) + +--- + +![left fit](https://upload.wikimedia.org/wikipedia/en/9/93/Burj_Khalifa.jpg) + +![right 170%](https://www.xda-developers.com/files/2022/03/Appple-m1-Ultra-die-shot.jpg) + +--- + +![left fit](https://static.boredpanda.com/blog/wp-content/uploads/2020/12/sustainable-tiny-home-project-escape-vista-boho-xl-ikea-50-1.jpg) + +![right](https://s.zeptobars.com/Nordic-NRF24L01P.jpg) + +--- + +# All modern SoCs need infrastructure IPs + +Voltage Regulators : LDO, BUCK, BOOST + +Power on Reset + +Current sources + +Voltage references + +Clock sources : XO, RC, PLL, DLL, FLL + +--- + +#[fit] All SoCs need infrastructure IPs + +# so I can make them and sell them!!!! + +# \#getrich + +--- + + +![left fit](https://upload.wikimedia.org/wikipedia/en/9/93/Burj_Khalifa.jpg) + +![right fit](https://static.boredpanda.com/blog/wp-content/uploads/2020/12/sustainable-tiny-home-project-escape-vista-boho-xl-ikea-50-1.jpg) + + +--- + + +#[fit] Thanks! + + + + + + diff --git a/lectures/lx_energysrc.md b/lectures/lx_energysrc.md new file mode 100644 index 0000000..80657a7 --- /dev/null +++ b/lectures/lx_energysrc.md @@ -0,0 +1,691 @@ +footer: Carsten Wulff 2023 +slidenumbers:true +autoscale:true +theme:Plain Jane,1 + + + +# TFE4188 - Lecture X +# Energy Sources + + + +--- + + + +# Goal + +**Why** do we need energy sources? + +Introduction to **Energy Harvesting** + +--- + + + +#[fit] Why + +--- + + + +[.column] + +-- +-- +-- +-- + +#[fit] Lithium Battery + +[.column] + +-- +-- +-- +-- + +1 year $$ \Rightarrow$$ 45 $$\mu$$W/cm$$^3$$ + +10 year $$ \Rightarrow$$ 3.5 $$\mu$$W/cm$$^3$$ + +--- + + + + +![fit](../ip/l11_teg2_0.pdf) + +--- + + + + ![fit](../ip/l11_teg2_1.pdf) + +--- + + + + +![fit](https://ieeexplore.ieee.org/mediastore_new/IEEE/content/media/6287639/8600701/8762143/shirv6-2928523-large.gif) + +--- + + + + ![fit](../ip/l11_eh_src.pdf) + +--- + + + + +## Thermoelectric + +## Photovoltaic + +## Piezoelectric + +## Ambient RF + +## Triboelectric + + + +--- + +#[fit] [Thermoelectric](https://en.wikipedia.org/wiki/Thermoelectric_effect) + +--- + + + + +![fit](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Thermoelectric_Generator_Diagram.svg/440px-Thermoelectric_Generator_Diagram.svg.png) + + + + +--- + +## [Radioisotope Thermoelectric generator](https://en.wikipedia.org/wiki/Radioisotope_thermoelectric_generator) + + + +![left fit](https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Voyager_spacecraft_model.png/1280px-Voyager_spacecraft_model.png) + + +--- + +## [Thermoelectric generators](https://en.wikipedia.org/wiki/Thermoelectric_generator) + + + +![left fit](../media/l11_teg_mdl.pdf) + +--- + + + +![fit](../ip/l11_teg1_0.pdf) + +--- + + + +![fit](../ip/l11_teg1_1.pdf) + +--- + + + +![fit](../ip/l11_teg1_2.pdf) + +--- + + + +![fit](../ip/l11_teg1_3.pdf) + +--- + + + + +![fit](../ip/l11_teg1_4.pdf) + +--- + + + +![fit](../ip/l11_teg1_5.pdf) + +--- + +#[fit] [Photovoltaic](https://en.wikipedia.org/wiki/Photovoltaic_effect) + +--- + + + + +![fit](../media/l11_pv_pn.pdf) + +--- + + + +![left fit](../media/l11_pv_mdl.pdf) + + + + +$$ I_D = I_S\left(e^\frac{V_D}{V_T} - 1\right)$$ + +$$ I_D = I_{Photo} - I_{Load}$$ + +$$ V_D = V_T ln{\left(\frac{I_{Photo} - I_{Load}}{I_S} + 1 \right)} $$ + +$$ P_{Load} = V_D I_{Load}$$ + + + + +--- + +```python +#!/usr/bin/env python3 +import numpy as np +import matplotlib.pyplot as plt + +m = 1e-3 +i_load = np.linspace(1e-5,1e-3,200) + +i_s = 1e-12 # saturation current +i_ph = 1e-3 # Photocurrent + +V_T = 1.38e-23*300/1.6e-19 #Thermal voltage + +V_D = V_T*np.log((i_ph - i_load)/(i_s) + 1) + +P_load = V_D*i_load + +plt.subplot(2,1,1) +plt.plot(i_load/m,V_D) +plt.ylabel("Diode voltage [mA]") +plt.grid() +plt.subplot(2,1,2) +plt.plot(i_load/m,P_load/m) +plt.xlabel("Current load [mA]") +plt.ylabel("Power Load [mW]") +plt.grid() +plt.savefig("pv.pdf") +plt.show() + +``` + + + +![right fit](../py/pv.pdf) + + + +--- + + + +![left original fit](../py/pv.pdf) + +[ANYSOLAR](https://www.digikey.no/en/products/detail/anysolar-ltd/KXOB25-03X4F-TB/13999196) + +![right original fit](../ip/l11_pv_dtsh.pdf) + +--- + + + +![fit](../ip/l11_pv1_0.pdf) + +--- + + + +![fit](../ip/l11_pv1_1.pdf) + +--- + + + +![fit](../ip/l11_pv1_2.pdf) + +--- + +#[fit] [Piezoelectric](https://en.wikipedia.org/wiki/Piezoelectricity) + + + +--- + + + + + +![fit](https://upload.wikimedia.org/wikipedia/commons/c/c4/SchemaPiezo.gif) + +--- + + + +![fit](../media/lx_piezo_mdl.pdf) + + + +--- + + + +![fit](../ip/l11_pc2_0.pdf) + +--- + + + + +![fit](../ip/l11_pc2_1.pdf) + +--- + + + +#[fit] Ambient RF + +--- + +# Ambient RF Harvesting + +[.column] + +Extremely inefficient idea, but may find special use-cases at short-distance. + + + + +Will get better with beam-forming and directive antennas + + + +[AirFuel](https://airfuel.org/airfuel-rf/) + + + + +[.column] + +| dBm | W | +| :---: | :---: | +| 30 | 1 | +| 0 | 1 m| +| -30 | 1 u| +| -60 | 1 n | +| -90 | 1 p| + +--- + + + +Assume $$P_{TX}$$ = 1 W (30 dBm) and $$P_{RX}$$ = 10 uW (-20 dBm) + + + +$$ D = 10^\frac{P_{TX} - P_{RX} + 20 log_{10}\left(\frac{c}{4 \pi f}\right)}{20} $$ + + + +| Freq | **$$20 log_{10}\left(c/4 \pi f\right)$$** [dB]| D [m]| +| ----|:----:| ---: | +| 915M | -31.7 | 8.2 | +| 2.45G | -40.2 | 3.1 | +| 5.80G | -47.7 | 1.3 | + + + + +--- + +#[fit] Triboelectric generator + + + +--- + +![fit](../media/lx_trib_mdl.pdf) + +--- + + + +![fit](../ip/l11_teng0_0.pdf) + +--- + + + +![fit](../ip/l11_teng0_1.pdf) + +--- + + + +![fit](../ip/l11_teng2_0.pdf) + +--- + + + +![fit](../ip/l11_teng2_4.pdf) + + +--- + + + +![fit](../ip/l11_teng2_1.pdf) + +--- + + + +![fit](../ip/l11_teng2_2.pdf) + +--- + +#[fit] Comparison + +--- + + + +![fit](https://ieeexplore.ieee.org/mediastore_new/IEEE/content/media/4/9546917/9441315/yoo4-3080383-large.gif) + + +--- + +# References + + +[Towards a Green and Self-Powered Internet of Things Using Piezoelectric Energy Harvesting](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8762143) + +[A 3.5-mV Input Single-Inductor Self-Starting Boost Converter With Loss-Aware MPPT for Efficient Autonomous Body-Heat Energy Harvesting](https://ieeexplore.ieee.org/document/9302641) + +[A Reconfigurable Capacitive Power Converter With Capacitance Redistribution for Indoor Light-Powered Batteryless Internet- of-Things Devices](https://ieeexplore.ieee.org/abstract/document/9423810) + +[A Fully Integrated Split-Electrode SSHC Rectifier for Piezoelectric Energy Harvesting](https://ieeexplore.ieee.org/document/8642406) + +[Current progress on power management systems for triboelectric nanogenerators](https://ieeexplore.ieee.org/document/9729411) + +[A Fully Energy-Autonomous Temperature-to-Time Converter Powered by a Triboelectric Energy Harvester for Biomedical Applications](https://ieeexplore.ieee.org/document/9441315) + + + +--- + + +#[fit] Thanks! + + + + diff --git a/lectures/tex_intro.md b/lectures/tex_intro.md new file mode 100644 index 0000000..7d36c5c --- /dev/null +++ b/lectures/tex_intro.md @@ -0,0 +1,25 @@ + + +--- + + + +In the spring of 2024 I'll lecture Advanced Integrated Circuits for the third +time. I have an inherent need to make things better, and the course is no +different. + +In the first round I noticed that very little of what I had on slides, or +said in lectures, made it into the student brain. That annoyed me, +and I realized that probably a few things needed to change. + +As I now prepare for the 3'rd semester, it will be interesting to see if +anything will be better. The sources are at [analogicus.com/aic2024](https://analogicus.com/aic2024/). + + +I love programming and automation. Not much makes me more happy than using the +same source (the [slide +markdowns](https://github.com/wulffern/aic2024/tree/main/lectures)), to generate the [lecture notes](https://analogicus.com/aic2024/), to translate +into the [book](https://analogicus.com/aic2024/assets/aic.pdf) your looking at right now. + + +If you find an error in what I've made, then [fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) [aic2024](https://github.com/wulffern/aic2024), fix , [commit](https://git-scm.com/docs/git-commit), [push](https://git-scm.com/docs/git-push) and [create a pull request](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/working-with-your-remote-repository-on-github-or-github-enterprise/creating-an-issue-or-pull-request). That way, we use the global brain power most efficiently, and avoid multiple humans spending time on discovering the same error. diff --git a/py/lecture.py b/py/lecture.py new file mode 100644 index 0000000..37dd7be --- /dev/null +++ b/py/lecture.py @@ -0,0 +1,429 @@ +#!/usr/bin/env python3 + +import re +import os +import click +from sys import platform +import shutil +import urllib.parse + +class Image(): + + def __init__(self,imgsrc,options): + self.src = imgsrc + self.orgsrc = imgsrc + self.options = options + self.directory = options["dir"] + self.skip = False + self.isUrl = False + + + if("/ip/" in self.src and "allowIP" not in self.options): + self.skip = True + + if(re.search("\s*https?://",self.src)): + self.isUrl = True + if("downloadImage" in self.options): + self.skip = False + else: + self.skip = True + + + if(not self.skip and ".pdf" in self.src and "latex" not in self.options): + #- I've changed to svg, hopefully better images + svg = self.src.replace(".pdf",".svg") + if(not os.path.exists(os.path.join(self.directory,svg))): + cmd = f"cd {self.directory}; pdftocairo -svg {self.src} {svg}" + os.system(cmd) + self.src = svg + + if(self.isUrl and "downloadImage" in self.options): + url = self.src + self.src = "/tmp/" + urllib.parse.unquote(os.path.basename(self.src)) + if(not os.path.exists(self.src)): + os.system(f"cd /tmp/; wget {url}") + + + + + self.filesrc = os.path.basename(self.src) + self.dirsrc = os.path.dirname(self.src) + + + def copy(self): + if(self.skip): + return + + if("jekyll" in self.options): + shutil.copyfile(os.path.join(self.options["dir"],self.src), "docs/assets/media/" + self.filesrc) + elif("latex" in self.options): + os.makedirs(self.options["latex"] + "media/",exist_ok=True) + try: + shutil.copyfile(os.path.join(self.options["dir"],self.src), self.options["latex"] + "media/" + self.filesrc) + except Exception as e: + print(e) + def __str__(self): + + if(self.skip): + return f"> image {self.src} removed" + + if("jekyll" in self.options): + path = self.options["jekyll"] + "assets/media/" + self.filesrc + + return f"![]({path})" + "{: width=\"700\" }\n" + elif("latex" in self.options): + path = "media/" + self.filesrc + return f"![]({path})\n\n" + + return self.src + +class Lecture(): + + def __init__(self,filename,options): + self.filename = filename + self.title = "" + self.options = options + self.date = None + self.images = list() + + self.filters = { + "^\s*---\s*$" : "", + "\[.column\]" : "", + "\[\.background.*\]" : "", + "\[\.text.*\]" : "", + "\[\.table *\]" : "", + "\#\s*\[\s*fit\s*\]" : "# ", + "\*\*Q:\*\*" : "", + "^[.table.*]$": "", + "#(.*) Thanks!" : "" + } + + self._read() + + def copyAssets(self): + with open("images.txt","a") as fo: + for image in self.images: + if(not image.skip): + fo.write(image.orgsrc + "\n") + fo.write(image.src +"\n") + image.copy() + + + def _read(self): + + self.buffer = list() + first = True + self.output = False + self.skipslide = False + self.removeComment = False + + with open(self.filename) as fi: + for line in fi: + + if(first and "date:" in line): + (k,v) = line.split(" ") + self.date = v.strip() + + if(first and re.search(r"^\s*$",line)): + first = False + self.output = True + + + line = self._readPan(line) + + if(line): + line = self._filterLine(line) + line = self._convertImage(line) + + + if(line is not None and self.output): + self.buffer.append(line) + + + + def _readPan(self,line): + + #- Check pan tags + m = re.search(r"","") + + elif(key == "skip"): + self.skipslide = True + self.output = False + + elif(key == "doc"): + # Start statemachine + # 1. Skip this line, it should be + # 3. When -->, assume that's the end of the pan_doc, and go back to normal + self.removeComment = True + else: + print(f"Uknown key {key}") + + return None + + #- Go back to normal mode + if(self.removeComment and re.search("-->",line)): + self.removeComment = False + return None + + if(self.skipslide and re.search("^\s*---\s*$",line)): + self.output = True + return line + + def _convertImage(self,line): + m = re.search(r"\!\[([^\]]*)\]\(([^\)]+)\)",line) + + if(m): + imgsrc = m.groups()[1] + + if(not "downloadImage" in self.options): + if(re.search("\s*https://",imgsrc)): + return f"![]({imgsrc})" + + i = Image(imgsrc,self.options) + self.images.append(i) + line = str(i) + return line + + + def _filterLine(self,line): + for r,s in self.filters.items(): + line = re.sub(r,s,line) + return line + + def __str__(self): + + ss = "" + + if("jekyll" in self.options): + + furl = "https://github.com/wulffern/aic2024/tree/main/" + self.filename + slides = "" + if("lectures" in self.filename ): + slides = "[Slides](" + self.options["jekyll"] + self.filename.replace("lectures","assets/slides").replace(".md",".pdf") +")" + + ss += f"""--- +layout: post +title: {self.title} +math: true +--- + +> If you find an error in what I've made, then [fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo), fix [{self.filename}]({furl}), [commit](https://git-scm.com/docs/git-commit), [push](https://git-scm.com/docs/git-push) and [create a pull request](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/working-with-your-remote-repository-on-github-or-github-enterprise/creating-an-issue-or-pull-request). That way, we use the global brain power most efficiently, and avoid multiple humans spending time on discovering the same error. + +{slides} + + +""" + """ + + + +* TOC +{:toc } + +""" + + for l in self.buffer: + ss += l + return ss + +class Presentation(Lecture): + + def __init__(self,filename,options): + self.filename = filename + self.title = filename.replace(".md","") + self.options = options + + self.images = list() + + self.filters = { + "\[\.background.*\]" : "", + "\[\.text.*\]" : "", + "\[\.table *\]" : "", + "\#\s*\[\s*fit\s*\]" : "## ", + "^[.table.*]$": "", + "\!\[[^\]]+\]" : "![]", + "^# ":"## ", + "\[.column\]" : "", + #"^---":"#", + + } + + self._read() + + def _read(self): + + self.buffer = list() + first = True + self.output = False + self.skipslide = False + self.removeComment = False + + with open(self.filename) as fi: + for line in fi: + + if(first and re.search(r"^\s*$",line)): + first = False + self.output = True + + key = "" + val = "" + m = re.search(r"","") + + if(re.search("^",line)): + self.output = True + + def __str__(self): + + ss = "" + + ss += f"""--- +title: {self.title} +output: + slidy_presentation: + footer: "Copyright (c) 2024, Carsten Wulff" + fig_width: 800 +--- + +""" + """ + + + + +""" + for l in self.buffer: + ss += l + return ss + +class Latex(Lecture): + + def __init__(self,filename,options): + self.filename = filename + self.title = filename.replace(".md","") + self.options = options + + self.images = list() + + self.filters = { + "^\s*---\s*$" : "", + "\[.column\]" : "", + "\[\.background.*\]" : "", + "\[\.text.*\]" : "", + "\[\.table *\]" : "", + "\#\s*\[\s*fit\s*\]" : "# ", + "\#\#\s*\[\s*fit\s*\]" : "## ", + #"^## \*\*Q:\*\*.*$" : "", + "^[.table.*]$": "", + "^\* TOC":"", + "^{:toc }":"", + "\*\*Q:\*\*" : "", + "#(.*) Thanks!" : "" + #"^---":"#", + } + + self._read() + + + + def __str__(self): + + ss = "" + + ss += f""" + +""" + """ + + + + +""" + for l in self.buffer: + ss += l + return ss + + + + +@click.group() +def cli(): + """ + Convert a lecture to something + """ + pass + +@cli.command() +@click.argument("filename") +@click.option("--root",default="/aic2024/",help="Root of jekyll site") +@click.option("--date",default=None,help="Date to use") +def post(filename,root,date): + options = dict() + options["jekyll"] = root + options["dir"] = os.path.dirname(filename) + + if(not os.path.exists("docs/assets/media/")): + os.mkdir("docs/assets/media/") + + #- Post + l = Lecture(filename,options=options) + + if(date is None and l.date is not None): + date = l.date + else: + raise Exception(f"I need a date, either in the frontmatter, or the option for {filename}") + + l.copyAssets() + fname = "docs/_posts/" + date +"-"+ l.title.strip().replace(" ","-") + ".markdown" + + with open(fname,"w") as fo: + fo.write(str(l)) + + + +@cli.command() +@click.argument("filename") +@click.option("--root",default="pdf/",help="output roote") +def latex(filename,root): + options = dict() + options["latex"] = root + options["downloadImage"] = True + options["allowIP"] = True + options["dir"] = os.path.dirname(filename) + p = Latex(filename,options) + p.copyAssets() + + + fname = root + os.path.sep + p.title.strip().replace(" ","_").lower() + ".md" + with open(fname,"w") as fo: + fo.write(str(p)) + + flatex = fname.replace(".md",".latex") + cmd = f"pandoc -o {flatex} {fname} " + os.system(cmd) + + + + +if __name__ == "__main__": + cli()