我想使用两个 NOR 门绘制一个 SR 锁存器,每个输入都分支出来并从其他输出反馈。
我试过这种方法,请告诉我有什么更好的方法。我觉得这种微调似乎太不可能了,无法制作一本包含许多此类图表的书。
请分享类似的东西,具有先进的设计理念。
\documentclass{memoir}
\usepackage{tikz}
\usetikzlibrary{circuits.logic.US}
\tikzstyle{branch}=[fill,shape=circle,minimum size=2pt,inner sep=0pt]
\begin{document}
\begin{figure}[ht]
\centering
\begin{tikzpicture}[circuit logic US]
\matrix[column sep=10mm, row sep=5mm]
{
&\node [nor gate, inputs=nn] (n1) {}; \\
& \node [nor gate, inputs=nn] (n2) {}; \\
};
\draw (n1.input 2) -- ++(180:3mm) -- ++(270:2mm) -- ++(345:15mm) |- node [branch] {} (n2.output) -- ++(0:5mm) node [right] {$\overline{Q}$} ;
\draw (n1.output) -- ++(0:2mm) node [branch] (o1){} -- ++(0:3mm) node [right] {$Q$};
\draw (n2.input 1) -- ++(180:3mm) -- ++(90:2mm) -- ++(25:15.5mm) -- (o1) ;
\draw (n1.input 1) -- ++(180:5mm) node [left] (R) {R};
\draw (n2.input 2) -- ++(180:5mm) node [left] (S) {S};
\end{tikzpicture}
\caption{$SR$ Latch}
\label{fig:SRLatch}
\end{figure}
\end{document}
答案1
我不会让所有的长度都有点不同,而是使用1所有连接的长度测量,例如
\def\srdefaultlength{0.5cm}
然后只画出该长度或其倍数的线。例如,S
和R
终端2*\srdefaultlength
距离门较远,图中所有其他长度均为1*\srdefaultlength
。
此外,仅(明确地)以 0、90、180 或 270 的角度绘制线条。让 TikZ 自己绘制反馈线,而不指定角度/长度,如下所示。这样,您就会失去更多的自由度,这意味着花在调整等方面的时间更少。
通过遵循这两个“规则”,您可以更快地创建图表,并且不同的图表看起来都一样,因为长度都相同。
\documentclass{memoir}
\usepackage{tikz}
\usetikzlibrary{circuits.logic.US}
\tikzstyle{branch}=[fill,shape=circle,minimum size=2pt,inner sep=0pt]
\def\srdefaultlength{0.5cm}
\begin{document}
\begin{tikzpicture}[circuit logic US, node distance=2cm]
% Gates
\node[nor gate, inputs=nn] (n1) at (0,0) {};
\node[nor gate, inputs=nn, below of=n1] (n2) {};
% Input terminals
\draw (n1.input 1) --++(-2*\srdefaultlength,0) node[left] {$S$};
\draw (n2.input 2) --++(-2*\srdefaultlength,0) node[left] {$R$};
% Feedback inputs
\draw (n1.input 2) --++(-\srdefaultlength,0) --++(0,-\srdefaultlength) coordinate (tmp1);
\draw (n2.input 1) --++(-\srdefaultlength,0) --++(0,\srdefaultlength) coordinate (tmp2);
% Feedback outputs
\draw (n1.output) --++(\srdefaultlength,0) node[branch](tmp3){};
\draw (tmp3) --++(0,-\srdefaultlength) -- (tmp2);
\draw (n2.output) --++(\srdefaultlength,0) node[branch](tmp4){};
\draw (tmp4) --++(0,\srdefaultlength) -- (tmp1);
% Output terminals
\draw (tmp3) --++(\srdefaultlength,0) node[right] {$Q$};
\draw (tmp4) --++(\srdefaultlength,0) node[right] {$\overline{Q}$};
\end{tikzpicture}
\end{document}
我希望这能解决您的问题,如果没有,请让我知道您的顾虑。
答案2
这是略有不同的解决方案。显然,我更喜欢笛卡尔坐标而不是极坐标,并且喜欢使用 -| 和 |- 运算符来对齐点。
\documentclass{memoir}
\usepackage{tikz}
\usetikzlibrary{circuits.logic.US}
\tikzstyle{branch}=[fill,shape=circle,minimum size=2pt,inner sep=0pt]
\begin{document}
\begin{figure}[ht]
\centering
\begin{tikzpicture}[circuit logic US]
\matrix[column sep=10mm, row sep=5mm]
{
&\node [nor gate, inputs=nn] (n1) {}; \\
&\node [nor gate, inputs=nn] (n2) {}; \\
};
\draw (n1.input 1) -- ++(-5mm, 0pt) node [left] (S) {S};
\draw (n2.input 2) -- ++(-5mm, 0pt) node [left] (R) {R};
\draw (n1.output) -- ++(0:5mm) node [right] {$Q$};
\draw (n2.output) -- ++(0:5mm) node [right] {$\overline{Q}$};
\path (n1.input 2) ++(-3mm, -2mm) coordinate(A);
\path (n1.output) ++(3mm, 0pt) node[branch] (B){};
\path (n2.input 1) ++(-3mm, +2mm) coordinate(C);
\path (n2.output) ++(3mm, 0pt) node[branch] (D){};
\draw (n1.input 2) -| (A) -- (D |- C) -- (D);
\draw (n2.input 1) -| (C) -- (B |- A) -- (B);
\end{tikzpicture}
\caption{$SR$ Latch}
\label{fig:SRLatch}
\end{figure}
\end{document}