差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
testbench:introduction_to_verilog_hdl:vme_encoder [2015/03/20 19:25] kyotoatlas |
testbench:introduction_to_verilog_hdl:vme_encoder [2019/02/15 09:07] (現在) |
||
---|---|---|---|
行 31: | 行 31: | ||
VME バス上に複数の FPGA がのっていることも多くあります。 | VME バス上に複数の FPGA がのっていることも多くあります。 | ||
それらの FPGA が同時に反応してしまうと、バス内で信号の衝突が起きます。 | それらの FPGA が同時に反応してしまうと、バス内で信号の衝突が起きます。 | ||
- | それを防ぐために、どの信号とやりとりをするのか選択するのが CE の主な役割です。 | + | それを防ぐために、どのチップとやりとりをするのか選択するのが CE の主な役割です。 |
Chip Enable がアサートされた状態になると、次に Output Enable をアサートします。 | Chip Enable がアサートされた状態になると、次に Output Enable をアサートします。 | ||
行 45: | 行 45: | ||
===== Write タイミング ===== | ===== Write タイミング ===== | ||
+ | Write も、似たようなものです。同じようにタイミングチャートを載せます。 \\ | ||
{{testbench: | {{testbench: | ||
+ | さきほどの説明でだいたい同じように理解できますよね。 | ||
+ | チップを選択し、 Write Enable 状態にします。 | ||
+ | その上で、書き込みたいアドレスに対してデータを書き込みます。 | ||
+ | |||
+ | 繰り返し言っておきますが、FPGA に対して読み書き操作を行う説明ですが、この説明は多くのメモリに共通する内容です。 | ||
+ | 見慣れない種類のメモリ ( SPI, BPI, ... ) で合ったとしても、この基本は変わりません。 | ||
+ | チップの説明書(データシート)から細かい変更点を読み取るだけで、対応が可能です。 | ||
+ | |||
===== VME を用いた読み書き ===== | ===== VME を用いた読み書き ===== | ||
+ | さて、では実際に VME から読み書きしていきましょう。 | ||
+ | VME のコントローラとしては本当に実験で使用する時は Single Board Computer を使用するかもしれませんが、実験室などでテストを行う際には SBS 社の Bit3 を使用することが多いようです。 | ||
+ | Bit3 を使用するためのドライバーについては [[http:// | ||
+ | |||
+ | 特定のボードを操作するには専用のソフトウェアを書いたりするのですが、ここでは vmedrv に付属している vmeget/ | ||
+ | 私が管理している PC であれば vmedrv はここにあります。 | ||
+ | $ cd / | ||
+ | この下に version ごとに directory を作っておくようにしています。 | ||
+ | |||
+ | まずは、ある 0x12345678 というアドレスの値を読んでみましょう。 | ||
+ | $ cd / | ||
+ | $ ./vmeget / | ||
+ | というようにします。 | ||
+ | 今回の場合 アドレス 32 bit、データ 32 bit のボードにアクセスするつもりで vmedrv(a)32d32 というデバイスを選択しています。 | ||
+ | その次に続く引数が読みに行くアドレスです。 | ||
+ | 簡単ですね。 | ||
+ | |||
+ | 同じように 0x12345678 に対して 0xabcdabcd という値を書き込むには次のようにします。 | ||
+ | $ ./vmeput / | ||
+ | 今は説明のために適当なアドレスを指定していますが、これを実際に読み書きしたいアドレスに置き換えれば実際に操作することができます。 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== PT6 の VME 操作 ===== | ||
+ | では、実際に先ほど作った Prescaler ロジックのファクターを VME から操作してみましょう。 | ||
+ | |||
+ | 先ほどのファームウェアでは Prescaler ロジック一つでしたが、そこに VME Read/Write 操作を司る VMEEncoder モジュールというのを追加してみましょう。 | ||
+ | 追加後のブロック図は次のような感じです。// | ||
+ | {{testbench: | ||
+ | |||
+ | VMEEncoder モジュールを追加し、VMEEncoder モジュールと Prescaler ロジックとの間で fact という値を受渡しています。 | ||
+ | こうすることで、いちいち bitfile を作り直す必要がなくなり、VME から ( 実際に操作するのは PC ) Prescale factor を変更することが可能です。 | ||
+ | ここでは VME から操作するのは 1 つの値だけですが、通常複数(数十、数百)の値を設定出来るようなデザインが普通です。 | ||
+ | |||
+ | |||
+ | < | ||
+ | VME プロトコルを判断し、FPGA に Chip Enable などの信号を送っているのは CPLD です。 | ||
+ | CPLD は不揮発性(電源を切った後も書き込んだファームウェアが残る)ので、通信制御などを行うためにボードに載せています。 | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | 必要なコードはここにあります。[[https:// | ||
+ | svn co svn+ssh:// | ||
+ | です。 | ||
+ | |||
+ | コードの基本的な見方は最初に詳しく説明したので、今は省略します。(あまりにも分からないようなら、後に追記します。) | ||
+ | VMEEncoder モジュールでは、上で示したタイミングチャートに合わせて、VME のアドレスを見て、 Prescale factor レジスターの値の読み書きを行っています。 | ||
+ | |||
+ | 出来上がる bitfile を FPGA に書き込み、その後実際に fact を読み書きしてみましょう。 | ||
+ | どこのアドレスに書き込めばいいのかを知るには PT6 のアドレス空間を知る必要があります。 | ||
+ | 下にアドレス空間の表を書いておきます。 | ||
+ | ^ アドレス | ||
+ | | FPGA | ||
+ | | CPLD | ||
+ | * 実際に FPGA にやってくる ( VMEEncoder でしている )アドレスは offset 部分です。 | ||
+ | * ボードアドレスは、同じクレート内でアドレスが被らないようにボード上の DIP SW で指定しています。 | ||
+ | ボードアドレスを 0x0f1 だとした時、VMEEncoder モジュール内で Prescale factor に対して定めているアドレス 0xf0 にアクセスするためには | ||
+ | | ||
+ | 本当かどうか vmeget で確かめてみましょう。 | ||
+ | 正しく読めれば、初期値の 10 ( = 0xa ) が返ってきます。 | ||
+ | その後、好きな値に書き換えて遊んでみてください。 | ||
+ | |||
+ | ここまで出来れば、結構色んなことが出来るようになります。 | ||
+ | 値を自由自在に書き換えられれば、色んなボードの設定を変更することが可能です。 | ||
+ | |||
+ | |||
+ | <note tip> | ||
+ | 上の例で何となく分かると思いますが、ボードを操作する上でアドレスの定義が非常に重要です。 | ||
+ | ボードをデザインすることがあれば、どこにどれだけのアドレス空間を割り振るのか、また同じクレートに存在するボードとアドレスを衝突させないようにするにはどうしたらいいのか、というのに頭をひねる必要があります。 | ||
+ | </ | ||