• ベストアンサー

VHDL ディレイ回路のようなもの?

VHDL初心者です。 1. FLG <= '1' 2. C <= A * B 3. FLG <= '0' ・・・としたとき 1と3は瞬時に実行されますが2はそれよりもはるかに長い時間がかかります。 2が完全に終了してから3が実行される・・・ような記述方法がありましたら 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

2の演算が終了したという何らかの信号が必要です。この信号は、2の演算回路から直接出ているものでもよいし、Cの内容を判定することでできるならそれでもよいし、時間で制約できるならそれでもよいです。とにかく、2が終了したことを判定できないと、どうにもなりません。 それができれば、ステートマシンを構成するのが一番わかり易いかな。 以下は、抜粋となります。宣言等は、省略します。 type stat_t is (S1,S2,S3); signal stat : stat_t; signal mul_done: std_logic; -- 掛け算の終了 -- 中略 process (clk, reset) begin  if (reset = '1') then   stat = S1;  elsif (clk'event and clk='1') then   case stat is    when S1 =>     stat <= S2;    when S2 =>     if (mul_done = '1') then      stat<=S3;     end if    when S3 =>     -- 次のシーケンスを続けます。   end case;  end if; end process; FLG <= '1' when stat=S1 else 'Z'; C <= A*B when stat=S2 else 'Z'; FLG <= '0' when stat=S3 else 'Z'; 掛け算の回路が常時接続になるとまずいようなら、もう一ステップ追加すればワンショットにできます。そのステップにいないとき、各変数がどのように動くのか質問からは不明ですから、とりあえずハイインピーダンスにしましたが、実際は、周辺の回路等の関係からどうしなければいけないかは決まるはずです。もしかすると、FLGは、レジスタ(Dフリップフロップ)かもしれませんね。Cへの接続も、多分、ちゃんとしないといけないと思います。これもレジスタのような気がする・・・ いずれにせよ、考え方は、この回路で、statは、clkで供給されるクロックの立ち上がりに従い、S1→S2→S3と順番に進みます。そして、S2からS3への遷移はmul_doneが入るまですすみません。ということです。あとは、このstatの内容で、実行すべき演算を実施すればよいということです。 詳しくは、「ステートマシン」で検索してください。もっとわかりやすい説明がいっぱい転がっているでしょう。

Kuma2000
質問者

お礼

回答ありがとうございます。

関連するQ&A