作者 主题:无法在我的状态机中找到锁存器 (Read 746 times)

0会员和1位客人正在查看此主题。

离线 DMEADS.

  • 常规贡献者
  • *
  • 帖子:154
  • 国家:  我们
  • 当你有555个定时器时,谁需要深入学习
无法在我的状态机中找到闩锁
« on: 10月10日,2020年10月10日,12:45:07»
来自美国的星期五快乐!

我正在为我的电路板上的按钮输入序列编码此摩尔机。如果输入了正确的序列,并且您击中了"enter"如果输入不正确的序列,或者在中途通过输入序列,则蓝色LED将亮0.5秒钟,或者在中途"enter"按钮击中,红色LED将亮0.5秒。

Vivado合成正在推断锁定锁定锁定,允许灯亮0.5秒。当我向董事会编程到董事会时,灯仍然保持在永远(因为它们被锁定而不是令人惊讶)。

任何人都可以确定我如何解决这个问题?如果在该州内的陈述,我尝试了许多不同的陈述,但我无法获得工作! (zip文件中的代码)

谢谢,

- addinic.
 

离线 DMEADS.

  • 常规贡献者
  • *
  • 帖子:154
  • 国家:  我们
  • 当你有555个定时器时,谁需要深入学习
Re:无法在我的状态机中找到锁定
« 回复#1开: 10月10日,2020年,02:28:10»
我找到了!

即使我的代码是Verilog,链接为VHDL,此链接也会更好地帮助我更好地了解州机器中的锁存器
//stackoverflow.com/questions/33279873/why-am-getting-inferred-latches

我重写了始终块,该块定义FSM的案例语句并将块定为。现在效果很棒 :)
 

离线 rstofer.

  • 超级贡献者
  • ***
  • 帖子:8033
  • 国家:  我们
Re:无法在我的状态机中找到锁定
« 回复#2开: 10月11日,2020年,06:21:15 PM»
这是一个更大的问题的一部分: 必须在所有条件下定义来自FSM的所有输出信号。 即使所选案例也没有'T甚至涉及信号。

好吧,它只是不是'可以在100+状态中的每一个中定义50或60个信号。 所以,前面的'case'语句,为每个信号提供默认输出值。 当添加另一个信号时,您将忘记提供默认值,直到您再次被警告锁存。

那里'是我知道这个的原因......

以下是在案例语句之前定义默认值的短样本:

代码: [选择]
    process(State, BEN, IR,MemReady, Immediate, PSR, Interrupt)
    begin
        -- set default values for all signals
        GateBusSelect   <= GatePC;
        MIOenable       <= '0';
        LD_MAR          <= '0';

[/ font]

后来在状态机中,各种状态可以操纵这些信号:

代码: [选择]
        case State is
...
...
            when  2     =>  -- LD Instruction
                            Addr1Select     <= Addr1PC;
                            Addr2Select     <= Addr2Sext9;
                            MARselect       <= MARadder;
                            GateBusSelect   <= GateMARmux;
                            LD_MAR          <= '1';
                            NextState       <= 25;
[/ font]

其他国家唐't涉及ld_mar不需要提及它。

 
以下用户感谢此帖子: DMEADS.

离线 siliconwizard.

  • 超级贡献者
  • ***
  • 帖子:6176
  • 国家:  FR.
Re:无法在我的状态机中找到锁定
« 回复#3开: 10月25日,2020年,04:27:27 PM»
请记住,这些"unwanted latch"问题只属于非时钟流程。

在纯粹的时钟过程中,在某些条件下未分配值的任何信号都将保持其先前的值 - 在寄存器中。在此上下文中的寄存器不是由锁存组成的,并且它们不会导致特定问题(只要持有前一个值就是当然是什么意图。)

在一个不计时的过程中'S不同且是的,它会推断出闩锁。那'是一个有趣的,经常被忽视的话题。

典型的例子:

代码: [选择]
process (Clk)
begin
    if rising_edge(Clk) then
        if En = '1' then
            Q <= D;
        end if;
    end if;
end process;

代码: [选择]
process (En, D)
begin
    if En = '1' then
        Q <= D;
    end if;
end process;

第一个导致没有问题和infers没有闩锁。它'甚至很常见。它只推断注册。
第二个将推断锁存器,并可能导致各种时序问题,尤其是在FPGA上。

所以回到FSMS,如果您使用典型的2过程(或更多)样式(我个人拒绝,则只能发生推断锁存器'喜欢,但是有另一个关于这一切的线程,所以让'S不是重新启动它,您可以参考它而不是),通常在非时钟过程(或多个)中处理的状态以及处理状态改变的一个时钟的过程。

« 最后编辑:2020年10月25日,04:49:26 SiliconWizard »
 
以下用户感谢此帖子: DMEADS.

离线 DMEADS.

  • 常规贡献者
  • *
  • 帖子:154
  • 国家:  我们
  • 当你有555个定时器时,谁需要深入学习
Re:无法在我的状态机中找到锁定
« 回复#4开: 10月27日,2020年,04:55:53»
是的,我使用a重写代码"single process style"因为我也喜欢那么好,它走了。谢谢
 

离线 siliconwizard.

  • 超级贡献者
  • ***
  • 帖子:6176
  • 国家:  FR.
Re:无法在我的状态机中找到锁定
« 回复#5: 10月27日,2020年,03:36:53»
是的,我使用a重写代码"single process style"因为我也喜欢那么好,它走了。谢谢

很酷,但我仍然想要强调这个问题,因为它'比仅适用于FSM的总体。而且我个人更喜欢FSMS的单程风格,而且我不喜欢银子弹。我这样做是因为我发现更容易阅读和更容易维护,而不是避免潜在的推断锁存器。我猜你大多寻找解决你的问题的修复,但这提出了一个问题,我认为,有趣,值得理解。

It'比仅仅是FSM的更重要。非时钟流程具有它们的用途,潜在的问题仍然是相同的。
实际上,它也可以在流程之外发生。如果不是所有情况,任何条件并发陈述都可以导致推断锁存器,并且这种情况更常常会思考,特别是当条件数量超过2或3时,尤其是在2或3时发生。

示例(过程之外的并发语句):
代码: [选择]
Q <= A when EnA = '1' else B when EnB = '1';

您获得了推断的锁存器,因为Q必须遵循ENA或eNB的值'1'.

另一个值得注意的票据(IMO)是,可能是无意的 - 这意味着你刚忘了掩盖案件 - 但它也可能是有意的。如果ena或eNB都不是,您实际上可能希望Q保留其州'1'。问题是,如果你在一个时钟的过程之外做到这一点,你'll得到闩锁,因为这可以't兼出任何其他方式。闩锁可能会导致令人讨厌的问题,特别是在FPGA上再次。

你可以思考"fix"只是在一个时钟的过程中这样做。当然,但行为不一样。假设所有信号*在同一时钟域中是*,通过将其放入一个时钟的过程中,您可以获得1个周期延迟。绝对不一样。如果所有信号都不在同一时钟域中,您'D获得延期性问题。废话。所以,如果你在前案中和没有'你想要一个一个周期延迟'D必须采取另一种方法来实现这一方法。或掌握闩锁的棘手艺术,哪个呃......是棘手的。

最后一个注意:有时你可以听到"synchronous" vs "asynchronous"我更喜欢说的过程"clocked" and "non-clocked"。我的理由是前者不是'非常正确的imho。如果它的所有信号是同步的,则非时钟过程实际上可以完全同步,并且没有推断的锁存器(锁存,每个性质,而不是同步)。同样,使用不同时钟域中的某些信号的时钟过程不完全同步,并且通常避免执行此操作,除了严格的重新同步信号。另一个主题。因此我更喜欢为什么"clocked" and "non-clocked".

为了说明这一点,回到原始主题,只要所有案例都被覆盖并且没有推断出锁存器,在FSM的双程方法中,不计时过程不是本身"asynchronous"。至少这就是我的看法。
« 上次编辑:10月27日,2020年,04:01:45 SiliconWizard »
 


分享我

 掘客   Facebook  诽谤  可口的  Technorati.  推特  谷歌   雅虎
SMF.