- ベストアンサー
VHDLでの条件分岐にはcase文とwhen文、どちらを使えばいいの?
- VHDLでは、条件分岐にはcase文とwhen文の2つの方法がありますが、どちらを使えばいいのでしょうか?この記事では、case文とwhen文の違いや特徴について解説します。
- VHDLで条件分岐を行う際には、case文とwhen文のどちらを使うか迷うことがあります。case文はprocess文で使用することが一般的であり、when文は同時処理文で使用されます。どちらを選ぶべきかは、プログラムの要件や処理の性質によって異なりますので、注意が必要です。
- VHDLで条件分岐を行う場合、case文とwhen文の使い分けが重要になります。case文は条件分岐を行うための強力なツールであり、複数の条件に合致する場合などに適しています。一方、when文は同時処理を行うための文であり、単純な条件分岐に適しています。要件に応じて適切な文法を選択し、効果的なプログラムを作成することが重要です。
- みんなの回答 (2)
- 専門家の回答
関連するQ&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 <= ・・・ ・・・
- ベストアンサー
- その他(ホビー・玩具)
- 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の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ついてお教えください。 今、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で回路を記述する際に、立ち上がりと立ち下がりの両方を検出する際にはどうすればよいでしょうか? 立ち上がりだけなら 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記述に困っています。
入力側には、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; なのですが、きちんと動きません。 アドバイス下さい。
- 締切済み
- その他(プログラミング・開発)
- 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の勉強を始めて数日になるのですが、ある参考書に載っている記述が理解できませんので、質問させていただきました。 「基本クロックに同期して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;
- ベストアンサー
- その他(プログラミング・開発)
- verilogのcase文
always @(posedge CLK) begin case (DIP_SW) 0:Q[0] <= SW1_OUT; 0:Q[1] <= Q[0]; 0:Q[2] <= Q[1]; 0:Q[3] <= Q[2]; 0:Q[4] <= Q[3]; 0:Q[5] <= Q[4]; 0:Q[6] <= Q[5]; 0:Q[7] <= Q[6]; 1:Q[7] <= SW1_OUT; 1:Q[6] <= Q[7]; 1:Q[5] <= Q[6]; 1:Q[4] <= Q[5]; 1:Q[3] <= Q[4]; 1:Q[2] <= Q[3]; 1:Q[1] <= Q[2]; 1:Q[0] <= Q[1]; endcase end これはプログラムの一部なのですが、0と1の場合で分岐させる予定です。もちろん上のソースでは上手くいきませんでした。case文ではなくif文のほうがよいでしょうか?
- ベストアンサー
- その他(プログラミング・開発)
- 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値を変更できれば構いません。 参考記述、ご紹介頂けると助かります。 説明が分かりづらいかもしれませんが、よろしくおねがいします。
- 締切済み
- その他(プログラミング・開発)
お礼
申し訳ないです。 書き忘れていました。 when文は、条件分岐に用いる方のwhen文です。 http://www.picfun.com/vhdl33.html