VHDL 有限状态机 - 重置真的有必要吗?

VHDL Finite State Machine - Is the reset really necessary?

我仍在学习 VHDL,以便在基于 Xilinx Spartan-6 的定制电路板上进行综合。我的设计包括很多 FSM,我刚刚在上一个问题中了解到单进程实现要好得多,也更容易使用。

我还了解到信号的初始化值实际上是可以合成的。

所以问题来了:我真的需要一个复位信号来让 FSM 以默认输出空闲,IF我不需要中断 FSM 中流或者我已经有另一个停止它的信号?

如果您的状态变量被初始化为 'idle',那么仅当您出于其他原因需要它时,将其强制设置为 'idle' 的重置才有用。一个主要的例子是,如果状态机有状态,在注意到错误输入时,它会在恢复正常操作之前故意停止等待重置它。

机器也可能 运行 来自不能保证没有故障的时钟,或者由于某种原因不是 100% 可靠的。在这种情况下,包含一个重置可能是明智的,这样主机处理器或其他 FPGA 逻辑之类的东西可以以某种方式检测到状态机不再工作,并将其重置。

很多人似乎在他们编写的大多数进程中都有一个复位信号,但如果机器满足您的设计要求,那么依赖信号和输出初始化值是完全有效的。如果重置所做的只是在启动期间短暂地声明自己,并且再也不会,我会说它没有多大意义。

[编辑]根据其他答案,依赖初始化值通常仅在基于 SRAM 的 FPGA 设计中有效。

让我们看看复位时的 Xilinx 方法是什么:

Xilinx FPGA 包含 "Global Set/Reset" 模块,可在启动时自动将所有信号设置为初始值。初始化值声明如下:

signal foo : std_logic := '0';
--                         ^ initialisation value

在设计新的代码部分时,如果需要通过 GSR 以外的其他东西重置,则必须为每个位三思而后行,因为使用自己的全局重置实际上是在使用第二个全局重置。

对于您的 FSM,它有一个启动状态 (IDLE),并且在整个比特流生命周期中永远不会被重置。一开始我们可以说 FSM 不需要重置。但是,如果您只是喜欢这样做,就会遇到亚稳态问题。 GSR 取消断言其复位的速度非常慢,并且它是异步执行的。所有触发器不会同时释放,您的 FSM 可能会进入非法状态。

因此,为您的 FSM(以及计数器)使用本地重置。

完成重置题:

  • 避免使用全局复位可获得更好的布局布线结果,从而减少时序错误。全局复位与设计中的其他信号使用相同的网络,它阻止了一些路由资源可用于其他信号分配。
  • 如果您确实需要使用复位,则更喜欢高电平有效同步复位或至少是高电平有效复位,异步激活并同步停用。高电平有效,因为 Xilinx 触发器使用高电平有效 SET 和 RESET,同步以避免亚稳态问题。

解决方法:

避免 FSM 上的本地重置的解决方案可能是在时钟输入时使用 bufgce 模块。在启动时,该模块不会为设计提供时钟,而是在启用时钟之前等待一些时钟周期。此处仅使用本地复位来管理 BUFGCE 的 enable 输入,并且 FGPA 的复位是自由复位的。 我不知道要等待多少个时钟周期,但它可以做到。第一种方法目前仍然是最好的。

Xilinx 有几份白皮书解决了这个问题,它们实际上显示为谷歌搜索 Xilinx reset.

的前两项

这些是 WP272 Get Smart About Reset: Think Local, Not Global and WP275 Get your Priorities Right – Make your Design Up to 50% Smaller

第一篇论文很好地指出了应该在何处使用重置,而不是在何处可以依赖配置和默认值。

第二篇论文也指出了供应商和技术依赖的原因。您还可以注意到消除 'unnecessary' 重置的原因是为了保留布局和布线资源。

因为您在询问重置是否真的有必要时没有详细说明有限状态机实现的细节,请注意 WP272 中的声明,其中异步重置可能对单热状态机有害,而单热状态机将受益于配置加载(默认值)、同步复位或时钟同步异步复位。

如果您的设计用于 ASIC 或其他一些非位图加载解决方案,那么带有 (proper) 重置的 VHDL 代码最终会更便携。对于那些软加载设计,最终重置体现在配置加载中。

否则目的是为了节省布局布线资源。