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 をリセットする必要がありますが、クロックの立ち上がりエッジではありません。
どうすればいいですか?そんな単純な仕事ができないなんて信じられない。