关于Verilog 写法

状态机篇

一、先科普

        状态机是verilog开发者绕不过去的坎,复杂的控制逻辑一般都需要用到状态机。

         一般常见的状态机有 一段式、两段式、三段式状态机。

          这里以常规三段式状态机为例,做简要分析。写过状态机的猿的都知道,常规套路:一段状态实际转移。 一段状态转移条件,另一段是每个状态干的活。

           一般状态机,假如说,不涉及到反馈,那么一般状态机写法就可。以下时序图为例。sta1信号到来后,状态机被激活,nx_status 立刻变成s1(纯组合逻辑)。时钟沿采集到sta1后,状态机从s0跳转到s1。在下一个时钟沿采集到状态status是s1后,开始干活,拉起了axi_awvalid和axi_walid信号。

           这里会有一个问题,假如说,每个状态都干相应的活,而干活的结果,不需要反馈。那么状态机这种写法一点问题都没有,前一个时钟状态转移,下一个时钟开始干活。干活时刻 落后状态转移一个clk。没什么问题,所有的问题都是线性流水的,并朝着一个方向走的。

     这里必须注意: axi_awvalid、axi_walid信号和状态转移信号sta1、sta2 不会有逻辑有交集,不会出现再同一个时刻采集(axi_awvalid & sta1)等这种情况。因为你状态转移的变量和axi_awvalid、axi_walid 一点关系都没有,也不依赖于axi_awvalid、axi_walid 对后面造成的影响。


二、坑货解析

        假设这里,状态转移的条件与后面axi_awvalid、axi_walid有关,那么这么写就有问题。例如拉起来axi_awvalid 和axi_walid信号,需要对端送过来相应的ready信号,并采集到valid&ready信号,状态才能转移,如果对端没有ready信号过来,我们需要keep住valid和data信号。也就是说,没法在时钟采集到status 在sta1状态后,再干活,然后等结果出来后,换下一个状态。

我们在进入sta1后,立刻将valid信号拉上去,而不是说采集到sta1状态后再拉上去。这样干活提前一拍。 由于提前一拍干活,下一拍就可以根据干的活结果如何确定,跳到哪个状态上去。这里加入sta2就是对面过来的ready信号。那么我们看到valid和ready握手成功,则status在下一拍直接进入s2状态。


总结:如果状态转移条件与当前状态需要干的活的结果有关,那么用传统状态机不行。需要提前一拍干活。

           也就是说,当前状态指示当前状态干的活。 某个时钟沿,使得sta跳到当前状态,那么这个时钟沿后也要开始干活。干活这状态是同步的。 不像以前,采集到进入这个状态后,才开始干活。这样会慢一拍。


多FIFO操作








你可能感兴趣的:(FPGA,xilinx,fpga)