VHDL流程风格

时间:2010-12-10 14:04:10

标签: vhdl

我一直在阅读这里的各种问题,因为我正在学习VHDL并且总是希望改进。但是,这条评论让我很好奇:

Simple State Machine Problem

我在大学的简短VHDL课程中被告知,单独的流程是最好的形式,以分离同步方面。

显然这是个人偏好,但我希望一些更有经验的用户可以根据自己的喜好对利弊进行一些说明?比另一个更常见吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

好吧,因为我说的是你所说的......我最好评论一下:)

糟糕的事情(恕我直言),如果你把事情放在不同的过程中:

  • 你必须虔诚地保持你的敏感度列表最新
  • 您必须为每个输出提供默认值,除非您需要异步锁存器(通常不需要)
  • 逻辑被拆分,因此如果您向状态机添加状态,则必须将新状态置于两个进程中
  • 如果您想要使用已注册和未注册的信号,您最终会复制它。使用单个流程,您可以使用变量来实现此目的。
  • 有些人认为阅读起来比较困难。

好东西:

  • 您可以将状态的“输出”取消注册。这可能有助于减少延迟,但对于几乎所有目的,您希望在每个块的输出上注册,以使会议时间更容易。
  • 有些人认为阅读更容易

我的观点是,你所听到的(“保持独立”)的法令源于合成器不善于区分逻辑与失败的时代,因此只需将时钟脉冲置于时钟过程中就有意义了。

此外,这种方法与那个时代的人们在拥有HDL之前绘制了原理图的方式相匹配。

现在,合成器可以处理时钟进程中任意复杂的逻辑。而且我可以用有意义的方式编写它,而不必明确每一个逻辑位置。只有当时间真的紧时,我才能认真考虑将触发器和逻辑放在恰当的位置。

我的“规则”是:

  • 保持可读性
  • 如果它符合要求(例如电源,时间和功能正常),您就完成了。
  • 如果没有,则然后播放不可读的技巧

很像编写软件:)

答案 1 :(得分:1)

我在保持独立营地。在我的代码中,我有一个单一的同步过程,它会执行重置和计时行为。其他一切都是异步的。注册过程如下所示:

Wait for Clock;
If Reset then
    Value <= '0';
else
    Value <= nextValue;
endif

我喜欢的事情:

  • 很明显哪些信号是触发器。他们是计时过程中的人。
  • 我写了一次注册过程并忘了它。
  • 所有异步进程都是“纯”函数,没有保留状态。
  • 强制您在寄存器中拆分逻辑,分离管道阶段等
  • 它促进了一种多,小,简单,异步过程的风格。
  • 由于这种逻辑锥体更容易理解和优化。
  • 大流程很可能是时序收敛问题。早期的警钟。

否定:

  • 敏感度列表,但Emacs有一个宏,它出现在警告中。如果列表很大,那么您的流程太大了。
  • 每个输出的默认值,但实际上用作文档。在进程开始时,这些是我的输出和默认值。如果我弄错了,再次被警告抓住。捕获一个锁存器(你几乎从不想要)比一个额外的触发器更容易,因为并没有在一个路径中分配异步术语。

我不太明白马丁的回答:

  
      
  • 逻辑被拆分,因此如果您向状态机添加状态,则必须将新状态放入两个进程中
  •   

我更改了我的状态变量的类型(即添加枚举)并继续前进。与统一风格完全相同。

  
      
  • 如果您想要使用已注册和未注册的信号,您最终会复制它。 Witha单个进程可以使用变量来实现这一目标。
  •   

在拆分样式中,您已经拥有已注册和未注册的版本。它们是寄存器进程的输入和输出。没有额外的工作。