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

また、2の補数以外で表現するとき、負の数はどうすればいいのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (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には負の数はありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/03/16 09:09

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で違ってたらごめんなさい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/03/16 09:06

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVHDLの記述で、わからない記述があり困っています

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;

VHDLの勉強を始めて数日になるのですが、ある参考書に載っている記述が理解できませんので、質問させていただきました。
「基本クロックに同期してleをトグルする」という説明の後に、下記の様な
記述がありました(信号名などはオリジナルとは変えてます)。
一番不明なのは、”latch”信号です。
2~5行めを簡単に説明すると、”clk”の立ち上がりで、in1とlatchが
0であった場合、leが反転し、latchが1になるということだと思いますが、
いまいち理解が出来ません。
6、7行目をみてもさっぱりで、...続きを読む

Aベストアンサー

手元にコンパイラもシミュレータも無いので、自信は
有りませんが回答してみます。
ついでに、私はVerlog 派 なのですが…

初期値 in1 = 0,latch = 0 と、します。

if in1 = '0' and latch ='0' then を、状態A
elsif in1 = '1' and latch = '1' then を、状態B
elsif in1 = '0' and latch = '1' then を、状態C

と、します。

初期値より、先ず状態A になります。
この時、leの出力は反転、latch は 1 に変化します。
ここで in1 = 0 latch = 1 になるので、状態は C に遷移します。

状態C では、latch = 1になるので、
in1 = 0 latch = 1 なので、状態は C のままです。

状態C の時に、in1 = 1 になると、状態はBに遷移し latch = 0に
なります。
in1 = 1 latch = 0 となります。
この状態を定義する条件が有りませんので、仮に状態X と定義
します。
恐らく、状態X の時は 出力が不変になると思います。

状態X の時、in1 = 0 になると、latch = 0を受け継ぎ、状態Aに
遷移します。

以降、先頭に戻る。

この回路は全体として、in1 = 0 をきっかけとする、ワンショット
トリガ回路で、in1 を入力する度に、leを反転、保持を行っている
のでは無いでしょうか?
これは、状態A から 状態Cに遷移中 の時、latch が 0から1 に変化
するまで、入力 in1 が …1,0,1,0… と変化しても、le の出力状態を
保証しているのだと思います。

従って、latch は 出力le の状態を保持する為の信号 なのでは
ないでしょうか?


余談ですが、begin と end ifが足りない様な気がするのですが、
大丈夫でしょうか?

更に余談ですが、if文 を使う時は、必ず else を明記し、
不明な状態を無くした方が良いと思います。

if、elseif の条件に当てはまらない状態が発生した場合、
必ず、出力保持とは限りません。
コンパイラやターゲットLSI に寄っては出力が変わって来る事が
あります。
中には、出力が不定になるものも有ります。

同じ理由から、switch case には default を明示する事を
お勧めします。

手元にコンパイラもシミュレータも無いので、自信は
有りませんが回答してみます。
ついでに、私はVerlog 派 なのですが…

初期値 in1 = 0,latch = 0 と、します。

if in1 = '0' and latch ='0' then を、状態A
elsif in1 = '1' and latch = '1' then を、状態B
elsif in1 = '0' and latch = '1' then を、状態C

と、します。

初期値より、先ず状態A になります。
この時、leの出力は反転、latch は 1 に変化します。
ここで in1 = 0 latch = 1 になるので、状態は C に遷移します。

状態C で...続きを読む

QVHDLの記述についての質問です

現在、VHDLの勉強をしていて
xilinxのサンプルソースを見たりしているのですが
その中にto_unsigned(x,7)という記述がありました。
to_unsigned(x,7)はどういった関数なのでしょうか?

ご存じの方がいましたらご教授願います。

また、to_integer()という関数がありますが、
conv_integer()との違いはあるのでしょうか?

こちらの方も宜しくお願い致します。

Aベストアンサー

to_integer(a,b)とは、integerであるaをlength=bのunsingedに置換する関数です。
たとえばto_integer(128,8)とある場合には、integerの128を8bitのunsignedに変換する、という意味です。

conv_integerとto_integerは基本的には同一です。
使用するライブラリによって使い分けが必要です。
Synopsysのstd_logic_arithで定義されているのがconv_integer,IEEEのnumeric_stdで定義されているのがto_integerになります。
使用するライブラリ宣言によって使い分ける必要がある、という訳ですね。面倒ですが。

以上、ご参考まで。

QVHDLを書くときのエディタについて。

はじめまして。
最近VHDLで論理設計の仕事を始めたものです。

そこでお聞きしたいのですが、
VHDLを書くのにお勧めのエディタがあれば教えてほしいです。
私が調べて今使っているのは「MKeditor」なのですが
背景が白で強調文字が見づらいのでできれば背景が黒で強調文字が使えて、タブで並べて表示できるものがあればベストです。

Aベストアンサー

社内では秀丸が多いようです。

秀丸は、予約語の強調、色設定が出来ます。
タブ字数の設定出来ます。

私はアルテラの開発ツール付属のエディターを使っていますので、秀丸でバックが変えられるかはわかりません。

Q2の補数について

情報処理試験(基本情報)用の考え方という前提でお聞きします。

「負数を2の補数形式で表現する2進数の計算で・・・・」という問題がよくあります。
この問題文の中で「10101」などの数(これは5ビットの符号付2進数とします)
として記述されているものは、もう2の補数になっていると考えていいのでしょうか?
それともこれを、今から2の補数に直すのですか?
(もし直すのであれば、最上位ビットの符号が変わるのでしょうか?)

違う言い方をしてみますと「A」の2の補数が「-A」だとしたら、
「-A」の2の補数は「A」になるんでしょうか?
それとも「そんな表現はない。-Aの時点ですでに2の補数だ」という
ことになるのでしょうか?

解りにくくてすみません。

Aベストアンサー

>問題文中の符号ビットが負数だったら、
>変換してしまうという考えでいいのでしょうか?
違います。計算過程で一時的に変換を行うのか、と言われればその通り、ということになりますが。
おそらく、手順としては正しく理解されており、言葉の用法が正しくないと思われます。

11010B=-11、という対応関係を見る際に2の補数を取っているのは、計算の便宜上のものであって、数自体を変換しているわけではありません。
x=10101Bがどの数に対応するのか、というのを調べる際には、次のように考えます。
但し、この議論は「負数を2の補数形式で表現する」場合の話です。
1.符号ビットが1なので、これは負の数として解釈しなければなりません。
2.ところが、負の数を表すビット列を直接数値に直すのは、慣れていないとなかなか難しい物があります。
3.そこで、-xがどの数に対応するのかが分かれば、xがどの数に対応するのかが分かる、というふうに考えます。
4.ビット列xから、-xを求めるには2の補数を取ればよいので、-x=01011Bとなります。
5.このビット列は11を表していますので、-x=11、が分かりました。
6.従ってx=-11です。
つまり、計算の過程で、計算の便宜上-xを算出するために2の補数を取って(-1倍して)いるに過ぎず、きちんと5→6の際に-1倍して元に戻しています。
数自体を変換しているわけではありません。

操作自体は理解されておられるようですから、あとは言葉の使い方の問題だと思われます。
一応、変換の手順を場合分けしておきます。(負数を2の補数で表現する場合)
・最上位ビット(符号ビット)が0のとき
素直に2進数を10進数に直せばOKです。
・符号ビットが1のとき
元の数をxとします。xを10進数に直すのは慣れが必要ですので、慣れのいらない場合に帰着させます。
つまり、-xを求めれば、それを-1倍してxを求められる、という考えをします。
xから-xを求めるには2の補数を取れば良いです。
こうして得られた結果は-xですから、最後に-1倍します。

ここで2の補数を取ってはいますが、後で-1倍するので、xの2の補数に対応する数を最終結果としているのではないことに注意してください。
つまり、この計算方法は「便宜上2の補数を利用している」のであって、「2の補数を取ったものを求めている」わけではありません。

次のようにも言うことができます。
・どんな場合でも与えられた数の2の補数を取ったものを求めて最終結果とする、ということはしない
・符号ビットが1の時には、2の補数=-1倍、という対応関係を計算の過程で利用する。つまり、2の補数を利用する
「2の補数を結果とする」と「計算過程で利用する」の言葉の違いを理解していただければ幸いです。
前者は「最後にマイナスを付ける」というニュアンスがありません。


ちなみに、負数を2の補数で表現する場合には、(オーバーフローしない場合には)10進に直してから足しても、ビット表現のままで2進数として足しても結果は同じになりますが、
負数を1の補数で表現する場合にはそのようなことは成り立ちません。

>問題文中の符号ビットが負数だったら、
>変換してしまうという考えでいいのでしょうか?
違います。計算過程で一時的に変換を行うのか、と言われればその通り、ということになりますが。
おそらく、手順としては正しく理解されており、言葉の用法が正しくないと思われます。

11010B=-11、という対応関係を見る際に2の補数を取っているのは、計算の便宜上のものであって、数自体を変換しているわけではありません。
x=10101Bがどの数に対応するのか、というのを調べる際には、次のように考えます。
但...続きを読む

Q2の補数の求め方

2の補数の求め方で、
・ビット反転して1を足す
・1を引いてビット反転
この2つの方法はどちらでもよいのてしょうか?

Aベストアンサー

どちらでもいいと思いますが、本来的な意味は、

補数をとりたい数の桁数より1桁多い

100...0

からその数を減ずることです。


人気Q&Aランキング

おすすめ情報