VHDL:帮助理解时间 steps/states 和并发

VHDL: Help understanding time steps/states and concurrency

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

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

我有一个 'controlsignals' 进程 运行ning 与我的状态 table 进程同时进行。对于我的控制信号,我知道当我处于 State_2 时,我必须将寄存器的启用设置为高电平,所以:

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

我的状态table:

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);

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

比较器的并发度

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

您的 'statetable' 一直在接受评估。

注册时间

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

状态表的敏感度列表

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

看起来您正在根据不错的参考工作并很好地构建您的代码。我怀疑敏感度列表确实是您遇到的问题 - 在模拟中导致奇怪的行为,所以我会尽量简短地回答这个问题,让您尝试解决这个问题。