3

我一直在这里阅读各种问题,因为我正在学习 VHDL 并一直在寻求改进。然而,这条评论让我很好奇:

简单状态机问题

在大学的简短 VHDL 课程中,有人告诉我,分离进程是最好的形式,以分离同步方面。

显然这是个人喜好,但我希望一些更有经验的用户能够根据自己的喜好阐明利弊?一种比另一种更常见吗?

谢谢!

4

2 回答 2

5

好吧,因为是我说了你所链接的内容......我最好发表评论:)

如果您将事情放在单独的进程中,那么不好的事情(恕我直言):

  • 你必须虔诚地更新你的敏感列表
  • 您必须为每个输出提供默认值,除非您需要异步锁存器(通常不需要)
  • 逻辑是分开的,所以如果你向状态机添加一个状态,你必须把新状态放在两个进程中
  • 如果您希望一个信号同时用于注册和未注册,您最终会复制它。通过单个进程,您可以使用变量来实现这一点。
  • 有些人认为它更难阅读。

好东西:

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

我的观点是,像你听到的法令(“保持独立”)源于合成器不太擅长区分逻辑和触发器的日子,因此将触发器放在时钟进程中是有意义的。

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

如今,合成器可以处理时钟过程中任意复杂的逻辑。而且我可以用有意义的方式编写它,而不必明确说明每一点逻辑的位置。只有当时间真的很紧时,我才必须认真考虑将翻牌和逻辑放在正确的位置。

我的“规则”是:

  • 保持可读性
  • 如果满足要求(例如电源、时序和功能正常),您就完成了。
  • 如果不是,那么只有在那时才玩不可读的把戏

很像编写软件:)

于 2010-12-10T16:45:00.393 回答
1

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

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

我喜欢的事:

  • 很明显哪些信号是失败的。它们是时钟过程中的那些。
  • 我编写了一次注册过程并忘记了它。
  • 您所有的异步进程都是“纯”函数,没有保留状态。
  • 强制您在寄存器处拆分逻辑、分离流水线阶段等
  • 它提倡一种多、小、简单、异步进程的风格。
  • 由于这个逻辑锥更容易理解和优化。
  • 大流程很可能是在时序收敛方面存在问题的流程。早期的警钟。

负面:

  • 敏感度列表,但 Emacs 对此有一个宏,它会以警告的形式出现。如果列表很大,那么您的过程就太大了。
  • 每个输出的默认值,但实际上用作文档。在流程开始时,这些是我的输出和默认值。同样,如果我弄错了,就会被警告抓住。与额外的触发器相比,捕获锁存器(您几乎永远不需要)也容易得多,因为异步项没有分配在一个路径中。

从马丁的回答中我不太明白的事情:

  • 逻辑是分开的,所以如果你向状态机添加一个状态,你必须把新状态放在两个进程中

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

  • 如果您希望一个信号同时用于注册和未注册,您最终会复制它。使用单个进程,您可以使用变量来实现此目的。

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

于 2010-12-14T15:02:33.813 回答