編集履歴一覧に戻る
uchanのアイコン画像

uchan が 2021年12月15日17時42分44秒 に編集

RxRDYnの変化は不規則

本文の変更

Gowin IDE の IP Core Generator で生成した UART Master IP の挙動が、Gowin IDE のバージョンアップに伴って変わっています。変化した点を簡単に紹介します。詳細な検証はできていないので、実使用の前にご自分で検証をお願いします。 ## UART Master IP とは UART(シリアル通信)の送受信を行う IP コア(FPGA メーカーが提供する回路ブロック)です。Gowin IDE の IP Core Generator で生成できます。参考:[「Tang NanoでuartのIPコアを動かした件」を読み解く](https://elchika.com/article/229c433f-dbb1-4f84-867d-d23f5f1bcec/) Gowin IDE と UART Master IP のバージョン対応表: | Gowin IDE | UART Master IP | |---------------|----------------------| | 1.9.8 (build 54687) | 1.0 | | 1.9.8.01 (build 55895) | 1.1 | ## UART Master IP 1.0 の動作 UART Master IP 1.0 の波形を示します。0x04 を受信した際の波形です。写真が見切れていると思うので、クリックして全体を表示してご覧ください。 ![UART Master IP 1.0の波形](https://camo.elchika.com/a08f7b6e7cafcfedc1146f8d2b80c4ccacc63f3a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f62353639333061332d646638662d346630392d616330342d383563386434356439653865/) UART Master IP は SRAM インターフェースでデータを読み書きします。`O_RDATA` が受信データ(Received Data)を出力する端子で、PC から FPGA にデータを送るとここに現れます。`I_RADDR` は読み込みたいレジスタのアドレスを指定します。0 が受信データを格納したレジスタ、5 がステータスレジスタになっています。 `O_RDATA` が `I_RX_EN` の立ち下がりエッジで変化しているのが分かります。`I_RX_EN` の立ち上がりのタイミングで `I_RADDR` が取り込まれ、`I_RX_EN`の立ち下がりのタイミングで指定したレジスタの内容が `O_RDATA` に出力されるという挙動になっています。 UART Master IP 1.0 は空読みしないと最新のデータを読めないバグと思われる挙動があり、そのために最初は 0x00 が読み出せていて、次に 0x04 が読めています。(`O_RDATA` が 0x61, 0x00, 0x60, 0x04 と変化している部分を言っています) ## UART Master IP 1.1 の動作 UART Master IP 1.1 の波形を示します。先ほどと同様に 0x04 を受信した際の波形です。 ![キャプションを入力できます](https://camo.elchika.com/b2d63b653d39c787bd60353a171427596fd79c9b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f39613239353833622d623664372d346533642d393961332d333038386366656165626561/) `O_RDATA` の変化タイミングが `I_RX_EN` の立ち上がり時に変わりました。UART Master IP に接続された制御回路は変更していないので、正しく 0x04 が読めていないことが分かります。手元の検証では、`I_RADDR` を 0 にする期間をもう少し長くすると 0x04 が読めることが分かっています。 空読みバグが解消した代わりに、信号の動作タイミングが変更された、ということのようですね。Gowin IDE 1.9.8 以前で作成したプロジェクトを Gowin IDE 1.9.8.01 以降で開き、UART Master IP を再生成すると制御が上手くできなくなるので注意してください。 ### アドレスをI_RX_ENの立ち下がりで変化させたとき `I_RADDR` の値を `I_RX_EN` の立ち下がりエッジで変化させつつ 2 クロック分保持させてみると、ver 1.0 の IP と同じように空読みが必要になる波形になりました。 ![レジスタアドレスをI_RX_ENの立ち下がりで変化させる](https://camo.elchika.com/5063bb459c6ff40a50d6430bbe2fc5375926f9c0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f63633165616564322d313139302d346166652d613730362d323437633030616237373736/) ### アドレスをI_RX_ENの立ち上がりで変化させたとき タイミングを少し変え、`I_RADDR` の値を `I_RX_EN` の**立ち上がり**エッジで変化させてみると、空読みが不要な波形になりました。 ![レジスタアドレスをI_RX_ENの立ち上がりで変化させる](https://camo.elchika.com/aee1a648061bf2d2c2aaa894dc1101f4f87040e3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f61323933356436342d663633322d346639382d393237392d333361336130376533353864/) なんとなく、IP の使用方法としてはこちらが正統派な気がしますね。 回路を工夫して 1 つ前の `I_RX_EN` の立ち上がりでレジスタアドレスを変化させてみました。これでも空読みが不要な波形になりました。少々解せませんが…… ![レジスタアドレスをI_RX_ENの立ち上がりで変化させる(コンパクト版)](https://camo.elchika.com/3ed7e6b8764a5b1e4b203f738939a1c79b800f97/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f37383966323635312d656637362d343534312d393436382d323433643465653463626236/)

-

### RxRDYnを活用する

+

### RxRDYnは不安定

-

UART Master IP が出力する `RxRDYn` という信号を利用すれば、ステータスレジスタの最下位ビット(`O_RDATA[0]`)が 1 になるのを検出する必要なく、さらにシンプルに受信できること分かりした。UART Master IP ver 1.1 で検証しているので、ver 1.0 で同様のタイミングが実現できるかは分かりせん

+

UART Master IP が出力する `RxRDYn` という信号を利用すれば、ステータスレジスタの最下位ビット(`O_RDATA[0]`)が 1 になるのを検出する必要なく、さらにシンプルに受信できる。UART Master IP ver 1.1 で検証して

-

![RxRDYnが0になったらレジスタ0を読む](https://camo.elchika.com/8cae46bf8ccba182a79172cf448fc375a0b0625a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f33613666336236312d326331382d346635322d393461362d653933393036366562353439/)

+

![RxRDYnが0になったらレジスタ0を読む](https://camo.elchika.com/8cae46bf8ccba182a79172cf448fc375a0b0625a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f33613666336236312d326331382d346635322d393461362d653933393036366562353439/) これは期待通り、受信データが読めています。 ![RxRDYnが0になるタイミングはずれることがある](https://camo.elchika.com/0994560122bf94ecc2b512ba1a28722d437c59a2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f35333265373338372d656265352d346264662d393564372d313939653662353934326633/) 何度か実験すると、`RxRDYn` の変化がズレることがありました。タイミングがズレると空読みが必要な状況になってしまいます。結論としては `RxRDYn` の変化タイミングは信用できません。