VHDLについての問題

このQ&Aのポイント
  • VHDLに関する問題が発生しています。Synthesize実行時に「Line 22. rol can not have such operands in this context」というエラーメッセージが表示されます。
  • ソースコードは本のサンプル通りであり、CPLDでザイリンクスWebpack V6.31を使用しています。
  • 問題箇所はVHDLの操作子「rol」の部分で、正しいオペランドが指定されていないためエラーが発生しています。
回答を見る
  • ベストアンサー

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;

  • poyo3
  • お礼率66% (538/813)

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

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

「rol」の演算子が読み込まれていないようですね。 パッケージの呼び出しはしているので、パスが通っていないのか、パッケージが壊れているのか分かりません。 私の環境では上記のコードで問題無くフィッティングまで行けましたので、 ソフトの再インストールをするかバージョンを上げるといった方法が良いかもしれません。 的確な回答でなく、申し訳ありませんが、ご参考になれば幸いです。

poyo3
質問者

お礼

私の環境が悪いんでしょうか。詳しくわかりませんが開発環境を考えて見ます。 遅くなりましたが回答ありがとうございます。

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

  • 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のvector

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

  • 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; 以上、よろしくお願いします

  • フローチャートについて

    H8マイコンでスイッチS1(PORT4-4)が押された場合は、LED1(PORT5-0)、スイッチS2(PORT4-5)が押された場合は、LED2(PORT5-1)、スイッチS3(PORT4-6)が押された場合は、LED3(PORT5-2)、スイッチS4(PORT4-7)が押された場合は、LED4(PORT5-3)が、それぞれ点灯するようなプログラムをつくりました。 #define P4DDR (* (volatile unsigned char *) 0xfffc5) #define P4DR (* (volatile unsigned char *) 0xfffc7) #define P4PCR (* (volatile unsigned char *) 0xfffda) #define P5DDR (* (volatile unsigned char *) 0xfffc8) #define P5DR (* (volatile unsigned char *) 0xfffca) int main(void) { unsigned char sw,ssw; P4DDR = 0x00; /* P4全ビットを入力に設定 */ P4PCR = 0xff; /* P4 MOSプルアップをONにする */ P5DDR = 0xff; /* P5全ビットを出力に設定 */ while (1) { sw = ~P4DR; /* 入力を反転 */ ssw = sw >> 4; /* swを4ビット右にシフトしたものをsswに代入 */ P5DR = ssw; /* sswをP5に出力 */ } return 0; } というプログラムを作ったのですが、フローチャートがどのようになるのかがわからないです。またプログラムが間違っていたら教えてください。

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

  • 標準の例外の全種類と、発生する状況、対処法を把握したいのですが

    自ら例外を全くthrowしないコードにおいて、発生する可能性がある例外は こちらの http://www.geocities.jp/ky_webid/cpp/library/027.html std::bad_alloc std::bad_cast std::bad_typeid std::bad_exception std::ios_base::failure [std::logic_error] ├ std::invalid_argument ├ std::length_error ├ std::out_of_range └ std::domain_error [std::runtime_error] ├ std::range_error ├ std::overflow_error └ std::underflow_error で全てですか? std::bad_allocは目を瞑るとして(コードを書くことで対処するとして) その他の全ての発生可能性を消せれば、try catch を完全に意図通りに制御できると考えて良いでしょうか? なお、現在 std::bad_allocは良いとして これらのうち std::bad_typeid std::ios_base::failure std::invalid_argument std::range_error std::overflow_error std::underflow_error については、自ら明示的に投げずに実際に発生する状況を確認できていません。 発生させられるコードをご存じでしたらご教授ください。 その他については以下のコードで発生したり、または状況確認がとれました。 また、この解釈で正しいでしょうか? /////////   std::bad_cast   ////////// #include <typeinfo> class Base { public: virtual ~Base(){} }; class Sub : public Base{ }; Base b; Sub& s = dynamic_cast<Sub&>( b ); //Sub* s = dynamic_cast<Sub*>( &b ); ならsがNULLになるだけで例外は飛ばない。 対処法: 継承関係を完全に把握出来れば発生確率0にできるはず。 そもそもポリモーフィズムにしない状況で、しかも参照としてダウンキャストするというケースはあまりないほうがいいのではないかな? /////////   std::bad_exception   ////////// 警告C4290(http://msdn.microsoft.com/ja-jp/library/sa28fef8%28VS.80%29.aspx) が出るので発生自体は確認できませんでした。 対処法: 仮に対応したとしても書かなければこれ自体は起こり得ないのでは…? /////////   std::out_of_range   ////////// #include <stdexcept> #include <vector> std::vector<int> i(1); i.at(1); 対処法: 普通に配列使うときと同じように プログラマが注意払ってれば大丈夫のはず。 /////////   std::length_error   ////////// #include <vector> std::vector<int> i(-1); 対処法: やはり注意深ければ起こらないのではないかと。 /////////   std::domain_error   ////////// 対処法: リンク先の解説より、書かなければ発生しないはず。(?)

専門家に質問してみよう