13 ラズパイの信号に応じて、クロックを切り替えるボード
この点をどのようにするか、基板を起こす方法もあるけれど、試行錯誤が多いと思えるので、
FPGAを用いて、プログラム的に、信号切り替え、分周などの論理回路を作成することを考えた(過去記事の「DE1-SOC(FPGAボード)を買いました」。
このボードには、DACがすでに接続されていて、かつ、40ピンのgpioヘッダが用意されており、内部配線をプログラム的に接続すれば足りる点で、その点でも、試行錯誤がやりやすい。
40ピンのgpioヘッダは、ラズパイと対応するように内部配線をプログラム化することもできる。
その点で、基板の作成能力がなくても、外部クロックの仕組みを体感できる。
また、PLLも用意されているので、最終的な理想からは外れるものの、外部クロックを用意しなくても、クロックの変更の仕組みを動作検証できる。(後でマスタークロックを用意し、配線を修正すればよいだけのことである。)
(クリックすると拡大します。)
<2018.4.13 修正>
現在動作確認を終えた。28.224となっているところは22.5792の誤りで、notの演算子が入っているところは、24.576ではなくて、22.5792のほうに入れる。現在の図だと全く信号が出ない。
すべてをverilogで作るのではなくて、回路図を構成し、その中のモジュールだけをverilogで作る。
PIN_AF14は、50mhzのクロックに接続し、PLLにより、22.5792mhz,24.576mhzの周波数を作り出す。これらのマスタークロックの系統をPIN_AC18により、切り替える。
PIN_AC18により選択されたクロックの系列につき、counter1-3は、2分周、4分周、8分周の方形波を作り出す。
上記ボードで採用しているのは、wm8731なので、11.2896mhz,12.288mhzが必要なので、2分周したクロックを1部で取り出す(PIN_G7)。PIN_Y18は、DACのデータ入力であり、内部的にDACとGPIOとを接続している。
2分周、4分周、8分周の方形波は、2ビットのPIN_Y17により、MUXで選択し、これを、ビットクロックとしてラズパイへ出力する。また、ビットクロックの出力として、ボード内部のDACにもプログラム的に出力する。
さらに、選択したビットクロックから、counter6により、2の6乗つまり、64分周にしたクロック(LRクロック)取り出す。
LRクロックは、ビットクロックに基づいて、ラズパイから出力されるが、ラズパイのモードには、カーネルのrpi_dac.cを変更してLRCLOCkも入力できるモードがありそれを試すために用意している。
FPGAについては、上記のボードを用いたが、使用しているFPGAの型番設定を変え、pin plannerでピンの特性を変更するだけで、ほかのalteraのボードにも容易に移植できる。
上記のボードでは、my_first_fpgaというpdfがあり、pllで作成したクロックを、分周により周波数を落とし、LEDを点滅させるという初心者向けの文書があり、それを参考にして拡張していけば、pll + MUX + 分周 の組み合わせにより、gpioの信号の組み合わせに応じて、所定の周波数のクロックを、ラズパイに送ることができる。
現状のプロジェクト(バージョン16LITEエディションで作成)は、グラウンド接続や、ラズパイのピン配置には未対応で修正が必要であり、これを修正し、動作検証をしていきたい。