2015年6月25日木曜日

ZYNQで追加のUARTポートを使う まずPL側

組み込み機器を作っていると、買い物コンポーネントをつないだりするために無駄にシリアルを多数用意しなきゃいけないことがよくあります。

最近のマイコンはそれを考慮して最初から4系統のUARTを持ってたりするのも多いですけど、5とか6系統あたりからだんだん選択肢が怪しくなります。

ZYNQの速度からすると非常にもったいないんですが、FPGAで欲しいだけの232Cポートを用意するのはけっこうよくある使い方です。

まず、ZYNQは最初からプロセッサ側に2ポートのUARTを持ってるので、vivadoでMIOのピン割り当てを有効にしてLinuxのdtsファイルにちょっと書くだけで(参考)1ポート増設はすぐできます。最初からデバッグコンソールに使ってるのと並んで、これは(digilent配布の)Linuxでは /dev/ttyPS0と /dev/ttyPS1として見えます。


3ポート以上要るときはPL部にIPをぺたぺた配置していかないといけません。

xilinx提供のIPには

  • 16550互換のゴツイもの。ドライバはLinux純正のでOK
  • ハードフロー関係を省いた軽量なuartlite。IPの実績は長いけどLinuxドライバが迷走中

の2つがありそうです。使い方はだいたい同じですがそれぞれ罠がありました。



まず本命のuartliteについて、PL側から説明していきます。
uartliteは軽くて小さいけど16バイトFIFOと割り込み対応はしていて性能はなかなのものです。

IP側は、まずZYNQのPL部設定で汎用ファブリック割り込みを有効にしておきます。まあこれはどの割り込みテストでも一緒。


後はxilinxの参考ページほぼそのままで、下図の右下部分がuartliteです。

デバッグ用に割り込みラインをLEDにも出してるのと、無駄に16550も配置してRXを両方に入れてたりしますが16550の方は無視してください。

参考ページと違うところは割り込みの番号です。

ZYNQに割り込みを突っ込むのにはORで好きな本数束ねた後に、上の絵の中央下端にあるconcatさんを経由してからPS部のIRQ_F2Pに突っ込むのですが、このconcatさんの仕様がある時点から変わっています。

昔は割り込み番号を大きいほう(91)から使っていたのが、最近のバージョンでは小さいほう(61番)から使うようになっています。(↓concatのダイアログに文章で書いてあります)

なのでOS側のためにdtsファイルに書く割り込み番号も、61側から順に書かないといけません。

なお、ハードフローを使わないならuart16550を使う手順もPL側は全く同じです。違いはuartliteでTX/RXと名づけられていた信号はsout/sinという名前になってる、てとこぐらい。あとfreeze機能は不要なので一応GNDにつないでおきました。

後はAXIバスのアドレスを自動でいいので割り振ってあげてください。
PL側の準備はここまで。

0 件のコメント:

コメントを投稿