• 締切済み

VHDL ステートマシン

VHDLで記述したソースに対して、指摘を受けました。 『ステートマシンの状態をTYPEで宣言しているが、論理合成をしたときに、どのステートがどの値かが不明なため、実機デバッグをする際に、モニター出力した場合、ステートが確認できない。場合によっては、合成の都度、ステートのビット割付けが変わる。 ステートはconstant文を使って、設計者が値を割付けるべきである。』 ここでお聞きしたいのは、2点です。 (1)このご指摘は正しいのでしょうか。 (2)可能であれば、変更したくない(現状のままとしたい)のですが、どういった理由付けをすれば   いいでしょうか。

みんなの回答

  • goma1109
  • ベストアンサー率0% (0/2)
回答No.1

(1)合成ツールにもよりますが、多くの場合、ステートマシンの中味を変えない限りビット割付けは変わらないと思います。 ですが、合成ツールを変える可能性や、バージョンアップのある将来まで考えると、設計者が割り付けたほうが安全だと思います。 (2)手に入る限りの合成ツールで割付がどうなるか試してみて、割付が変わらないようであれば、説得力を持つかもしれませんが、調べる方が大変そうで、お金もかかるかもしれません。 また、ごく単純なステートマシンで、ステートマシンの入力・出力をモニターすれば、内部状態がわからなくても良いような場合は、合成に割付をまかせても良いとおもいますが。

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

  • VHDL ステートにとどまる時間

    FPGAの初心者です。 上級者の皆さんがNET上に掲載されているVHDLの記述例をみながら勉強中です。 Q1. when detect => if(clk_rx = '1') then if(cnt_bitwidth = 7) then cnt_bitwidth <= 0; state <= proc; else cnt_bitwidth <= cnt_bitwidth + 1; state <= state; cnt_bitwidth = 0 でdetectステートに入ります detect ステートになってから clk_rxの1発目でcnt_bitwidthが1となり clk_rxの2発目でcnt_bitwidthが2となり ・・・・(中略) clk_rxの7発目でcnt_bitwidthが7となり clk_rxの8発目でcnt_bitwidthが7になっているので procステートへ入る ・・・と理解しました。 そうすると、 detectステートにとどまる時間はclk_rx の7周期分になります。 しかし動作から考えると detectステートにとどまる時間はclk_rx の8周期分でなければならない ・・・と思われるので前述の私の理解は間違っていると思います。 間違いを教えてください。

  • ステートマシンとは分かりやすく言うとどういうものなのでしょうか?

    ステートマシンとは分かりやすく言うとどういうものなのでしょうか? なかなか説明のあるところが少なくて。

  • 論理出力のショートについて

    論理ICの複数の出力が相互にショートし、それぞれが異なる値を出力した場合、ICは保護されるでしょうか。TTL、メモリー、CPU等はどのように設計されているのでしょうか。お教えください。

  • Access/ADOを使って変数にSQL文を入れた場合の変数の内容の確認

    お知恵をかしてください。 Access2000を使用しています。 VBAのADOを使ってデータベースの操作しています。 モジュールにSQL文を入れたい時は変数を文字列で宣言して記述するのですが、 書きたいSQL文に例えば下記のような計算式を入れたい場合 『&』と『"』が 変数の宣言が文字列なのでくっついて消えてしまいますよね? 変数= sql文 と Format(Mid([FieldName],1,4) & "/" & Mid([FieldName],5,2) & "/" & Mid([FieldName],7,2),"yyyy/mm/dd") そこで、デバッグプリントをしてイミディエイトで実際いまの変数の値はどうなってるのかを確認しながら、 『"』と『&』をつけ足したりしたいのですが、 SQL文が間違っているとデバッグプリントのところに行く前に構文エラーで落ちてしまう為、確認できません。 間違いを探したいからデバッグしているのに、どうすれば良いか分かりません。 何か記述した変数内容がどうなっているのか、確認する方法はないでしょうか? うまく説明ができず、分かりづらいかもしれませんが、ご回答いただければ幸いです。

  • C#からVC++DLLの呼び出しに失敗する

    VS.NET2005のC#からVC++6.0で作成したDLLを呼び出しています。 VCのデバッガでデバッグしてみると呼び出した関数は正常に動作しているようなのですが、最後のreturnを実行しC#に戻るところでエラーが出てしまいます。 C#側では「'System.ExecutionEngineException' のハンドルされていない例外が ConsoleApplication1.exe で発生しました。」となります。 C#での宣言は、 [DllImport("test.dll")] public static extern uint TestFunc(ref byte[] moji, ref uint nagasa); です。 VC++の宣言は、 __declspec(dllexport) unsigned long __stdcall TestFunc(unsigned char* moji, unsigned long* nagasa) です。 C#へ値を返さない関数は問題ないのですが、値を返そうとすると起きるようです。不備などあればご指摘いただけないでしょうか。 ちなみにVB6からは問題なく動作できました。

  • FPGAで自動販売機が動作しません

    今、自分は大学3年生です。 研究で自動販売機の動作を教科書を参考にVHDLを使って設計してます。 教科書のソースに機能を足しコンパイルしたところ無事通り、シミュレーション上では動作はしました。しかし、実際にFPGAに載せて動かしたところ予想できない動作をしました。 教科書にあった手を加えていないソースもシミュレーションでは教科書に載っていたシミュレーションと同じ動作は確認できましたが、FPGAに載せた時の動作はおかしかったです。 動作環境は、ツール:QuartusII9.0, FPGAボード:EP1K10TC100-3です。 スイッチには、init,100円,コーラ120円の商品ボタン,キャンセルの4つを、出力はコーラの120円商品の出力だけをLEDにピンを割り当てました。 シミュレーションでの動作は確認できても、実機に載せたところ動作がおかしくなるのですが、動作の確認やできた論理回路の確認をするにはどのような方法がありますか? もしくは入出力の信号を全部ピンに割り当てないことにはシミュレートしたときの動作とはまた違ってくるのでしょうか? ご教授ください、お願いします。

  • 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についてですが何がおかしいのでしょう? 下記を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;