【问题标题】:VHDL process styleVHDL 流程风格
【发布时间】:2013-09-28 02:45:38
【问题描述】:

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

Simple State Machine Problem

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

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

谢谢!

【问题讨论】:

  • 好的..由于没有进一步的回复..而且确实没有正确答案,我将选择第一个回复..谢谢你们两位的意见!

标签: vhdl


【解决方案1】:

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

如果你把事情放在不同的进程中,那就不好了(恕我直言):

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

好东西:

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

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

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

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

我的“规则”是:

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

很像编写软件:)

【讨论】:

  • 感谢您的详细解答!我希望更多的人可以争论任何一种方式,但我想你涵盖了所有内容!
  • 我们通常生成未注册的状态输出,所以这里可能将其视为优势。再次感谢。
【解决方案2】:

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

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

我喜欢的东西:

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

否定:

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

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

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

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

  • 如果您希望一个信号同时用于注册和未注册,您最终会复制它。只需一个流程,您就可以使用变量来实现这一目标。

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

【讨论】:

  • 感谢您的意见。有趣的是,一个优势是能够使用许多较小的流程。你倾向于注册输出吗?这是我从未真正关心过的事情 - 但可能是因为我从未尝试过提高设备速度..
  • @Mark,我假设您的意思是注册整个实体的输出。一般来说是的,但这取决于我正在处理的设计的时序限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多