• 締切済み

VHDLのvector

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

  • inst
  • お礼率65% (92/141)

みんなの回答

  • techa
  • ベストアンサー率60% (41/68)
回答No.1

othersを使えばできますね。 Data : in std_logic_vector( 4 downto 0 ); のとき、 Data <= ( others => '0' ); で全部0にセットできます。

inst
質問者

補足

ありがとうございます☆vectorに'0'をセットする場合は、「others => '0' 」でコンパイルできました。 しかし、if文 の条件文の中で「もしvectorの全てのbitが '0' の場合… 」としたいのですが、この時に「others~」を使うとエラーになってしまいます。vector = "000…00"とする以外の記述方法があったら、教えてください。

関連する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; なのですが、きちんと動きません。 アドバイス下さい。

  • 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に関して

    複数ビットの信号を宣言する際に std_logic_vector を用いますが、その後のdowntoやtoの意味がよく分かりません。 下の画像だとdowntoですが、toでは何故ダメなのでしょうか? また、selはstd_logicでいいと思うのですが何故複数ビットの扱いなのでしょうか? すみませんが、初心者なのでできるだけ分かりやすく説明していただけると幸いです。 宜しくお願いします。

  • 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の書き方について

    教科書で signal a : std_logic_vector (3 downto 0); a <= (others => '0'); -- A というような書き方がありました。 この 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についてですが何がおかしいのでしょう?

    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;

  • std_logic_vector のピンアサイン

    cyclone ii ボード、Quartus ii 13.0sp1 です。 port ( a, b : in std_logic_vector (15 downto 0); としたとき (1)Pin Planner でピンアサインをしないで、コンパイルするとOKです。 (2)まずa[15]にFitter Location に表示されているピンを設定して、コンパイルするとOKです。    全てをFitter LocationのようにすればOKだと思うのですが、そうすると配線が整然としません。 そこで、自由に設定できるのかな(?)と思って どういうルールで設定するべきかもわからぬままに a[15]にいろいろなPIN_xを設定してみると (3)PIN_141ならばコンパイルはOKでした。 (4)PIN_1ならばコンパイルエラーでした。 std_logic_vector (15 downto 0) の場合どのようなルールでピンアサイン するのか教えてください。

  • 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値を変更できれば構いません。 参考記述、ご紹介頂けると助かります。 説明が分かりづらいかもしれませんが、よろしくおねがいします。