• ベストアンサー

VHDLのsignedとunsignedの違いは?

まえまえから疑問に思っていたので、教えてください。 VHDL(ハードウェア記述言語)の記述で、 ポートの宣言に 「signed」のときと「unsigned」のときがあるのですが、 違いを詳しく教えてください。 以前、誰かに「どちらかは2の補数を使っている」と聞いたのですが、 どちらなのかがわかりません。 また、2の補数以外で表現するとき、負の数はどうすればいいのでしょうか?

  • oddo
  • お礼率86% (174/201)

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

VHDLは御存知ですね。 signed/unsignedはIntergerのサブタイプと考えた方が良いでしょう。 subtype unsigned is integer range 0 to 4294967295 ; subtype signed is integer range -2147483648 to 2147483647; 実際はちょっと違うので本当の宣言を見てください。std_logic_unsignedパッケージ、std_logic_arithパッケージに宣言があると思うのですが。 2の補数表現されるのはsignedです(integerも)。 unsignedには負の数はありません。

oddo
質問者

お礼

toysmithさん、回答ありがとうございました。 VHDLは本当に大まかなところは習いましたが、 知っているというほどではありません(^^; Integerのサブタイプだったんですね。 VHDLの入門書には出てこないので、困っていました。 勉強会に間に合いました。 本当に助かりました。

その他の回答 (1)

  • shigatsu
  • ベストアンサー率26% (511/1924)
回答No.1

VHDLは判らないのですが、コンピュータ用の言語でsigned/unsigned となれば、singed の方が符号ありなのでブラスマイナスの表現ができる方です。 例えばC言語などでは    実際の値 0,1,2 - 127, 128 - 254,255  signed char 0,1,2 - 127,-127 - -2, -1 unsigned char 0,1,2 - 127, 128 - 254,255 という感じになります。 最上位ビットが0なら正の数、1なら不の数という表現ですね。 VHDLで違ってたらごめんなさい。

oddo
質問者

お礼

shigatsuさん、早速の回答ありがとうございました。 勉強していていつもいきづまっていたのですが、 だいぶ理解できました。 C言語でもよく使われるみたいですね。

関連するQ&A

  • VHDLの記述についての質問です

    現在、VHDLの勉強をしていて xilinxのサンプルソースを見たりしているのですが その中にto_unsigned(x,7)という記述がありました。 to_unsigned(x,7)はどういった関数なのでしょうか? ご存じの方がいましたらご教授願います。 また、to_integer()という関数がありますが、 conv_integer()との違いはあるのでしょうか? こちらの方も宜しくお願い致します。

  • HDLの言語の違いについて

    今大学の4年生です。 そこでVerilogHDLを習っています。 来年、他大の院に行きます。 そこではVHDLを習うそうです。 正直、言語が違うのは結構な負担になります。 特にVHDLは記述量が多そうなので結構不安です。 自分の中ではVerilogHDLのほうがC言語らしくてしっくりきます。(CでもFPGAはできるらしい?? VHDLは記述が硬すぎる気がします。 率直に聞きますが、VHDLとVerilogHDLどちらのほうが開発に向いているのでしょうか? また、同じ回路を作るとしても言語でFFやTrの数が違ったりするのでしょうか?

  • 2進数、12ビットを7セグメントに表示をVHDLで表したい

    3つの7セグメントがあります。 2進数、12ビットのデータを7セグメントに以下のような表示をVHDLで表現したいのですが、書き方が分かりません。 たとえば、 000000000000 -> 0 000000000001 -> 1 000000000010 -> 2 ・・・・・・ 000000001010 -> 10 (1の位から10の位に桁上げ) 000000001011 -> 11 ・・・・・・ というように左側の12ビットのデータを右側の値で7セグメントに表示したいのです。 普通は、4ビット2進数のデータなら、デコーダを経由して7セグメントに表示可能ですが、上記表現の場合、どのようにVHDLで記述すればよろしいか、分かりません。 アドバイス下さい。よろしくお願いします。

  • printfの動作に関する質問

    コンパイラ bcc OS WindowsXP HomeEdition 開発言語 C 変数tempを unsigned long temp; と、宣言して、 printf("%15ld",temp); で値を表示していくと、unsignedで宣言しているのに、マイナスの値が出現します。 tempは、unsigned longの定義域ぎりぎりまで使います。 多分、2の補数としてマイナスを表現している関係かと思いますが、この現象を回避する方法はないのでしょうか?

  • C言語signed long long型の演算

    C言語で以下の演算を行った場合、変数bに格納される値が-1(0xFFFFFFFFFFFFFFFF)になることを期待しておりましたが、参照すると4294967295(0x00000000FFFFFFFF)となってしまいます。 unsigned int a = 1; signed long long b; b = a * (-1); 32bit、64bitのUNIX(Solaris)マシンでそれぞれ確認しましたが、どちらも同じ結果となりました。 変数aの型宣言をsigned intにすると変数bが-1(0xFFFFFFFFFFFFFFFF)になることは確認したのですが、unsigned intだとなぜこのような演算結果となるのかが分かりません。 ※8バイト整数に格納する際に先頭4バイトがなぜ0xFFFFFFFFで補完されないのか? ちなみに変数bの型宣言をsigned long intにすると32bitマシンでは-1となりましたが、64bitマシンでは4294967295となってしまいます。 これは32bitUNIXマシンではsigned long intは4バイト領域であるため-1(0xFFFFFFFF)となり、64bitUNIXマシンでは8バイト領域のため前述と同じ結果になるのだと考えますが、なぜ8バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

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

  • 補数ということばの意味

    補数ということばの意味 正確には計算機科学の質問なのですが、カテゴリがないのでここに質問しました。 コンピューターで負の数を表すときに、補数表現を使うことがあります。二進数の負の数を表すときに、"1の補数で表す"というときにはビット反転を行い、"2の補数で表す"というときにはビット反転プラス1を行うということはわかるのですが、"1の補数"や"2の補数"ということばの意味がわかりません。何で、"1の"とか"2の"というのですか?

  • 負の整数を求める

    負の整数を表現する問題で質問です。 4ビットのパターン1101を下記の通りに求め、小さい順に並び変える場合、 1, 1の補数による表現 2, 2の補数による表現 3, 絶対値に符号を付けた表現(先頭ビットが0は整数、1は負数) 1の補数は反転なので、0010とわかりますが、回答にこれは10進数の2だからと書いてありました。そこまではわかります。ただ、そのあとに、10進数の2だから、1101はマイナス2、とありました。なぜここでマイナス2となるのでしょうか? 2の補数の場合は反転した1の補数に1を加算して、0011とわかりました。しかし、またそれはマイナス3となっています。 3の絶対値に限っては先頭ビットは1なので負で、残りの3ビットは101で、10進数の5だから、マイナス5とあります。これに限ってはよくわかりません。 どなたか説明をお願いします。

  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

  • 2の補数の計算について

    C言語のプログラム中で得られた10進数の値を,固定長16ビットの2進数に変換したいと考えています. しかしながら,得られた10進数の値が負数であった場合,それを負数と判断し,2の補数として出力したいのですが,なかなかいい方法が思いつきません… 例えば処理中で -1.915098 といったような10進数の値を2進数に変換し,先頭の1ビットが正負符号の2の補数として表現するためにはどのように記述すればよいでしょうか? 簡単で構いませんので,記述例も書いていただけると助かります…