まえまえから疑問に思っていたので、教えてください。
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と関連する良く見られている質問

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を用いて除算器を設計することになったのですが、VHDLについては全くの初心者です。
 こんな私にとってVHDLの基礎から除算器を設計するにいたるまで、参考になる本やホームページがあれば教えていただけませんか?

Aベストアンサー

質問者の状況から言うと、だいたいこんなところがお奨めです。

・『VHDLによるハードウェア設計入門』長谷川裕恭:CQ出版、\2,233
VHDLについて、ほとんどのことが書いてある。
古くから出版されているけど、いまだに根強い人気がある。
初心者から上級者まで、VHDLをやるなら持っておきたい本。

・『VHDLによる論理合成の基礎』枝均:テクノプレス、\2,600
わかりやすい書き方をしている。
それだけにあまり深いところまでは書かれていない。初心者向け。

・『HDLによる高性能ディジタル回路設計』森岡澄夫:CQ出版、\2,400
ソフトウェア記述をハードウェア記述に書き換える例を紹介している。
ソフトウェアからハードウェア記述言語に入る人は読んでおきたい本。

・『VHDLで学ぶディジタル回路設計』吉田たけお、尾知博:CQ出版、\2,800
大学の講義のテキストに使えそうな本。それだけにちょっと堅い。
しかし、剰余算の例が載っているので、除算器を設計をするなら、立ち読みででも一読しておいたほうがいいと思う。

・『実用HDLサンプル記述集』鳥海佳孝、田原迫仁治、横溝憲治:CQ出版、\2,800
いろいろな回路のサンプル例が載っているので、回路設計の参考になる。

一冊あたりが高いので、全部購入するというのは、
学生には、なかなか難しいと思います。
初心者なら、一冊目(長谷川裕恭)と二冊目(枝均)を自分で購入し、
あとは大学の図書館に買ってもらうというのがいいと思います。

あと、余談ですが、除算は使う論理合成ソフトによって、
論理合成可能なときと不可のなときがあります。
(まったくできない、std_logic_vectorは2の乗数なら可能、
integerならすべて可能、などなど)
1クロックで結果を出さなくてもいいなら、
筆算を使うのが個人的にお奨めです。

質問者の状況から言うと、だいたいこんなところがお奨めです。

・『VHDLによるハードウェア設計入門』長谷川裕恭:CQ出版、\2,233
VHDLについて、ほとんどのことが書いてある。
古くから出版されているけど、いまだに根強い人気がある。
初心者から上級者まで、VHDLをやるなら持っておきたい本。

・『VHDLによる論理合成の基礎』枝均:テクノプレス、\2,600
わかりやすい書き方をしている。
それだけにあまり深いところまでは書かれていない。初心者向け。

・『HDLによる高性...続きを読む

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とVerilogの違いについて

Verilogでの回路設計の経験はあるのですが、VHDLでの経験がありません。
今度の仕事はVHDLで回路設計をしなくてはいけなそうなのですが、ちょっと心配です。
Verilogとの違いは何なんでしょうか?
またVerilogを知っていればすぐに理解ができるものなのでしょうか?

Aベストアンサー

私はVHDL専門で、Verilogのことはよく知りませんが。

一般的印象としては、VHDLは無駄な記述が多く、Verilogはそれが少ないです。(Verilogにはないentity宣言が無駄に思える)

言語の習得については、VHDLを先に覚えておいたほうがいいという人が多いようです。なぜかVerilogを先に知っている人はVHDLが取っ付きにくいらしいです。

VHDLは「ada」というプログラム言語をもとに開発された「使用記述言語」で、
Verilogは「C言語」をもとに開発された「シミュレーション専用言語」です。
その辺の関係で、VHDLに比べて論理合成不可能な記述が多いと聞いたことがあります。

先日CQ出版から発売された「HDLによる高性能ディジタル回路設計」の巻末付録に「HDL対照表」が書かれているので、2言語を比較する参考にしてみてください。

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がどの数に対応するのか、というのを調べる際には、次のように考えます。
但...続きを読む

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

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

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

Aベストアンサー

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

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

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

Q2の補数の求め方

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

Aベストアンサー

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

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

100...0

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

QVHDLのデジタル時計

VHDLでデジタル時計を作っているのですが、現段階で完成しているのがSW1を押して早送り、SW2を押してさらに早送りができる機能を備えています。
それで自分がこれからしたいことはDIP_SWを1をオンにして、SW1を押すと、時間が逆戻りするプログラムです。下のURLにプログラム全体を載せています。
http://torupa21.gozaru.jp/vhdl.htm
自分で68、162~175行目を追加して、若干変更してみたのですが、SW1を押しても数字が止まってしまうだけでした。
VHDLをあまり理解していない自分にとって、何が駄目なのかも分からない状況です。
宜しかったらご指南お願いします。

Aベストアンサー

他人のソースと言うのは見難く、ちょっと見ただけですので何とも言えませんがDIPSW(1)の論理が逆とかありませんか?SW1とSW2は押すと0になってるがDIPSW(1)は正論理になっています。回路にもよりますが私はDIPSWはonで0にしますので。
でもその場合はSW1を押す押さないに関わらずDIPSWを変化させた時点で動きませんね。ちなみに動かないと言うのは表示はどうなっているのでしょう?

QVHDLについて教えてください

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;

Aベストアンサー

前者は同時処理文なので全ての文は並列に動作します。
(イメージとしては回路上の配線。)
このとき、同じ信号への代入は後で代入した方が優先されます。
DにAとCを同時に代入するわけにはいきませんからね。


VHDL(プロセス文とタイミング)
http://laputa.cs.shinshu-u.ac.jp/~yizawa/VHDL/process.htm


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング