handouts/Misc/Warm-Ups/flipflop.tex
2024-04-01 21:50:50 -07:00

177 lines
5.7 KiB
TeX
Executable File

\documentclass[
solutions,
shortwarning,
singlenumbering,
nopagenumber
]{../../resources/ormc_handout}
\usepackage{../../resources/macros}
\geometry{top = 20mm}
\usepackage{tikz}
\usetikzlibrary{circuits.logic.US}
\usetikzlibrary{plotmarks}
\title{Warm-Up: Flip-Flops}
\uptitler{\smallurl{}}
\subtitle{Prepared by Mark on \today.}
\begin{document}
\maketitle
\problem{}
Below is a circuit of logic gates. S and R are input pins, Q is an output pin. \par
What does it do?
\begin{center}
\begin{tikzpicture}[circuit logic US, scale=2]
% tikz notes:
% -|: Select vertical of first and horizontal of second
% Gates
\node[or gate] (or) at (0,0) {\tiny\texttt{or}};
\node[not gate] (not) at (0,-0.8) {\tiny\texttt{not}};
\node[and gate] (and) at (1.4,-0.4) {\tiny\texttt{and}};
% Important locations
\draw (or.input 1) ++(-0.5, 0) coordinate (start);
\draw (or.input 1) ++(-0.25, 0) coordinate (startjoin);
\draw (and.output) ++(0.25, 0) coordinate (endjoin);
\draw (and.output) ++(0.75, 0) coordinate (end);
% Connections
\draw (or.input 2) -- (or.input 2 -| start) node[anchor=east] {S};
\draw (not.input) -- (not.input -| start) node[anchor=east] {R};
\draw (or.output) -| (or.output -| 0.75,0) |- (and.input 1);
\draw (not.output) -| (not.output -| 0.75,0) |- (and.input 2);
\draw (and.output) -- (and.output -| endjoin) -- ++(0,0.9) -| (startjoin) -- (or.input 1);
\filldraw (and.output -| endjoin) circle[radius=0.3mm];
\draw (endjoin) -- (end) node[anchor=west] {Q};
\end{tikzpicture}
\end{center}
\begin{solution}
This is an S-R (\say{set-reset}) latch. \par
Set S to high, and Q will stay high until it is reset by R.
\end{solution}
\vfill
\problem{}
Below is another circuit. How does it work? \par
\hint{\texttt{nor} = not or. It works exactly as you'd expect.}
\begin{center}
\begin{tikzpicture}[circuit logic US, scale=2]
% Gates
\node[nor gate] (nora) at (0,0) {\tiny\texttt{nor}};
\node[nor gate] (norb) at (0,-1.2) {\tiny\texttt{nor}};
% Important locations
\draw (nora.input 1) ++(-0.5, 0) coordinate (start);
\draw (nora.input 1) ++(-0.25, 0) coordinate (startjoin);
\draw (nora.output) ++(0.25, 0) coordinate (endjoin);
\draw (nora.output) ++(0.75, 0) coordinate (end);
% Connections
% Input extension
\draw (nora.input 1) -- (nora.input 1 -| start) node[anchor=east] {S};
%\draw (nora.input 2 -| start) -- (nora.input 2);
%\draw (norb.input 1 -| start) -- (norb.input 1);
\draw (norb.input 2) -- (norb.input 2 -| start) node[anchor=east] {R};
% Output extension
\draw (norb.output) -- (norb.output -| end) node[anchor=west] {Q};
%\draw (norb.output) -- ++(1, 0) node[anchor=west] {$\overline{\text{Q}}$};
% Cross-connection
\draw (nora.output -| endjoin) -- (endjoin |- 0,-0.4) -- (startjoin |- 0,-0.8) -- (norb.input 1 -| startjoin) -- (norb.input 1);
\draw (norb.output -| endjoin) -- (endjoin |- 0,-0.8) -- (startjoin |- 0,-0.4) -- (nora.input 2 -| startjoin) -- (nora.input 2);
\draw (norb.output) -- (norb.output -| endjoin);
\filldraw (norb.output -| endjoin) circle[radius=0.3mm];
\draw (nora.output) -- (nora.output -| endjoin);
\end{tikzpicture}
\end{center}
\begin{solution}
This is another S-R (\say{set-reset}) latch.
\end{solution}
\vfill
\pagebreak
\problem{}
Empty circles represent inverted inputs/outputs.
This is the reason a \texttt{nand} gate looks like an \texttt{and} gate with a dot.
Pay careful attention to the nand gate in the bottom-left.
\vspace{2mm}
What does this circuit do?
\begin{center}
\begin{tikzpicture}[circuit logic US, scale=2]
% Gates
\node[nand gate] (nandc) at (1.4,0) {\tiny\texttt{nand}};
\node[nand gate] (nandd) at (1.4,-1.2) {\tiny\texttt{nand}};
% inputs=in => 1 is inverted, 2 is normal
\node[nand gate] (nanda) at (nandc.input 1 -| 0,0) {\tiny\texttt{nand}};
\node[nand gate,inputs=in] (nandb) at (nandd.input 2 -| 0,-1.2) {\tiny\texttt{nand}};
% Important locations
\draw (nanda.input 1) ++(-1, 0) coordinate (start);
\draw (nanda.input 1) ++(-0.5, 0) coordinate (startjoina);
\draw (nanda.input 1) ++(-0.25, 0) coordinate (startjoinb);
\draw (nandc.input 1) ++(-0.5, 0) coordinate (midstart);
\draw (nandc.input 1) ++(-0.25, 0) coordinate (midstartjoin);
\draw (nandc.output) ++(0.25, 0) coordinate (endjoin);
\draw (nandc.output) ++(0.75, 0) coordinate (end);
% Connections
\draw (nanda.input 1) -- (nanda.input 1 -| start) node[anchor=east] {D};
\draw (nandb.input 2) -- (nandb.input 2 -| start) node[anchor=east] {C};
\draw (nanda.input 1 -| startjoinb) |- (nandb.input 1);
\draw (nandb.input 2 -| startjoina) |- (nanda.input 2);
\filldraw (nanda.input 1 -| startjoinb) circle[radius=0.3mm];
\filldraw (nandb.input 2 -| startjoina) circle[radius=0.3mm];
\draw (nanda.output) -- (nandc.input 1);
\draw (nandb.output) -- (nandd.input 2);
\draw (nandc.output) -- (nandc.output -| end) node[anchor=west] {Q};
\draw (nandc.output -| endjoin) -- (endjoin |- 0,-0.4) -- (midstartjoin |- 0,-0.8) -- (nandd.input 1 -| midstartjoin) -- (nandd.input 1);
\draw (nandd.output -| endjoin) -- (endjoin |- 0,-0.8) -- (midstartjoin |- 0,-0.4) -- (nandc.input 2 -| midstartjoin) -- (nandc.input 2);
\draw (nandd.output) -- (nandd.output -| endjoin);
\draw (nandc.output) -- (nandc.output -| endjoin) circle[radius=0.3mm];
\filldraw (nandc.output -| endjoin) circle[radius=0.3mm];
\end{tikzpicture}
\end{center}
\begin{solution}
This is a D (\say{data}) flip-flop. \par
D is a \say{data} pin. When C is high, this circuit sets Q to D. \par
When C is low, Q stays at its previous value until D is set to high again.
\vspace{2mm}
In other words, this circuit \say{reads} D whenever C is high.
\end{solution}
\vfill
\pagebreak
\end{document}