今だけ人気マンガ100円レンタル特集♪

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

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

A 回答 (1件)

論理合成対象だと仮定して・・・



generic値は論理合成時に静的に確定している定数である必要があるので
ロジック動作中に動的に変更することは基本的に無理です.

valueが変数ならportから入力する必要があります.
bit幅の定数など, どうしてもgenericする必要があるならば
generic値の異なる2つを両方インスタンシエーションしておいて
上位側にてsignal A相当の信号によってdoutを選択すればOKでは?

valueの使い道が分からないのでこれがベストとは言い切れませんが.

この回答への補足

ご回答ありがとうございます。
もうちょっと詳しく書きますと、

「value」はカウンタ値の比較対象として使用しており、value 以外にも複数あります。
シミュレーション時に、実際に使用する値を入れているとシミュレーション時間がやたらとかかってしまうので、
シミュレーションを行う時だけはこれらの値を小さくしたいのです。

それぞれの値をひとつずつ書き換えればそれで済むのですが、トップモジュールにおける何かひとつの信号(本質問でいえばsignal A)の
'0'(シミュレーション)  or  '1'(シミュレーションではない) をみてシミュレーション用の値へ一気に書き換えられないかと思い、
今回の質問をさせて頂きました。実際には下記のような記述を考えていました。

---Topのモジュールです。
generic(
    simulation:   std_logic:='0';   <-- '0'ならシミュレーションモード
   );
  ・
  ・ (略)
  ・
architecture
component Module         <- 下位モジュールの宣言
  generic(
     generic_value: integer:=10
     );             
  port(
     din : std_logic;
     dout: std_logic
     );
end component;

constant  value    integer:='10';
constant  value_sim  integer:='2' 
signal   value_top  integer;  
  ・
  ・ (略)
  ・
module_A: Module
  generic map(
    generic_value => value_top  <--simulation の値によって value か value_sim のどちらかを代入する。
  ・
  ・ (略)
  ・

上記のように通常用とシミュレーション用の value を宣言して置き、
simulation の値を見て、value と value_sim のどちらを下位のモジュールに渡すかを選択したいのです。
if文でsimulation の値をみて value もしくは value_simを value_topに代入して下位に渡そうとしたのですが、
「genericに signalは代入できません」というようなエラーが出て、コンパイルできません。
このようなことは実現可能でしょうか?よろしくお願いします。

補足日時:2010/02/28 22:58
    • good
    • 0

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

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

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

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

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

QVHDL 立ち上がり 立ち下がり両方検出

VHDLで回路を記述する際に、立ち上がりと立ち下がりの両方を検出する際にはどうすればよいでしょうか?
立ち上がりだけなら
if CLK_2M'event and CLK_2M='1' then
とすればよいですが、立ち上がりと立ち下がりとなると、
if CLK_2M'event and CLK_2M='0' then
elsif CLK_2M'event and CLK_2M='1' then
と記述すると、うまくSynthesizeしてくれません。
また、
if CLK_2M'event then
if CLK_2M='1' then
elsif CLK_2M='0' then
と書いてもエラーを出してしまいます。

エラーの内容は1番目のコードの場合はCLK_2Mに関係無い内容ですが、念のため乗せておきます。
1番目の場合
Signal ANSOUT<0> cannot be synthesized, bad synchronous description.
ちなみにANSOUTというのはLEDに出力を出すためのsignalです
signal ANSOUT : std_logic_vector(7 downto 0);
LEDOUT <= ANSOUT; -- LEDOUTはLED出力用PIN
2番目の場合
line 39: unsupported Clock statement.

VHDLで回路を記述する際に、立ち上がりと立ち下がりの両方を検出する際にはどうすればよいでしょうか?
立ち上がりだけなら
if CLK_2M'event and CLK_2M='1' then
とすればよいですが、立ち上がりと立ち下がりとなると、
if CLK_2M'event and CLK_2M='0' then
elsif CLK_2M'event and CLK_2M='1' then
と記述すると、うまくSynthesizeしてくれません。
また、
if CLK_2M'event then
if CLK_2M='1' then
elsif CLK_2M='0' then
と書いてもエラーを出してしまいます。

エラーの内容は1番目のコー...続きを読む

Aベストアンサー

ここ3年以上VHDLを使っていないので、有効な回答か自信がありませんが……。

立ち下りまたは立ち上がりで同じ動作をさせるのであれば、
if CLK_2M'event then
で出力結果を記述すればいいと思うのですが、
違う動作をさせようと思うのなら、
if CLK_2M'event and CLK_2M='1' then

if CLK_2M'event and CLK_2M='0' then
を別々に記述すればいいと思います。

VHDLは順序処理を記述するのではなく、並列処理を記述する言語だということを思い出してください。

QVHDLで、case文とwhen文のどちらを使おうか迷っています。

VHDLで、case文とwhen文のどちらを使おうか迷っています。

以下のようなプログラムを作ろうと思っています。
//ここからcase文もしくはwhen文
SWの値を読み込み、
1の時signalに10を代入
2の時signalに20を代入



10の時signalに100を代入
//ここまでcase文もしくはwhen文

process(clk)
clkが立ち上がる回数をカウントしていき、signalと同じ数になった時に1を出力
それ以外は0を出力
end process

case文はprocess文で、when文は同時処理文で記述することは知っていますが、このような場合、どちらを使ったらいいのでしょうか?

Aベストアンサー

case文の方が良いでしょう。というか、私ならcase文にします。合成結果が良さそうだからです。(実際は同じかも知れませんが)どんな文でもあまり深い記述にしない方がいいかなと思います。

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言語を比較する参考にしてみてください。

QVHDLのsignedとunsignedの違いは?

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

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

Aベストアンサー

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には負の数はありません。

Qプルアップ抵抗値の決め方について

ほとんどこの分野に触れたことがないので大変初歩的な質問になると思います。

図1のような回路でプルアップ抵抗の値を決めたいと思っています。
B点での電圧を4.1Vとしたい場合について考えています。その場合、AB間での電圧降下は0.9Vとなります。

抵抗値×電流=0.9Vとなるようにプルアップ抵抗の値を決めるべきだと考えていますが、この抵抗に流れる電流が分からないため、決めるのは不可能ではないでしょうか?

抵抗値を決めてからやっと、V=IRより流れる電流が決まるため、それから再度流れる電流と抵抗を調節していって電圧降下が0.9Vとなるように設定するのでしょうか。どうぞご助力お願いします。



以下、理解の補足です。
・理解その1
ふつう、こういう場合は抵抗値を計算するためには、電圧降下と抵抗に流れる電流が決まっていることが前提だと考えていました。V=IRを計算するためには、この変数のうち2つを知っていなければならないからです。
また、例えば5V/2Aの電源を使った場合、マイコン周りは電源ラインからの分岐が多いため、この抵抗に2A全てが流るわけではないことも理解しています。

電源ラインからは「使う電流」だけ引っ張るイメージだと理解しているのですが、その「使う電流」が分からないため抵抗値を決定できません。(ポート入力電流の最大定格はありますが…)


・理解その2
理解その1で書いたように、抵抗値を計算するためには、電圧降下と抵抗に流れる電流が必要だと理解しています。図2を例に説明します。Rの値を決めたいとします。
CD間の電圧降下が5Vであることと、回路全体を流れる電流が2Aであることから、キルヒホッフの法則より簡単にRの値とそれぞれの抵抗に流れる電流が分かります。今回の例もこれと同じように考えられないのでしょうか。

ほとんどこの分野に触れたことがないので大変初歩的な質問になると思います。

図1のような回路でプルアップ抵抗の値を決めたいと思っています。
B点での電圧を4.1Vとしたい場合について考えています。その場合、AB間での電圧降下は0.9Vとなります。

抵抗値×電流=0.9Vとなるようにプルアップ抵抗の値を決めるべきだと考えていますが、この抵抗に流れる電流が分からないため、決めるのは不可能ではないでしょうか?

抵抗値を決めてからやっと、V=IRより流れる電流が決まるため、それから再度流れる電流と抵抗を調...続きを読む

Aベストアンサー

NO1です。

スイッチがONした時に抵抗に流れる電流というのは、最大入力電流や最大入力電圧
という仕様から読めば良いのでしょうか。
→おそらくマイコンの入力端子の電流はほとんど0なので気にしなくてよいと思われます。
入力電圧は5Vかけても問題ないかは確認必要です。

マイコンの入力電圧として0Vか5Vを入れたいのであれば、抵抗値は、NO3の方が
言われているとおり、ノイズに強くしたいかどうかで決めれば良いです。
あとは、スイッチがONした時の抵抗の許容電力を気にすれば良いです。
例えば、抵抗を10KΩとした場合、抵抗に流れる電流は5V/10kΩ=0.5mAで
抵抗で消費する電力は5V×0.5mA=0.0025Wです。
1/16Wの抵抗を使っても全く余裕があり問題ありません。
しかし、100Ωとかにしてしまうと、1/2Wなどもっと許容電力の大きい抵抗を
使用しなければいけません。
まあ大抵、NO3の方が書かれている範囲の中間の、10kΩ程度付けておけば
問題にはならないのでは?

Qオペアンプに使用するパスコンは何故0.1μFなのでしょう?

いろいろ本を見てもパスコンは0.1μFをつければいい。という内容が多く、
何故パスコンの容量が0.1μFがいいかというのがわかりません。
計算式とかがあるのでしょうか?

Aベストアンサー

下記の「図2コンデンサの特性:(b)」を見てください。
http://www.cqpub.co.jp/dwm/contents/0029/dwm002900590.pdf

0.1μFのセラコンは、ほぼ8MHzで共振しています。
つまり8MHzまではキャパシタとしての特性を示しており、これより高い周波数ではインダクタと
なってしまうことがわかります。

0.1μFは単純に計算すると8MHzで0.2Ωのインピーダンスを示し、これは実用上十分低い
インピーダンスと考えられます。
つまり、大ざっぱにいって、10MHzまでは0.1μFのセラコンに守備を任せることができるわけです。
(従って、当然のことですが、10MHz~1GHzを扱うデバイスでは0.1μFでは不十分で、0.01μF~10pFといったキャパシタを並列に入れる必要が出てきます)

では低域の問題はどうでしょうか?
0.1μFは1MHzで2Ω、100kHzでは20Ωとなり、そろそろお役御免です。
この辺りからは、電源側に入れた、より大容量のキャパシタが守備を受け持つことになります。
(この「連携を考えることが、パスコン設計の重要なポイント」です)

ここで考えなければならないのが、この大容量キャパシタと0.1μFセラコンとの距離です。
10MHzは波長30mです。
したがって、(これも大ざっぱな言い方ですが)この1/4λの1/10、すなわち75cmくらいまでは、回路インピーダンスを問題にしなくてよいと考えます。

「1/40」はひとつの目安で、人によって違うと思いますが、経験上、大体これくらいを見ておけば、あまり問題になることはありません。
厳密には、実際に回路を動作させ、て異常が出ればパスコン容量を変えてみる、といった
手法をとります。

上記URLは、横軸目盛りがはっきりしていないので、お詫びにいくつかのパスコンに関するURLを貼っておきます。
ご参考にしてください。
http://www.rohm.co.jp/en/capacitor/what7-j.html
http://www.cqpub.co.jp/toragi/TRBN/contents/2004/tr0409/0409swpw.pdf
http://www.murata.co.jp/articles/ta0463.html

参考URL:http://www.cqpub.co.jp/dwm/contents/0029/dwm002900590.pdf

下記の「図2コンデンサの特性:(b)」を見てください。
http://www.cqpub.co.jp/dwm/contents/0029/dwm002900590.pdf

0.1μFのセラコンは、ほぼ8MHzで共振しています。
つまり8MHzまではキャパシタとしての特性を示しており、これより高い周波数ではインダクタと
なってしまうことがわかります。

0.1μFは単純に計算すると8MHzで0.2Ωのインピーダンスを示し、これは実用上十分低い
インピーダンスと考えられます。
つまり、大ざっぱにいって、10MHzまでは0.1μFのセラコンに守備を任せることができるわけ...続きを読む

Qデジタル回路だけでクロックを逓倍するには

FPGAに20MHzのクロックを入力し、自作するロジックで、より高いクロックを生成したいと考えています。PLL技術などをざっと調べてみたのですが、ロジックだけで作成できるか見当がつきません。FPGA内のロジックだけでクロックを逓倍することはできるのでしょうか?

Aベストアンサー

No.1 です.

> ロジックだけで

の意味を厳密に言うのなら,ロジックには時間の概念がないので
逓倍(つまり新たにタイミングを作り出すこと)は
不可能だと思います.

先にゲートディレを利用する方法を紹介?しましたがこれは
厳密にはアナログ要素を利用したものであり
「ロジックのみ」ではありません.

しかしタイトルで「ディジタル回路のみで...」とあるので,
精度,安定性がさほど必要でないのなら,他の方法として
ゲートディレイ1段を利用し50~200MHz位を発振させて
「ディジタルPLL」を構成する方法も考えられます.
当然ジッタ(時間軸に対する変動)も発生します.

QVerilog HDLで立下りと立ち上がり両方のエッジを検出する方法を

Verilog HDLで立下りと立ち上がり両方のエッジを検出する方法を探しています。
色々試してみたのですが、そのようなことはできないとエラーがでました。
元の周波数を2倍にして立ち上がりだけ見るという方法は、今回私が想定している仕様では使えないので、どうしても両エッジを検出したいのです。
どなたかご存知の方いらっしゃいましたら回答のほうよろしくお願いします。
ちなみに使用しているFPGAはXC3S200で使用ツールはXilinx社のISEです。

Aベストアンサー

回答が無いようなのでHDLはよく知らないのですが参考になりそうなページを貼っておきます。
http://fenrir.naruoka.org/archives/000701.html
原因は両エッジを検出できるようなフリップフロップが普通のFPGAには無いことのようですが、解決策はよく分かりません。

Qvisio2013での論理記号の出し方

場所をお借りして質問させていただきます。

Visio2013を使用しています。
論理回路を作成することになり、論理記号を出したいのですが、AND,OR,NOTはあっても、NAND,NORが見つかりません。

表示の仕方を教えていただきたいです。
よろしくお願いいたします。

Aベストアンサー

Visio 2013 Professionalであれば論理回路図を作成できます。

まず、ステンシルのセットは「エンジニアリング>電子工学>アナログ論理とデジタル論理」を選択してください。
そうすると、「論理ゲート2」という図形があるので、これをVisio図面に貼り付けます。

論理記号を変更する場合は、図面の記号を右クリックして「論理ゲートの構成」を選択します。
そうすると、記号の種類や入力/出力の数を変更出来ます。

QCRCのアルゴリズムって、どんな計算するんですか?

こんにちはお世話になります。
私はネットワークに興味があるオジサンです。
先日、データリンク層のプロトコル群を勉強していたとき、誤り訂正でCRCが出てきました。誤り訂正ではパリティーチェックやチェックサム等は聞き覚えがありましたが、CRCは始めて見たので興味を持ち少し調べてみようと思いました。
それが間違いの元でした。
インターネットでCRCの構造を詳しく解説するサイトが少なく、その解説は難しすぎて手におえません。
数学にはめっぽう弱い私には、多項式同士の加減乗除算などは頭痛の肥やしにしかなりません。
今ではCRCが気になって勉強に集中できない状態です。
そこで、表題にもあるCRCのアルゴリズムを、何方か分かり易く教えてくださいませんか。もしくは、CRCのアルゴリズムを簡単に解説している書籍をご存知でしたら教えてください。
カテゴリー(本来は数学系?)が違うかもしれませんが、何卒よろしくお願い申し上げます。

Aベストアンサー

偶数パリティについておさらいすると、1 となるビットの個数が偶
数になるように、検査ビットを定めるというものですよね?で、検
査側では、1 の個数を数えて奇数だとエラーと判断するわけです。

実は、この偶数パリティというチェックのしかたは、CRC の一種な
んです。CRC では、ある特定の生成多項式を使いますが、CRC の生
成多項式として x + 1 を使ったものが偶数パリティです。

多項式の加減乗除で頭痛ということなら、ちょっと説明が厳しいの
ですが、2進数の加減乗除はできるでしょうか?これがだいじょう
ぶなら、1+1=0(つまり、0-1=1)という世界での2進数の加減乗除
を考えるということでも同じです。

この場合、x+1 という多項式は、11 と考えます。(xのi乗の係数
を第iビットの値とみなす)

例えば、10110 というデータに対して、11 という生成多項式で
CRC の検査ビットを求めるには、生成多項式の桁数-1=1ビット
分データを左にシフトして、101100 を得ます。この値を、上の特
殊な2進数の世界で、生成多項式の 11 で割ります。そうすると、
商として 11011、余りとして 1 が得られます。試しにやってみて
ください。この余りを、101100 から引いて(特殊な2進数の世界で
は足すのと同じ)やると、101101 が出ます。これが送るべき符号
ということになります。実際、1の個数は偶数ですので、付け足し
たビットが偶数パリティとなっていることがわかります。

余りの分を引いたわけですから、このデータは 11 で割り切れるは
ずですので、検査側では 11 で割って、余りが 0 であることを確
認すればいいわけです。

この生成多項式の選び方で、検査の能力が変わってきます。やみく
もに選んだら、検査能力がまったくなくなります。通常の CRC は、
それを考慮してうまく多項式を作ってあるというだけのことです。

なぜ 11 なら偶数パリティと同じなのかとか、生成多項式をどう選
べばいいかとかについては、符号理論の勉強が必要です。前者はそ
れほど難しくはないですが。

偶数パリティについておさらいすると、1 となるビットの個数が偶
数になるように、検査ビットを定めるというものですよね?で、検
査側では、1 の個数を数えて奇数だとエラーと判断するわけです。

実は、この偶数パリティというチェックのしかたは、CRC の一種な
んです。CRC では、ある特定の生成多項式を使いますが、CRC の生
成多項式として x + 1 を使ったものが偶数パリティです。

多項式の加減乗除で頭痛ということなら、ちょっと説明が厳しいの
ですが、2進数の加減乗除はできるでしょうか?こ...続きを読む


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

人気Q&Aランキング