• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【FPGA】VHDLのprocessとevent)

VHDLのprocessとeventについての質問

このQ&Aのポイント
  • VHDLのprocessとeventの書き方について質問です。黄金パターンとされるprocess (CLOCK,RESET)の中で、event文を除去するとどのような違いが生じるか知りたいです。
  • processは()内の状態が変わるたびにendまでの処理が同時に行われるとされています。一方、eventは指定した信号が変化したときにのみ実行されます。なぜprocessとeventを組み合わせて使用する必要があるのでしょうか。
  • シミュレーションを行った結果、processにeventがあるかないかで変化は見られませんでした。しかし、厳密に何が起きているのか知りたいです。

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

  • ベストアンサー
  • hashend
  • ベストアンサー率92% (12/13)
回答No.1

私もVHDLをかじっただけの人間なので詳しいことはわかりませんが、参考になれば幸いです。 憶測ですが、言語で決まった書き方をすることはコンパイラに対し、明示的に一定の回路を形成するための指示を与えることができるような気がします。例えば entity Led_test is Port ( CLK : in STD_LOGIC; RESET : in STD_LOGIC; OUT0 : out STD_LOGIC); end Led_test; architecture Behavioral of Led_test is signal sub_out : std_logic; begin process(CLK,RESET)begin if(RESET= '1')then sub_out <= '1'; elsif(CLK'event and CLK = '1')then sub_out <= sub_out xor '1'; else end if; end process; OUT0 <= sub_out; end Behavioral; のような記述をした場合、Xilinx ISE 11でデバイスがXC9572の場合は出力までの遅延が6.5nsと出ました。 一方、eventを省いた場合は出力ラッチが複数あるというWARNINGが発生しましたが、コンパイルは成功し、遅延が10nsとなりました。この原因はデバイスとのfit行程でCLKをクロック信号、RESETをリセット信号として認識したかそうでないかの違いによるものだと思います。現に自動配置されたピンを確認すると前者ではそうなっていました。後者は通常のIOピンに接続されていたので、遅延が長くなったと思われます。 結局、結論はわからないのですが、process文とeventについては記述する方法だと私は認識しています。的外れな回答で申し訳ない。

maruyl
質問者

お礼

検証結果がすべてなのかもしれませんね。わざわざありがとうございました。お礼が遅くなってしまいすみませんでした。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&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のシミュレーションに関して

    いつもお世話になっています。 以下の開発環境におけるFPGAのロジックのシミュレーションに疑問があるので質問します。 環境 modelsim Altera starter edition 質問概要 10進カウンターを作ってクロックの立ち上がりで動作するように作ったのに立下りで動作するのは何故か。(10進数をカウンター内部変数TQで数え上げqに出力しているがTQはクロックの立ち上がりで動いているが、qは立下りで動いている様に見える) 10進カウンターの内部構造 ソース概要 ・内部変数TQが0から始まり、+1していき10回数えたら0から桁上がりの変数cを1にしてやりなおし。 ・計算中の内部変数TQで7SEG LEDを駆動させるためのアウトプットqがある。 ・リセットは0の時リセットされる。 VHDLのソースを載せます。 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity COUNT10 is port(RESET,CLK : in std_logic; Q: out std_logic_vector(3 downto 0); C: out std_logic ); end COUNT10; architecture RTL of COUNT10 is signal TQ : std_logic_vector(3 downto 0); begin process (RESET,CLK ) begin if(RESET='0') then TQ <= "0000"; C<='0'; elsif(CLK 'event and CLK ='1') then if(TQ="1001") then TQ <= "0000"; C <='1'; elsif(TQ="0000") then C <='0'; TQ <= TQ + '1'; else TQ <= TQ + '1'; end if; end if; Q<=TQ; end process; end RTL; シミュレーション結果 クロックを数え上げた内部変数TQがqへ値を渡す仕組みになっています。 これがたち下がりの時に行われている様に見える。

  • VHDL CPLD ISEパルス立上り・立下り検出

    前略 ・VHDLの初心者です。ザイリンクスの ISE13.1とCPLD(XC9572XL)を使ってLEDのON/OFFをさせようとしています。 外部クロック(1KHz)をカウントして1000回でLEDを ON→OFF、OFF→ON を繰り返すようにしています。 外部クロック立上りのタイミングで Clk' event and Clk = '1' によりパルスをカウントするとは 論理合成もできてターゲットボード上でLEDのON/OFFを確認できています。 <質問>  外部パルスの立下りもカウントするようにしたいのですが、どのようなVHDL コードをかけばよいのでしょうか おしえてください。  下記のように if(( Clk' event and Clk = '1') or (Clk' event and Clk = '0')) とすると Syntax チェックはOKなのですが 論理合成(Synthesize XST)をおこなうと unsupported Clock statement の論理合成エラーがでてしまいます。 以下 VHDLソースコード //----------------------------- architecture RTL of Clk_Led_OnOff is Signal Count: Integer range 0 to 2000; Signal Led_signal : Std_Logic; begin process(Clk) begin if(( Clk' event and Clk = '1') or (Clk' event and Clk = '0')) -- if( Clk' event and Clk = '1') then Count <= Count + 1; --インクリメント if(Count < 1000)then Led_Signal <= '0'; else Led_Signal <= '1'; --OFF end if; if(Count >= 2000)then Count <= 0; end if; end if; Led <= Led_signal; end process; end RTL; 以上、よろしくお願いします

  • VHDLの記述で、わからない記述があり困っています

    VHDLの勉強を始めて数日になるのですが、ある参考書に載っている記述が理解できませんので、質問させていただきました。 「基本クロックに同期してleをトグルする」という説明の後に、下記の様な 記述がありました(信号名などはオリジナルとは変えてます)。 一番不明なのは、”latch”信号です。 2~5行めを簡単に説明すると、”clk”の立ち上がりで、in1とlatchが 0であった場合、leが反転し、latchが1になるということだと思いますが、 いまいち理解が出来ません。 6、7行目をみてもさっぱりで、in1とlatchが1だったら latchが1になる。 これは、いったい何を意味しているのでしょうか。 ブロック図的なものでもあればわかりやすいのかもしれませんが、 そのあたりの説明は一切載ってませんので、どう考えてよいのかがわ からないのです。 はじめは、T型フリップフロップのイメージかと思ったのですが、 どうも違うようです。 このlatch信号の意味をどなたかわかる方がいらっしゃいましたら ご教授願いたいのですが、よろしくお願いします。    process (clk)     if clk'event and clk = '1' then       if in1 = '0' and latch ='0' then        le <= not le;        latch <='1';       elsif in1 = '1' and latch = '1' then        latch <= '0';       elsif in1 = '0' and latch = '1' then        latch <= '1';       end if;     end process;

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

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

  • verilogでのwhile文について質問

    verilog初心者です。 while文での処理を記述していたのですが、 下記のように変更するとエラーとなってしまいます。 なんとか出来る方法はないでしょうか? module TEST(in_data, state, clock, reset, out); input [9:0] in_data; input [5:0] state; input clock; input reset; output [5:0] out; reg [5:0] out; always@(posedge clock or negedge reset) begin if(reset == 0) begin out = 0; end else begin out = in_data; while(out > 7)begin out = out >> 1; end end end // always@ (posedge clock or negedge reset) endmodule // TEST 上のように書くと、合成でき、シミュレーションでも期待する値は得ることが出来ました。 以下のようにwhile文を変更するとエラーとなってしまいます。 while(out > state)begin out = out >> 1; end よろしくお願いします。

  • RTLの書き方について 非同期リセット

    http://www.asahi-kasei.co.jp/akm/japanese/product/ak4114/ak4114_f04j.pdf 30ページ目 Figure32 Mode4,6タイミング に書かれているLRCKとBICKの関係をつかってクロックの数をカウントしていくカウンタをVHDLで作りたいのですが、リセットの部分でわからないことがあり、質問させて頂きます。 【実現したい回路】 カウンタはクロックの立下りでカウント。LRCK=1となったところでカウンタを0に戻したい。方法として自分で考えたのは、LRCK=1となった時にフラグを立ててそれによって非同期リセットをかけようと考えたのですが、下記のRTLではシミュレーションは出来ても論理合成でエラーとなってしまい記述方法に問題があるようです。そもそもこのフラグを立てる方法が間違っているなどやり方のアドバイスありましたらよろしくお願いします。 【前半略】 architecture RTL of Counter is signal CNT_REG : std_logic_vector(2 downto 0); signal FLG_REG : std_logic; begin process (BICK,RST,FLG_REG) begin if RST ='0' then CNT_REG <= (others => '0'); elsif FLG_REG='1' then CNT_REG <= (others => '0'); elsif BICK'event and BICK='0' then CNT_REG <= CNT_REG + '1'; end if; end process; CNT <= CNT_REG; process (BICK,LRCK) begin if LRCK'event and LRCK='0' then FLG_REG <= '1'; else FLG_REG <= '0'; end if; end process; end RTL;

  • VHDL 立ち上がり 立ち下がり両方検出

    VHDLで回路を記述する際に、立ち上がりと立ち下がりの両方を検出する際にはどうすればよいでしょうか? 立ち上がりだけなら if CLK_2M'event and CLK_2M='1' then とすればよいですが、立ち上がりと立ち下がりとなると、 if CLK_2M'event and CLK_2M='0' then elsif CLK_2M'event and CLK_2M='1' then と記述すると、うまくSynthesizeしてくれません。 また、 if CLK_2M'event then if CLK_2M='1' then elsif CLK_2M='0' then と書いてもエラーを出してしまいます。 エラーの内容は1番目のコードの場合はCLK_2Mに関係無い内容ですが、念のため乗せておきます。 1番目の場合 Signal ANSOUT<0> cannot be synthesized, bad synchronous description. ちなみにANSOUTというのはLEDに出力を出すためのsignalです signal ANSOUT : std_logic_vector(7 downto 0); LEDOUT <= ANSOUT; -- LEDOUTはLED出力用PIN 2番目の場合 line 39: unsupported Clock statement.

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

このQ&Aのポイント
  • スマホを機種変更後、印刷速度が極端に遅くなりました。以前は文字だけ印刷されていたものが、今は文書の用紙の色まで印刷している感じがします。設定に問題があるのでしょうか?
  • お使いの環境はAndroid 12で無線LAN接続です。関連するソフトやアプリは不明です。
  • 印刷速度の遅さや用紙の色印刷に関して、以下の解決方法を試してみてください。まずは電源の抜き差しやアプリの取り直しを行ってみてください。また、印刷設定やプリンタードライバーの設定を確認し、適切な設定に調整してください。さらに、無線LANの接続状況や電波の干渉、他のデバイスとの接続状態を確認することも重要です。
回答を見る