差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
testbench:introduction_to_verilog_hdl:vme_encoder [2015/05/21 18:57] kyotoatlas [VME を用いた読み書き] |
testbench:introduction_to_verilog_hdl:vme_encoder [2019/02/15 09:07] (現在) |
||
|---|---|---|---|
| 行 78: | 行 78: | ||
| 今は説明のために適当なアドレスを指定していますが、これを実際に読み書きしたいアドレスに置き換えれば実際に操作することができます。 | 今は説明のために適当なアドレスを指定していますが、これを実際に読み書きしたいアドレスに置き換えれば実際に操作することができます。 | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ===== 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> | ||
| + | 上の例で何となく分かると思いますが、ボードを操作する上でアドレスの定義が非常に重要です。 | ||
| + | ボードをデザインすることがあれば、どこにどれだけのアドレス空間を割り振るのか、また同じクレートに存在するボードとアドレスを衝突させないようにするにはどうしたらいいのか、というのに頭をひねる必要があります。 | ||
| + | </ | ||
