
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 \nrows
und 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 extracode
Umgebung nach der letzten Zeile, wie im folgenden Beispiel gezeigt. tikz-timing
Weitere 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}
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 pgfplots
der axis
Umgebung; sie würde folgendermaßen aussehen:
... 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 \timing
Diagramms 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 …