首页 文章

VHDL有限状态机 - 复位真的有必要吗?

提问于
浏览
1

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

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

所以这里有一个问题:我是否真的需要一个复位信号来使FSM处于空闲状态并使用默认输出, IF 我不需要中断FSM中间流程或者我已经有另一个信号阻止了它?

3 回答

  • 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中的声明,其中异步复位对于将受益于配置负载的One Hot State Machine可能是有害的(默认情况下)值),同步复位或时钟同步异步复位 .

    如果您的设计曾用于ASIC或其他非位图像加载解决方案,那么具有(正确)复位的VHDL代码最终将更具可移植性 . 对于那些软加载设计,最终复位体现在配置负载中 .

    否则,目的是节省布局和路线资源 .

  • 1

    让我们看一下重置时Xilinx appraoch的内容:

    Xilinx FPGA包含“全局置位/复位”模块,可在启动时自动将所有信号设置为初始化值 . 初始化值声明如下:

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

    在设计新的代码部分时,如果需要通过GSR以外的其他方式重置,则必须对每个位进行三次思考,因为使用自己的全局重置实际上是使用第二次全局重置 .

    对于您的FSM,它具有启动状态(IDLE),并且永远不会在整个比特流生命周期中重置 . 我们首先可以说FSM不需要重置 . 但如果你这样做,你将面临亚稳态问题 . GSR对其置位复位非常缓慢,并且异步执行 . 所有触发器不会同时释放,并且您的FSM可能处于非法状态 .

    所以, use a local reset for your FSM (以及计数器) .

    To complete the reset question:

    • 避免使用全局复位具有更好的布局和布线结果,这导致更少的时序错误 . 全局重置使用与设计中的其他信号相同的网络,它可以防止某些路由资源可用于其他信号分发 .

    • 如果您确实需要使用复位,则首选有效高同步复位或至少有效高电平复位,异步激活和同步停用 . 高电平有效,因为Xilinx触发器使用高电平有效SET和RESET,同步避免亚稳态问题 .

    Workaround:

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

  • 1

    如果你的状态变量初始化为'空闲',那么只有当你因某些其他原因需要它时,重置会强制它'空闲' . 一个主要的例子是,如果状态机具有状态,在注意到错误输入的情况下,它在故意恢复正常操作之前故意停止等待某些事情重置它 .

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

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

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

相关问题