如上图(图片来源:异步FIFO),如何用Tikz
来画出这个图形呢?
作图思路: 使用流程图的作图方法可以很容易作出这幅图形。使用node
来画出节点,并用node
输入图中不带框的文字。使用“->”工具来连线。连线时要用到节点的锚点坐标。
下面详细介绍一下作图步骤:
一、定义节点风格
定义两种风格的节点:rec1
设置为最小宽度1.4cm, 最小高度为1cm,画出边框,默认为长方形框,填充颜色为gray!10
, 透明度为0.8
。另一种rec2
与rec1
只有最小高度的区别。
\begin{tikzpicture}[rec1/.style={minimum width=1.4cm, minimum height=1cm,draw,fill=gray!10,opacity=0.8},
rec2/.style={minimum width=1.4cm, minimum height=2cm,draw,fill=gray!10,opacity=0.8},]
二、安排节点位置
图中节点错落有致,可以分为五列,有一定的对称性。大致将五列安排在 x = 0 , 3 , 6 , 9 , 12 x=0,3,6,9,12 x=0,3,6,9,12的直线上。图中上中下三行大致安排在 y = 6 , 3 , 0 y=6,3,0 y=6,3,0的直线上。
这样,先用node
安排好13个节点。
三、连线
高级技巧1: 如图3,两个红色的节点之间由一条折线相连,我们不需要计算直角顶点的坐标,而是用|-
来连接,这个路径是由一个竖直线段再加一个水平线段组成的。
高级技巧2 坐标的计算,第二个红点(右下方)的坐标是由节点(equalbelow.west)
的左侧锚点竖直向上平移0.2cm
得到的。计算时,用$ 将数学表达式括起来:
($(equalbelow.west)+(0,0.2)$)
\draw [-latex](7.5,1.5)|-($(equalbelow.west)+(0,0.2)$);
连完线后,得到的成图如下:
完整代码:
\begin{tikzpicture}[font=\footnotesize,background rectangle/.style={fill=yellow!20},show background rectangle,pin distance=1.8cm,
rec1/.style={minimum width=1.4cm, minimum height=1cm,draw,fill=gray!10,opacity=0.8},
rec2/.style={minimum width=1.4cm, minimum height=2cm,draw,fill=gray!10,opacity=0.8},xscale=1.2,yscale=1.2
]
\node [rec1] (rdbinptr) at (0,0) {$rd\_bin\_ptr$};
\node [rec1] (wrbinptr) at (0,6) {$wr\_bin\_ptr$};
\node [rec1] (bin2graybelow) at (3,0) {bin2gray};
\node [rec1] (bin2grayabove) at (3,6) {bin2gray};
\node [rec2] (RAM) at (3,3) {RAM};
\node [rec1] (doublesynffbelow) at (6,1.5) {$double\_syn\_ff$};
\node [rec1] (doublesynffabove) at (6,4.5) {$double\_syn\_ff$};
\node [rec1] (equalbelow) at (9,0.2) {$==$};
\node [rec1] (gray2binbelow) at (9,1.5) {gray2bin};
\node [rec1] (gray2binabove) at (9,4.5) {gray2bin};
\node [rec1] (equalabove) at (9,5.8) {$==$};
\node [rec1] (A-Bbelow) at (12,-1) {\begin{minipage}[]{1.5cm}
A \par \qquad A-B \par B
\end{minipage}};
\node [rec1] (A-Babove) at (12,7) {\begin{minipage}[]{1.5cm}
A \par \qquad A-B \par B
\end{minipage}};
\draw[dashed,gray](-2.5,3)--(14,3);
\draw [-latex](-2,-0.25)--node[below]{rd\_empty}($(rdbinptr.west)+(0,-0.25)$);
\draw [-latex](-2,0.25)--node[above]{rd\_en}($(rdbinptr.west)+(0,0.25)$);
\node [below] at (-1.5,3) {读时钟域};
\node [above] at (-1.5,3) {写时钟域};
\draw [-latex](-2,5.75)--node[below]{rd\_full}($(wrbinptr.west)+(0,-0.25)$);
\draw [-latex](-2,6.25)--node[above]{rd\_en}($(wrbinptr.west)+(0,0.25)$);
\draw [-latex](rdbinptr)--(bin2graybelow);
\node [below]at(1.2,0){n:0};
\node [below]at(1.8,1.1){n-1:0};
\draw [-latex](wrbinptr)--(bin2grayabove);
\draw [-latex](1.5,3.3)--node[above]{wr\_data}($(RAM.west)+(0,0.3)$);
\node [below]at(1.2,6){n:0};
\node [below]at(1.8,5.2){n-1:0};
\draw [-latex](1.5,6)|-($(A-Babove.west)+(0,0.3)$);
\draw [-latex](1.5,6)|-($(RAM.west)+(0,0.7)$);
\node [above]at(2,3.7){wr\_addr};
\draw [-latex](1.5,0)|-($(A-Bbelow.west)+(0,-0.3)$);
\draw [-latex](1.5,0)|-($(RAM.west)+(0,-0.7)$);
\draw [-latex]($(RAM.east)+(0,-0.5)$)--node[above]{rd\_data}(4.5,2.5);
\node [below]at(2,2.3){rd\_addr};
\draw [-latex](bin2graybelow.east)--($(equalbelow.west)+(0,-0.2)$);
\draw [-latex](4.8,0)|-(doublesynffabove.west);
\draw [-latex](bin2grayabove.east)--($(equalabove.west)+(0,0.2)$);
\draw [-latex](4.5,6)|-(doublesynffbelow.west);
\draw [-latex](doublesynffbelow)--(gray2binbelow.west);
\draw [-latex](doublesynffabove)--(gray2binabove.west);
\draw [-latex](7.5,1.5)|-($(equalbelow.west)+(0,0.2)$);
\draw [-latex](7.5,4.5)|-($(equalabove.west)+(0,-0.2)$);
\draw [-latex](gray2binbelow)--(10.5,1.5)|-($(A-Bbelow.west)+(0,0.3)$);
\draw [-latex](gray2binabove)--(10.5,4.5)|-($(A-Babove.west)+(0,-0.3)$);
\draw[-latex](equalbelow.east)--(13.5,0.2)node[above left]{rd\_empty};
\draw[-latex](equalabove.east)--(13.5,5.8)node[above left]{wr\_full};
\draw[-latex](A-Bbelow.east)--node[above]{rd\_cnt}++(0.8,0);
\draw[-latex](A-Babove.east)--node[above]{wr\_cnt}++(0.8,0);
\fill(1.5,6)circle(1pt)(1.5,0)circle(1pt);
\fill(4.8,0)circle(1pt);
\fill(4.5,6)circle(1pt);
\fill(7.5,1.5)circle(1pt);
\end{tikzpicture}
今天的介绍就到这里,喜欢的话欢迎点击下方点赞、转发、分享,谢谢啦!
【LaTeX微信交流加群:】
如果你希望交流LaTeX
使用或者TikZ
作图或者Beamer
制作幻灯片方面的问题,请先添加作者微信:niltxz
,然后加入作者的LaTeX+TikZ+Beamer
交流微信群。