Verilog和ASM实现

时间:2015-08-31 04:09:00

标签: verilog fsm

在下面的问题中,

ASM图表显示$.getScript('script.js', function() { // non cached script.js }); 的值与0进行比较以进入下一个状态,但在比较q_next之前,q的值已经用q_next更新,因此,如果我们将q的值与0进行比较,结果在时序和其他参数方面是否相同?

q_next的类型应该是什么?它们应该是reg还是wire?

我附上了ASM图表和Verilog代码的屏幕截图。我也不明白条件框的时序含义(一般来说,我们不能把条件框的输出放在一个不依赖于条件框输出的独立状态)?,

当处于wait1状态时,我们检查sw的值,如果为true,我们递减计数器,然后检查计数器是否已达到零,然后是asser db_tick。我想了解从wait1和递增计数器并断言db_tick时的时间流。这些阶段之间是否有任何时钟周期,即从状态转移到条件框?

同样在verilog代码中,我们使用q_next and qq_load来控制计数器。当我们可以简单地控制状态中的计数器时,为什么要使用这些信号?

是否确保FSM(控制路径)控制计数器(数据路径)?请解释。提前致谢。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

  

在下面的问题中,ASM图表显示q_next的值为   比较0进入下一个状态但在比较q_next之前,   q的值已经用q_next更新了,所以如果我们比较一下   q的值为0,结果在时序和方面相同   其他参数?

没有。当q_next的值为0时,q仍然包含值1,直到在下一个正时钟边沿更新为止。如果检查q==0,则每个等待状态将花费额外的时钟周期。

  

q_next和q的类型应该是什么?他们应该是reg还是   线?

要么。 reg类型(例如q_reg)表示他们在always块中分配了值,而wire类型(如q_next)则使用{ {1}}语句或作为子模块的输出。

  

我也不明白条件框的时间含义(in   一般来说,我们不能把条件框的输出放在一个单独的   状态,它不依赖于条件框的输出)?   比如在wait1状态时,我们检查sw的值,如果为true,我们   递减计数器,然后检查计数器是否已达到零   然后是asser db_tick。我想了解我们的时间流程   从wait1移动并递增计数器并断言db_tick。

以下是assign状态下单个时钟周期的操作流程:

  • wait1?如果没有,则不做任何其他事情,并转到州SW==1。这些操作将在下一个周期完成。
  • 如果zero,请计算SW==1,并将该值分配给q_next以进行下一个周期。
  • q?如果没有,请留在q_next==0进行下一个周期并重复。
  • 否则,请为此时钟周期断言wait1,然后转到州db_tick=1

如果将两个条件分成两个独立的状态,倒数到0将需要两倍的时间。

  

这些阶段之间是否有任何时钟周期,即   从州转移到条件框?

基于该图,在给定状态内的所有操作(比较one,从sw减去等) - 即一个虚线框 - 在单个时钟中执行周期。

  

同样在verilog代码中,我们使用q_load和q_tick来控制   计数器。当我们可以简单地控制时,为什么要使用这些信号   在州的柜台?这样做是为了确保FSM(控制   path)控制计数器(数据路径)?

你也可以这样做。请务必在q案例中为q_next指定一个值,以防止锁定。将数据路径和控制路径拆分为单独的default块/ always语句确实提高了可读性,IMO。