日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

ハイインピーダンスの上手い使い方

今日は午後から授業がないので、MIG周りの回路を設計していた。

とりあえず今日は書き込みの回路を書き終わった。シミュレーションしないとちゃんと動くか分からん。

あと、シミュレーションでは良くても実機では上手く動かない可能性もあるし厄介。


ところでVerilogではポートにはinput,output,inoutの3種類がある。

inputは入力ポート、outputは出力ポートなのはすぐわかるが、inoutってなんじゃとなる。

inoutは入力にも出力にもなるポートですね。

どうやって入力と出力を兼ねるのか、使い方が気になるポートだが、ちゃんとうまい使い方がある。

module A(inout [7:0] X,input X_OUT_EN)
  reg [7:0] X_OUT;
  assign X= X_OUT_EN ? X_OUT : 8'hzz;
  //(略)
endmodule

ポートに信号を出力するというのは、ポートの電圧をHかLにすることだが、両方から同時に出力するとショートしたりしてまともに動かない。

そこで片方が出力している時はもう片方はHにもLにもしない状態にする必要がある。

その状態こそがハイインピーダンスですね。Verilogではzで表す。

というわけで出力するときだけ、X_OUTの値を出力し、それ以外の時はハイインピーダンスにしておく。

ハイインピーダンスにしておけば、接続先の出力信号を読むことができる。読む時はそのまま読めばOKです。

今回inoutは直接は使わないのだが、DDR2 SDRAMのデータ端子はinoutでしたね。MIGがこのへんうまいことやってくれてるはず。


同じことは接続された複数のモジュールのいずれかから出力する時にも言える。

module B(output [7:0] DOUT,input EN)
  reg [7:0] DOUT_REG;
  assign DOUT= EN==1 ? DOUT : 8'hzz;
endmodule
module C
  wire [7:0] DOUT;
  reg [3:0] EN;
  B b1(DOUT,EN[0]);
  B b2(DOUT,EN[1]);
  B b3(DOUT,EN[2]);
  B b4(DOUT,EN[3]);
endmodule

4つのBのDOUTを全部同じDOUTに接続しているので、いずれかのBからしかDOUTに出力することができない。

そこでBでは出力するべきときだけDOUTから出力してそれ以外の時はハイインピーダンスしておけばいいと。

こういうときにもハイインピーダンスは役に立つ。


このハイインピーダンスというやつ、コンピュータの中でも大活躍している。

コンピュータのバスというのは、出力する時だけ出力して、それ以外の時はハイインピーダンスにすることで、1本の線を複数のモジュールの出力で共有できている。

もしこれがなければ、メモリからの出力用、CPUからの出力用など出力するところごとに用意する必要がある。

さらにハイインピーダンスがなければ入力と出力を共用できない。すなわちメモリはデータ入力端子とデータ出力端子を別々に用意する必要が出てくると。

実にハイインピーダンスがなければ不便なわけですわ。

ということを、以前のコンピュータ応用工学の授業でやった。


実際にどうやってハイインピーダンスを実現するのかという話だが、スリーステートバッファを使う。

スリーステートというのはHとLとハイインピーダンスという意味ですね。

入力信号とハイインピーダンスにするかの信号線をつないで、それに応じてハイインピーダンスか入力信号と同じ値を出力するかするバッファですね

Verilogでさっきのように書いて、論理合成して配線すると、出力をスリーステートバッファにつないでくれるんだと思いますよ。

あまりそんなことは気にせず書いているけど、実際にはそうなるはずです。


Author : Hidemaro
Date : 2010/11/12(Fri) 22:46
研究・実験 | Comment | trackback (0)

Tools