2015-12-02 116 views
0

是否可以在延迟后分配状态更改?如何在延迟后分配状态

我做的一个交通灯控制器,我想后4秒,从黄色状态转变

always @(next_state, EW, Count) 
begin 
    case (next_state) 
    s0: if (EW&Count) next_state = s1; else next_state = s0; 
    s1: #4 next_state = s2; 
    s2: if ((~EW&~Count)|(~EW&Count)|(EW&Count)) next_state = s3; else next_state = s2; 
    s3: #4 next_state = s0; 

    endcase 
end 
+1

您可能需要一个计数器来计算时钟周期数,然后改变状态。 – sharvil111

+0

'#x'延迟不可合成。实施像@ sharvil111这样的计数器是最好的解决方案。 (如果你只停顿了几个时钟周期,你可以实现一些临时的“虚拟状态”,但是这并不能很好地适应更大的延迟) – wilcroft

回答

0

创建两台机器。灯机和计时器。

当Lights机器进入状态时,它将其输出连接到指示灯并将延时长度发送到计时器。计时器开始计数,并在给定的延迟后发送刻度给灯光机。然后,您可以快速测试灯光机器而无需等待定时器(当您断开它时)。

计时器并不完全是有限自动机,但它可以在区域上模拟它并具有相同的接口,因此您可以轻松地在它们之间传递messagess。

我想交通灯只是简化你的真实问题。对于这样一个简单的问题,分离可能看起来像是矫枉过正,但处理多台比较复杂的机器要容易得多。所以如果你真正的机器是不平凡的,分离将会有所帮助。

您也可以将单个灯看作是单独的简单机器,因此可以单独进行测试。并且各种状态机验证工具(如Uppaal)可以将它们可视化。

您可能也会被Timed Automata theory采访。