VHDL:帮助理解时间步骤/状态和并发性

时间:2016-10-23 10:40:08

标签: vhdl clock flip-flop

我通常是一名C#/ Java程序员,我仍然无法完全围绕硬件描述。

我有一个加载值的寄存器。然后,比较器将寄存器的输出与值“16”进行比较。如果值小于或等于,我转到State_0,如果它大于,我转到State_3。

我有一个'controlsignals'进程同时运行到我的statetable进程。对于我的控制信号,我知道当我在State_2时我必须将寄存器的使能设置为高,所以:

controlsignals: PROCESS (Tstep_Q)
BEGIN
    .... initialisation ...
    CASE Tstep_Q IS
    .... other states ....
    WHEN T2 => --define signals in time step T2
        enRegister = '1';

我的州表:

statetable: PROCESS (Tstep_Q, regOutput)
BEGIN
    CASE Tstep_Q IS
        .... other states ....
        WHEN T2 => 
            IF ((regOutput - 16) > 0) 
                THEN Tstep_D <= T3;
            ELSE Tstep_D <= T0;
            END IF;

接近我的代码末尾,我有:

fsmflipflops: PROCESS (Clock)
BEGIN
    IF Clock'EVENT AND Clock = '1' THEN
        Tstep_Q <= Tstep_D;
    END IF;
END PROCESS;

reg: regn PORT MAP (somevalue, enReg, Clock, regOutput);

由于我的状态表和我的控制信号是并发块,我的困惑是......我会首先启用寄存器然后运行比较器来确定我的下一个状态,就像我希望我的电路运行一样(因为状态表是对regOutput敏感)?或者在我有比较器的T2之后创建新状态会更安全吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

比较器的并发性

想象一下,在时钟边缘之后,状态信号已经更新。您有一个时钟周期进行比较并设置下一个状态。

你的州议事日程&#39;正在评估中。

注册时间

如果您可以在设置启用的同一时钟周期内读取寄存器的输出,则仅在T2中进行比较是有意义的。这可能是一个问题,但您的问题不包含检查该信息的信息。

州表的敏感性列表

您希望此进程同时运行,因此所有其输入需要进入敏感度列表。

看起来您正在使用一个体面的参考并很好地构建您的代码。我怀疑灵敏度列表确实是你遇到的问题 - 在模拟中导致奇怪的行为,所以我会保持这个答案的简短,让你尝试解决这个问题。