1

こんにちは、この単純な VHDL プロセスがあります (MyHDL コードから生成):

DIGIPOT_CONTROLLER_CONNECTCLOCK: process (delayedClock) is
begin
    if to_boolean(clkEn) then
        if to_boolean(delayedClock) then
            scl_d <= '0';
        else
            scl_d <= 'Z';
        end if;
    else
        if to_boolean(sclIdleValue) then
            scl_d <= 'Z';
        else
            scl_d <= '0';
        end if;
    end if;
end process DIGIPOT_CONTROLLER_CONNECTCLOCK;

元の MyHDL コード:

@always(delayedClock)
def connectClock():
    if(clkEn):
        if(delayedClock):
            scl_d.next = False
        else:
            scl_d.next = None
    else:
        if(sclIdleValue):
            scl_d.next = None
        else:
            scl_d.next = False

シミュレーションでは (ISIM および MyHDL シミュレーターの両方で) 完全に動作しますが、Spartan 6 に合成しようとすると、次の警告が表示されます。

これは、このプロセスが clkEn および sclIdleValue 信号に敏感であるべきであるとどういうわけか推測したことを理解しています。しかしもちろん、これは私が意図したものではありません。clkEn または sclIdleValue がそれぞれの状態を変更したときではなく、delayedClock が状態を変更したときにのみ出力を変更したい。

Spartan 6 アーキテクチャではできなかったことですか? それとも、意図した動作をさせるためにプロセスを別の方法で説明する必要がありますか?

4

1 に答える 1

2

最終的に、これが MyHDL コードの結果であることがわかりました。

@always(delayedClock.posedge, reset.posedge)
def connectClock():
    if(reset == 1):
        delayedClock_int.next = True
    else:
        delayedClock_int.next = not delayedClock_int
        if(clkEn):
            if(delayedClock_int):
                scl_d.next = False
            else:
                scl_d.next = None
        else:
            if(sclIdleValue):
                scl_d.next = None
            else:
                scl_d.next = False

および (生成された) VHDL:

DIGIPOT_CONTROLLER_CONNECTCLOCK: process (delayedClock, reset) is
begin
    if (reset = '1') then
        delayedClock_int <= '1';
    elsif rising_edge(delayedClock) then
        delayedClock_int <= to_std_logic((not to_boolean(delayedClock_int)));
        if to_boolean(clkEn) then
            if to_boolean(delayedClock_int) then
                scl_d <= '0';
            else
                scl_d <= 'Z';
            end if;
        else
            if to_boolean(sclIdleValue) then
                scl_d <= 'Z';
            else
                scl_d <= '0';
            end if;
        end if;
    end if;
end process DIGIPOT_CONTROLLER_CONNECTCLOCK;

遅延クロックを周波数の 2 倍にしなければなりませんでした (そして、connectClock プロセスでそれを 2 で割ります)。この方法では、元のプロセスと同じ結果が生成され、警告なしで合成可能です..フェーズアウトされたクロックの理由は、I2C の SCL です。ここに示す波形: ここに画像の説明を入力

于 2013-04-04T15:25:56.333 に答える