FC2カウンター FPGAの部屋 PCIバスなどのシミュレーション(VHDL)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

PCIバスなどのシミュレーション(VHDL)

大体のバスはそうだと思うが、PCIバスに代表される(代表されないか?)バスをシミュレーションするときに普通にやろうとすると、シミュレーション時に入力が 'Z' になると出力が 'X' になって、それが伝播して、シミュレーション時の信号が'X'でいっぱいになる。(VHDLの場合)

PCIバスの信号は大体はサスティンド・トライステートと呼ばれる信号になっている。サスティンド・トライステートは、信号をマザーボードで、電源から抵抗でプルアップしておく。そして、いずれかのデバイスがバスをドライブし、ドライブが終了してバスを放すときに、必ず出力を'1'レベルにドライブしてから、ハイインピーダンス 'Z' にする。ちなみに、それらの信号はアクティブ・ローだ。'0'の時にアクティブとなる。
そうすることで、'0'でドライブをオフ(ハイインピーダンス状態)にした時の、'1'になるまでの長い回復時間を防いでいる。('0'でドライブをオフした時には、'1'にするためにはプルアップ抵抗と浮遊容量で構成された積分回路を充電する必要があるため、バススピードから見たら長い時間がかかる)
このマザーボードでの抵抗プルアップをシミュレーションで実現することを考えてみた。std_logicの信号値は 'U', 'W', 'X', 'L', 'H', '0', '1', '-', 'Z' の9種類あって、そのうちの弱い'1'の 'H' を使うことにした。
PCIバスモデルで、PCIバスのサスティンド・トライステート信号を常に 'H' にドライブしておいて、ターゲットボードの回路の信号を接続した。ターゲットボードの回路が信号をドライブするときには、PCIバスモデルは 'H' を出力しながら、ターゲットボードの回路が '0' や '1' に信号をドライブする。これで 'U' が伝播せずにシミュレーションができるようになった。信号レベルが 'H' だと他のデバイスが '1' や '0' を出力してもぶつかる事がなく、シミュレーションをすることができた。
しかし、前回のターゲットボードの回路は入力信号が 'H' にドライブされることを考慮していなかったため、動作がおかしくなってしまったので、PCIバスモデルのほうで強制的に '1' にしたところもあった。
今回は、それも修正したつもりだ。
具体的には、

when bus_busy =>
 if (irdyx = '1') and (framex = '1') then
  next_state <= idle;
 end if;


というのを、

when bus_busy =>
 if (irdyx /= '0') and (framex /= '0') then
  next_state <= idle;
 end if;


に書き直した。
今から確認するのだが、これで大丈夫だろう?と思う。

ご意見、指摘をお待ちしています。

#なお、ブラウザでブログを書いているのだが、操作をミスって、3回消してしまった。ブログ書く専用エディタにしようかしら、せっかく書いたのにくやしーーーーーい。だんだんどうでも良くなってきた。

2007/07/03 追加:上記の記述で無事シミュレーションができました。
今回、私は使っていませんが、haltoさんからTo_X01を教えていただきました。haltoさんありがとうございました。
To_X01を使用すると 'H'を '1'、'L' を '0' に変換してくれるようです。その他の信号も変換します。
To_X01は <ISEインストールホルダ>\vhdl\src\ieee\std_logic_1164.vhd に定義があります。
  1. 2007年06月29日 20:40 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:2

コメント

いつも拝見させていただいています.私もVHDLをはじめたとき似たような状況で困り,いろいろ調べたことがあります.一般的にはプルアップしたいバスをHでドライブしておき,入力側でTo_X01を使用して変換して受け渡すようです.(Xilinxのゲートシミュレーションモデルでも使われています)RTLに使用しても合成時に特に何のメッセージも無く,無視されて正しく扱われるようですが,私はテストベンチ側で一度変換をしてからデザインに渡しています.
  1. 2007/07/02(月) 23:30:33 |
  2. URL |
  3. halto #-
  4. [ 編集 ]

こんにちは。 haltoさん、情報ありがとうございました。

To_X01はstd_logic_1164ライブラリのソースに記述がありました。Hを1に、Lを0に変換していました。
さらに、UNISIMライブラリのソースを見るとBUFプリミティブとかが使っています。BUFはまさにTO_X01のみでした。BUFはマップで無視されるので、これを入れても良さそうです。
いろいろありがとうございました。勉強になりました。
  1. 2007/07/03(火) 05:28:47 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/512-1464f567
この記事にトラックバックする(FC2ブログユーザー)