我仍然在基于Xilinx Spartan-6的定制电路板上学习用于综合的VHDL。我的设计包括很多FSM,我刚刚在之前的一个问题中学到了单个流程实现更好,更容易使用。
我还了解到信号的初始化值实际上是可以合成的。
所以这就是问题:我是否真的需要一个复位信号来使FSM处于空闲状态并使用默认输出, IF 我不需要中断FSM中间流程或者我已经有另一个阻止它的信号吗?
答案 0 :(得分:1)
如果您的状态变量初始化为“空闲”,那么只有在出于某些其他原因需要时,重置会强制它“空闲”。一个主要的例子是,如果状态机具有状态,在注意到错误输入时,它会故意停止等待某些事情重置它,然后恢复正常操作。
机器也可能是从一个无法保证无故障的时钟运行,或者由于某种原因而不是100%可靠。在这种情况下,包含复位是明智的,这样主机处理器或其他FPGA逻辑之类的东西可以某种方式检测到状态机不再工作,并重置它。
许多人似乎在他们编写的大多数过程中都有一个复位信号,但如果机器符合您的设计要求,那么依赖信号和输出初始化值是完全有效的。如果所有重置都在启动期间短暂断言,而且再也没有,我会说它没有多大意义。
[EDIT]其他答案,依赖于初始化值通常仅在基于SRAM的FPGA设计中有效。
答案 1 :(得分:1)
让我们看一下重置时的Xilinx appraoch:
Xilinx FPGA包括"全局置位/复位"模块,在启动时自动将所有信号设置为初始化值。初始化值声明如下:
signal foo : std_logic := '0';
-- ^ initialisation value
在设计新的代码部分时,如果需要通过GSR以外的其他方式重置,则必须对每个位进行三次思考,因为使用自己的全局重置实际上是使用第二次全局重置。
对于您的FSM,它具有启动状态(IDLE),并且永远不会在整个比特流生命周期中重置。我们首先可以说FSM不需要重置。但如果你这样做,你就会面临亚稳态问题。 GSR对其置位复位非常缓慢,并且它是异步执行的。所有触发器都不会同时被释放,你的FSM可以进入非法状态。
因此,为您的FSM使用本地重置(以及计数器)。
要完成重置问题:
<强> 解决方法: 强>
避免FSM本地复位的解决方案可能是在时钟输入时使用bufgce模块。在启动时,该模块不会为设计提供时钟,并在启用时钟之前等待一些时钟周期。此处仅使用本地重置来管理BUFGCE的enable
输入,并且重置FGPA的重置是免费的。
我不知道必须等待多少个时钟周期,但它可以做到。第一种方法现在仍然是最好的。
答案 2 :(得分:0)
有一些来自Xilinx的白皮书解决了这个问题,它们实际上显示为搜索 Xilinx重置的前两项。
这些是WP272 Get Smart About Reset: Think Local, Not Global和WP275 Get your Priorities Right – Make your Design Up to 50% Smaller。
第一篇文章公正地指出了应该使用重置的位置,而不是依赖于配置和默认值的位置。
第二篇论文还指出了供应商和技术依赖的原因。您还可以注意到,消除“不必要”重置的原因是为了保留位置和路径资源。
因为在询问是否真的需要重置时没有详细说明有限状态机实现的细节,请注意WP272中的声明,其中异步复位对于将受益于配置负载的单热状态机可能是有害的(默认值),同步复位或时钟同步异步复位。
如果您的设计曾用于ASIC或其他非位图像加载解决方案,则具有(正确)重置的VHDL代码最终会更具可移植性。对于那些软负载设计,最终复位体现在配置负载中。
否则目的是节省布局和布线资源。