Tikz教程:一个异步FIFO设计步骤示意图的画法

图1.异步FIFO 设计步骤示意图

如上图(图片来源:异步FIFO),如何用Tikz来画出这个图形呢?

作图思路: 使用流程图的作图方法可以很容易作出这幅图形。使用node来画出节点,并用node输入图中不带框的文字。使用“->”工具来连线。连线时要用到节点的锚点坐标。

下面详细介绍一下作图步骤:

一、定义节点风格

定义两种风格的节点:rec1设置为最小宽度1.4cm, 最小高度为1cm,画出边框,默认为长方形框,填充颜色为gray!10, 透明度为0.8。另一种rec2rec1只有最小高度的区别。

\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个节点。

图2. 安排节点

三、连线

高级技巧1: 如图3,两个红色的节点之间由一条折线相连,我们不需要计算直角顶点的坐标,而是用|-来连接,这个路径是由一个竖直线段再加一个水平线段组成的。

高级技巧2 坐标的计算,第二个红点(右下方)的坐标是由节点(equalbelow.west)的左侧锚点竖直向上平移0.2cm得到的。计算时,用$ 将数学表达式括起来:
($(equalbelow.west)+(0,0.2)$)

\draw [-latex](7.5,1.5)|-($(equalbelow.west)+(0,0.2)$);

图3. 折线连线方法

连完线后,得到的成图如下:
图4. 完整图形

完整代码:

\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 交流微信群。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值