2

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

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

我有一个与我的可状态进程同时运行的“控制信号”进程。对于我的控制信号,我知道当我处于 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 之后创建一个新状态会更安全吗?先感谢您。

4

1 回答 1

1

比较器的并发性

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

您的“状态表”一直在被评估。

注册时间

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

statetable 的敏感列表

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

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

于 2016-10-24T10:58:59.350 回答