2023-10-31 09:09:59 -07:00
|
|
|
\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}
|
2024-04-01 21:50:50 -07:00
|
|
|
\uptitler{\smallurl{}}
|
|
|
|
\subtitle{Prepared by Mark on \today.}
|
2023-10-31 09:09:59 -07:00
|
|
|
|
|
|
|
\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
|
2024-04-01 21:50:50 -07:00
|
|
|
|
2023-10-31 09:09:59 -07:00
|
|
|
% 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}
|
2024-04-01 21:50:50 -07:00
|
|
|
|
2023-10-31 09:09:59 -07:00
|
|
|
\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]
|
2024-04-01 21:50:50 -07:00
|
|
|
|
|
|
|
|
2023-10-31 09:09:59 -07:00
|
|
|
% 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}
|