最近のマイコンはそれを考慮して最初から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側の準備はここまで。