tikz-timing: Gibt es eine einfache Möglichkeit, eine nummerierte Zeitachse hinzuzufügen?

tikz-timing: Gibt es eine einfache Möglichkeit, eine nummerierte Zeitachse hinzuzufügen?

Ich liebe tikz-timing zum Vorbereiten von Zeitdiagrammen für meinen Unterricht. Eine Sache, die ich jedoch nicht herausfinden konnte, ist, wie ich einem Zeitdiagramm eine nummerierte Zeitachse hinzufügen kann. Dies ist nützlich, wenn man die Grundlagen des Testbench-Designs zeigt und die Entsprechung im Diagramm mit einer Linie in der Verilog-Quelle angeben möchte. Ich könnte mir vorstellen, dass ein TikZ-Overlay funktionieren könnte, aber ich bin kein so großer Profi und würde etwas bevorzugen, bei dem die Zahlen automatisch hinzugefügt werden. Ich verwende die vertikalen Hilfslinien, daher wäre es toll, wenn ich irgendwie Zahlen darüber oder darunter hinzufügen könnte.

Antwort1

Es wird kein spezielles Makro bereitgestellt tikz-timing, aber es ist möglich, eine solche beschriftete Achse mit den bereitgestellten Größenmakros und Knoten zu zeichnen.

Die Anzahl der Zeilen wird durch angegeben \nrowsund die breiteste Zeile durch \twidth. Die Zeilen werden auch als Knoten bereitgestellt, die genannt werden, row<number>und der letzte Zeilenknoten wird ebenfalls benannt last row. Um zusätzliches Material zu zeichnen, platzieren Sie den Zeichencode in einer extracodeUmgebung nach der letzten Zeile, wie im folgenden Beispiel gezeigt. tikz-timingWeitere Einzelheiten finden Sie im Handbuch von .

\documentclass[border=2mm]{standalone}
\usepackage{tikz-timing}
\begin{document}
\begin{tikztimingtable}
 clk  &  20{C}   \\
 sig  &   5{HLZD{}}  \\
\begin{extracode}
 \begin{background}
  \vertlines[help lines]{}
  \horlines[help lines]{}
  \show\horlines
  \draw [->,>=latex] (0,-\nrows-1) -- (\twidth+1,-\nrows-1);
  \foreach \n in {0,1,...,\twidth}
    \draw (\n,-\nrows-1+.1) -- +(0,-.2)
        node [below,inner sep=2pt] {\scalebox{.75}{\tiny\n}};
 \end{background}
 %\tablegrid
\end{extracode}
\end{tikztimingtable}%
\end{document}

Ergebnis


Wenn Sie dies häufiger benötigen, können Sie ein eigenes Makro definieren:

\documentclass[border=2mm,png]{standalone}
\usepackage{tikz-timing}

\newcommand{\timingaxis}[1][]{%
  \begin{scope}[#1]
  \draw [timing/table/axis] (0,-\nrows-1) -- (\twidth+1,-\nrows-1);
  \foreach \n in {0,1,...,\twidth} {
    \draw [timing/table/axis ticks]
        (\n,-\nrows-1+.1) -- +(0,-.2)
        node [below,inner sep=2pt] {\scalebox{.75}{\tiny\n}};
  }
  \end{scope}
}
\tikzset{%
    timing/table/axis/.style={->,>=latex},
    timing/table/axis ticks/.style={},
}

\begin{document}
\begin{tikztimingtable}
 clk  &  20{C}   \\
 sig  &   5{HLZD{}}  \\
\begin{extracode}
    \timingaxis\relax
\end{extracode}
\end{tikztimingtable}%
\end{document}

Antwort2

Hier ist eine weitere Möglichkeit unter Verwendung pgfplotsder axisUmgebung; sie würde folgendermaßen aussehen:

test_pdf

... mit diesem MWE:

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{tikz}
\usepackage{tikz-timing}
\usetikzlibrary{intersections} %% named intersections
\usetikzlibrary{fit}
\usetikzlibrary{calc}

\makeatletter
% http://tex.stackexchange.com/questions/33703/extract-x-y-
\newcommand{\gettikzxy}[3]{%
  \tikz@scan@one@point\pgfutil@firstofone#1\relax
  \edef#2{\the\pgf@x}%
  \edef#3{\the\pgf@y}%
}
\makeatother

\begin{document}

\begin{tikzpicture}[timing/picture]%,timing/nodes/advanced]
\begin{axis}[clip=false,ymin = 0, ymax = 2, xmin = 0, xmax = 5]

 %\addplot [] node [] (origin) at (0,0) {}; %no
\addplot [] coordinates {(0,0)};
\node[] (refsize) at ({axis cs:1,1}) {};

\pgfplotsextra{ % must have, else \gettikzxy will not work!
\gettikzxy{(refsize)}{\rx}{\ry}
% re-convert \rx back to length, so can scale it directly in style= below:
\newlength{\trx}
\setlength{\trx}{\rx}
\typeout{rx \rx - \the\trx, ry \ry}

\timing[very thick,style={x=0.5\trx,y=\ry},name=tgraph1] at ({axis cs:1,0.5}) { HLHLHL };

% debug:
% add frame border around tgraph1
\node[fit=(tgraph1), draw, color=gray] {};
% indicate origin of tgraph1 (is lower left corner):
\node[fill,circle,color=gray] at (tgraph1.origin) {};
} % end \pgfplotsextra

\end{axis}
\end{tikzpicture}

\end{document}

Beachten Sie, dass ein wenig gerechnet werden muss, um die Einheiten des \timingDiagramms auf die Einheiten zu skalieren, die im Diagramm angezeigt werden. Vielleicht ist mein obiges Beispiel nicht pixelgenau ausgerichtet, aber es scheint zumindest nicht allzu schwierig einzurichten zu sein …

verwandte Informationen