0

Quartus II バージョン 11.0 を使用しており、VHDL コードを Verilog に移植しようとしています (練習用)。

確認する必要があります-「a」ラインがどれくらい低いか。動作する VHDL コードがあります。

process (clock, a)
begin
    -- on each rising edge of clock...
    if (rising_edge(clock))
    then -- count how long 'a' is low
        if (a = '0' and a_low_time < 3)
        then
            a_low_time <= a_low_time + 1;
        end if;
    end if;
    -- reset counter if 'a' is not low
    if a = '1' then
        a_low_time <= 0;
    end if;
end process;

非常にシンプルで、完璧に機能しています。しかし、Verilog を使用してどのように行うことができますか? このコード:

// on each rising edge of clock...
always @ (posedge clock)
begin
    // count how long 'a' is low
    if (!a && a_low_time < 3)
        a_low_time <= a_low_time + 1;
end

// reset counter if 'a' is high
always @ (*)
begin
    if (a)
        a_low_time <= 0;
end

「複数の定数ドライバーを解決できません」というエラーがスローされます。この:

always @ (posedge clock, posedge a)
begin
    if (!a && a_low_time < 3)
        a_low_time <= a_low_time + 1;
    else if (a)
        a_low_time <= 0;
end

「条件内のオペランドを、always コンストラクトの囲んでいるイベント コントロール内の対応するエッジに一致させることはできません」というエラーをスローします。

このコードは機能しています:

always @ (posedge clock)
begin
    if (!a && a_low_time < 3)
        a_low_time <= a_low_time + 1;
    else if (a)
        a_low_time <= 0;
end

しかし、「a」が高くなった直後に a_low_time をリセットする必要がありますが、クロックの立ち上がりエッジではありません。

どうすればいいですか?そんな単純な仕事ができないなんて信じられない。

4

1 に答える 1