Tikz 数字逻辑图 - 我可以改进它吗

Tikz 数字逻辑图 - 我可以改进它吗

我想使用两个 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}

然后只画出该长度或其倍数的线。例如,SR终端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}

演示

相关内容