• ベストアンサー

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

  • VHDLについて教えてください

    VHDLついてお教えください。 今、VHDLの勉強しているのですがsignal文とvariable文の違いが良く分かりません。 以下の記述で(1)の結果なぜこのようになるのか分かりません。 ご存知の方、ご教授願います。 例(1) process(A, B, C, D) begin D < = A; X < = B + D; D < = C; Y < = B + D; end process; 結果 X < = B + C; Y < = B + C; 例(2) process(A, B, C) variable D : std_logic_vector( 3 downto 0 ); begin D := A; X < = B + D; D := C; Y < = B + D; end process; 結果 X < = B + A; Y < = B + C;

  • VHDL記述の回路設計「加算減算器」

    VHDL記述の回路を設計というかプログラミングをしたのですが、出力が正しくありませんでした。内容は「加算・減算器」です。今回はオーバーフローを(考えてもいいのですが)考えないことにします。 記述内容は以下のようになっています。P_A で加算と減算を切り替えています。問題のボードへの出力ですが、 X_A + X_B = L_A としています。 0000 0000 0000 0001 0000 0001 0010 0000 0010 0011 0000 0011 0100 0000 0100 … という風に X_A だけを 0 に統一した場合でも正しく出力されていますが、 0000 0001 0001 0001 0001 0000 0010 0001 0011 0011 0001 0010 0100 0001 0101 0101 0001 0100 … このように、ビット同士の和の繰り上がりがきいてない感じなんですね。これって下の記述が間違ってるんでしょうか。それとも、ボード出力時のピンの当て方が間違ってるんでしょうか。詳しい方、アドバイスよろしくお願いします。 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity EX is port ( P_A : in std_logic; X_A : in std_logic_vector(3 downto 0); X_B : in std_logic_vector(3 downto 0); L_A : out std_logic_vector(3 downto 0) ); end EX; architecture STRUCTURE of EX is begin process ( X_A, X_B, P_A ) begin if P_A = '1' then L_A <= X_A + X_B; else L_A <= X_A - X_B; end if; end process; end STRUCTURE;

  • VHDLのvector

    VHDLにおいて「vector(5bitとします)の全bitが'0'である場合」という条件のif文を書く場合、if(Data = "00000") then と記述する以外に方法はありませんか? ここでは Data :in std_logic_vector(4 downto 0); としています。 5bitくらいならまだいいですが、16bitなどでもひたすら'0'を羅列するしかないのでしょうか?よろしくお願いします。

  • VHDLのFF記述について

    お世話になります。VHDL同期FFの基本的な使い方で、今一イメージができない部分がありますのでご教示いただけたら有難いです。 次のようなVHDL記述で、 entity test is port (    CLK : in  std_logic;    xRST : in  std_logic;    A  : in std_logic;    B  : in std_logic;    X  : out std_logic;    Y  : out std_logic ); end; architecture RTL of test is signal  A_in: std_logic; signal  A_out: std_logic; signal  B_out: std_logic; begin    A_in <= A ;    X <= A_out;    Y <= B_out; process (CLK, xRST ) begin    if(xRST = '0')then       A_out <= '0';       B_out <= '0';    elsif (CLK' event and CLK ='1') then       A_out <= A_in;       B_out <= B;    end if;  end process; end; ・入力Aは一度A_inというsignalを通ってFF出力していて、この時出力XはAが1クロック分遅れて出力されます。 ・入力BはそのままFF出力しているのですが、出力YはAと同期して出力されます。 B-->Yのような場合、はFFがかからないのがなぜなのか、Aとの違いを教えていただけませんでしょうか? 初歩的な質問で恐縮ですが宜しくお願いいたします。

  • WSHプログラミングで、Shell実行プロセスが終了しない内に、次の処理が実行されちゃいます・・・

    WSH(WindowsScriptingHost)でプログラミングを行っております。 以下のように、「A.exe」実行後、「B.exe」を実行するようにスクリプトを記述しています。 ところが、実際に実行してみると、「A.exe」が終了しない内に、「B.exe」が実行されてしまっている様なのです。 しかし、プログラム処理上、「A.exe」が実行終了してからでないと、「B.exe」を実行するのはまずいのです。 WSHで、「A.exe」が実行終了するまで、「B.exe」を実行させないようなスクリプトの記述方法を教えて下さい。 Set Shell = CreateObject("WScript.Shell") Shell.Run "cmd.exe /c D:\A.exe" Shell.Run "cmd.exe /c D:\B.exe"

  • VHDLにおける「generic」について

    VHDLの設計にて、 上位のモジュールから下位へgenericを用いて integer値を渡したいのですが、 この時に最上位のモジュールにおける信号「A」の状態をみて、 下位へ渡す integer値を切替えることは可能でしょうか。 例えば Aが '0'なら integer に 10を代入、      Aが '1'なら integer に 15を代入して下位に渡すという感じです。    やりたいことの記述イメージを書いてみました。 --Top モジュールです  ・  ・ (略)  ・ architecture component Module         <- 下位モジュールの宣言   generic(      value: integer:=10     <- generic を宣言 初期値は10      );                   ここの値を信号「A」の状態によって切り替える     port(      din : std_logic;      dout: std_logic      ); end component; signal A: std_logic;         <- 信号「A」を宣言   ・                    この値('0'、'1')を見て integer値を決める   ・ (略)   ・ 単純にif文を使えば、Aの状態によって value へ異なる値を代入することはできますか? それともgenericで一度宣言したら、その後は値を変更できないのでしょうか。 上記に示した方法でなくても、上位のモジュールで何かの値を判断し、下位に渡す generic の integer値を変更できれば構いません。 参考記述、ご紹介頂けると助かります。 説明が分かりづらいかもしれませんが、よろしくおねがいします。    

  • 記述の仕方について(VHDL)

    VHDLの記述で、同一の出力に入力の条件に対応した複数の値を代入することは出来ないのでしょうか? 7セグメントを光らせるプログラムなのですが、1つは1)時計回りにセグメントが光っていくもの、もうひとつは2)反時計回りに光っていくものとなっています。これをif文で条件をつけて、Aの場合は1)のprocessをBの場合には2)のをという感じで書いてみたんですが、FITをしようとするとエラーが出てしまいます。出力はportで「SEG」と定義しています。 プログラムの一部: process 1) begin  case 1) is when ・・・ => SEG <= ・・・   end case end process process 2) begin case 2) is when ・・・ => SEG <= ・・・ ・・・

  • クエリの条件指定について

    初心者です。 oracle 9i で下記の tmp テーブルがあります。 カラムはNoとFlgの2つだけです。 Flgに「A」が存在し、かつ、Flg 「B」が存在しないNoを取得したい場合 どのようにクエリを作ればよいのでしょうか? <tmp テーブル> No   Flg 1    A 1    B 2    A 3    B 4    A 4    C 5    A 5    B 5    C 上記テーブルから結果として、No 2 と 4 だけを取得したいのです。 where Flg='A'のあとにnot existsとかでできそうな気がしたのですが どのように条件指定すればよいのでしょう?

  • VHDLでの周波数判定

    VHDLで入力周波数の判定を考えています。 内容としては CLK_A(50MHz固定) CLK_B(65MHz,25MHz,0MHz(H or L)で変動) の入力があり、出力としては 65MHzのときは”L” 25MHz,0MHzのときは”H” という論理で何か良い方法は無いでしょうか?

  • 電気回路

    下記の問題んいついて。  容量リアクタンスXc1=1000[Ω]、Xc2=4000[Ω]の2つのコンデンサーが直列説ごくされ、両端は実効値10[V]の電源とつながっている。a)この回路に流れる電流(瞬時値)を計算せよ。b)Xc1,Xc2の両端の電圧(瞬時値)はいくらか? a)についてですが、最終的な式は i= (10√2)/((1/ωc1)+(1/ωc2) ) sin(ωπ+π/2) になると思うのですが、式中のC1とC2およびωの数値が分かりません。またπは180で計算しるのですか? b)についてですが、オームの法則から求めればいいのでしょうか? 以上、ご指導願います。