本文へ移動
サポートシェアリングソリューション
OKWAVE Plus

このQ&Aは役に立ちましたか?

ベストアンサー

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

2019/07/01 15:41

VHDL初心者です。

1. FLG <= '1'
2. C <= A * B
3. FLG <= '0'
・・・としたとき
1と3は瞬時に実行されますが2はそれよりもはるかに長い時間がかかります。

2が完全に終了してから3が実行される・・・ような記述方法がありましたら
教えてください。

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

ベストアンサー
2019/07/03 22:05
回答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の内容で、実行すべき演算を実施すればよいということです。
詳しくは、「ステートマシン」で検索してください。もっとわかりやすい説明がいっぱい転がっているでしょう。

お礼

2019/07/16 08:11

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

質問者

このQ&Aは役に立ちましたか?

この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。

質問する

お礼をおくりました

さらに、この回答をベストアンサーに選びますか?

ベストアンサーを選ぶと質問が締切られます。
なおベストアンサーを選びなおすことはできません。