VHDLのsignal文とvariable文の違いとは?

このQ&Aのポイント
  • VHDLのsignal文とvariable文の違いについて学びましょう。signal文は代入された値が即座に反映されますが、variable文では代入された値の反映が遅れます。
  • VHDLのsignal文とvariable文の使い方とそれぞれの動作について解説します。signal文はハードウェアの信号としての機能を持ち、variable文はプロセス内での一時的な変数として利用されます。
  • VHDLにおいてsignal文とvariable文は異なる役割を果たします。signal文はモジュール間の通信に使用され、変更が即座に反映されます。一方、variable文はプロセス内での一時的なデータの保存に使用され、変更が遅延される特徴があります。
回答を見る
  • ベストアンサー

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;

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

前者は同時処理文なので全ての文は並列に動作します。 (イメージとしては回路上の配線。) このとき、同じ信号への代入は後で代入した方が優先されます。 DにAとCを同時に代入するわけにはいきませんからね。 VHDL(プロセス文とタイミング) http://laputa.cs.shinshu-u.ac.jp/~yizawa/VHDL/process.htm

関連するQ&A

  • 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)

    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 <= ・・・ ・・・

  • 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との違いを教えていただけませんでしょうか? 初歩的な質問で恐縮ですが宜しくお願いいたします。

  • カウントダウン VHDL記述に困っています。

    入力側には、4Bit入力データバス、Clock、Reset 出力側には、4Bit出力データバス のカウントダウン回路のVHDLの記述にトライしているのですが、シミュレーションを行うと、期待通りの動作が得られません。 イネーブルは入れません。 参考に下記に記述を記載します。 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity CNT_DOWN is port(D_IN : in std_logic_vector(3 downto 0); CLK, RST : in std_logic; D_OUT : out std_logic_vector(3 downto 0) ); end CNT_DOWN; architecture RTL of CNT_DOWN is D_OUT_TMP <= D_OUT; begin process(RST,CLK) begin if(RST='0') then D_OUT_TMP<=(others=>'0'); elsif(CLK'event and CLK='1') then if(D_OUT_TMP=D_IN) then D_OUT_TMP <= D_OUT_TMP - '1'; end if; end if; end process; end RTL; なのですが、きちんと動きません。 アドバイス下さい。

  • 【FPGA】VHDLのprocessとevent

    こんにちは。VHDLのprocessとeventで質問です。 process (CLOCK,RESET) begin if(RESET = '1') then     ...(処理) elsif(CLOCK'event and CLOCK = '1') then -- ☆     ...(処理) end if; end process; で書くのは黄金パターンのようですが、 ☆の行を以下のようにevent文を取り払うと、何が違うのでしょうか? elsif(CLOCK = '1') then 諸々の解説を見ると、processは()内の状態が変わったときにendまでのものが同時に処理されるという解説があり、eventはその指定された信号が変わったときにtrueなわけですよね。それでは何故processとeventを併用する必要性があるのでしょうか? シミュレーションをやった感じでは何にも変わり映えしないのですが…厳密に何が起きているか知りたいのです。

  • VHDLのセンシティブリストに関して

    VHDLのセンシティブリストに関して質問があります。 初心者です。 下記の2つで違いがでるのでしょうか? (1)================================= process(SEL, IA, IB ,IC ,ID) begin case SEL is when '0' => OA <= not IA; OB <= not IB; when '1' => OA <= not IC; OB <= not ID; when others => null; end case; end process; (2)================================= process(SEL, ,IC ,ID) begin case SEL is when '0' => OA <= not IA; OB <= not IB; when '1' => OA <= not IC; OB <= not ID; when others => null; end case; end process; ================================= ネットで調べるとセンシティブリストに登録された信号が変化した場合に begin以下の処理が行われるとあります。 つまりは、 (1)の場合は、SEL=0固定でもIAやIBが変化した場合にOAやOBは変化するが、 (2)の場合は、SEL=0固定でIAやIBが変化した場合は、OAやOBは変化しないということでしょうか?

  • VHDLについてですが何がおかしいのでしょう?

    VHDLについてですが何がおかしいのでしょう? 下記をSynthesize実行すると「 Line 22. rol can not have such operands in this context.」という表示がでます。どういうことなのでしょうか?ソースは本のサンプルどおりのはずなのですが・・。(VHDLとCPLDによるロジック設計入門)という本の126Pのリスト6.12です。 CPLDでザイリンクスWebpackV6.31を使っています。 ===================== library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.NUMERIC_STD.ALL; -- Uncomment the following lines to use the declarations that are -- provided for instantiating Xilinx primitive components. --library UNISIM; --use UNISIM.VComponents.all; entity shift2 is port( SW : in unsigned(1 to 4); SW2,SW3 : in std_logic; LED : out unsigned(5 downto 2)); end shift2; architecture RTL of shift2 is signal S : integer; begin S <= CONV_INTEGER( not (SW3 & SW2)); LED <= SW rol S; ------------------------------Line22 end RTL;

  • VHDLで、case文とwhen文のどちらを使おうか迷っています。

    VHDLで、case文とwhen文のどちらを使おうか迷っています。 以下のようなプログラムを作ろうと思っています。 //ここからcase文もしくはwhen文 SWの値を読み込み、 1の時signalに10を代入 2の時signalに20を代入 ・ ・ ・ 10の時signalに100を代入 //ここまでcase文もしくはwhen文 process(clk) clkが立ち上がる回数をカウントしていき、signalと同じ数になった時に1を出力 それ以外は0を出力 end process case文はprocess文で、when文は同時処理文で記述することは知っていますが、このような場合、どちらを使ったらいいのでしょうか?

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

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

  • pascalにおけるwhile文の条件について

    「cがA,B,Cのどれかの場合はwhile文の内容を繰り返す」というプログラムは while c in ['A','B','C'] do begin ~ end; と書けますが、「cがA,B,Cのどれかで無い場合はwhile文の内容を繰り返す」というプログラムはどのように書けばよいのでしょうか。私は while not c in ['A','B','C'] do begin ~ end; だと思ったのですが、エラーが発生したのでどうやら違うようです。 わかる人がいれば教えてください。よろしくお願いします。

専門家に質問してみよう