問題の解決になるかわかりませんが、FIFOのrd_enの解説を聞いていると、そのような動作をさせるには fifo_generatorのNaitive_Portsタグの一番上にある、Read Modeを"Standard FIFO"ではなく、"First Word Fall Through”の方に設定する必要があります。こちらのモードにすると、FIFOに一つでもデータが溜まっていれば、re_en=1'b0でも最初のデータを出力してくれます。(倉庫の中に在庫があれば、すぐ自動的に出てきてくれる感じですね。)re_en=1'b1でクロックが来ると次のデータが出力に更新されます。 操作でいうと、データは出てきてくれているが、rd_en=1'b0にしておくことで、その状態が維持され次のデータへは進ませないようにできます。 この"First Word Fall Through”モードにおけるrd_enは、AXIのTREADYの動きに対応します。解説にあったように、rd_en=1'b1なら、Nextデータに進めという意味で、在庫があれば(empty=1'b0)なら次のデータを出してくれます。 一方、"Standard FIFO"モードの場合、rd_enはRead Enableそのものの意味で、rd_en=1'b0なら出力データは出てきません。rd_en=1'b1なら次のクロックの立ち上がりでリードデータが出てくるので、指令を出してから1クロック後の反映になります。(倉庫に在庫が溜まっていても、指令があるまでは出力しないって感じになります。) "Standard FIFO"モードの方がベースにあって、自作回路を追加して"First Word Fall Through”モード (AXIのような動作)にすることも可能です。 rd_enという信号名は"Standard FIFO"モードではしっくりきますが、"First Word Fall Through”のときはAXIのようにTREADYかNextReadみたいな信号名の方がいいかと個人的には思います。
@AdachiChidori3 ай бұрын
詳細にありがとうございます!🙇♀️🙇♀️🙇♀️ 最初にやいやい言っていた「リセットしているのに古いデータがホールドされている・キューに古いデータが残っているのが気持ち悪い」問題は、FIFOのリセット機能をチェックして有効にしたらリセットをかければ output resistor がゼロになり、internal pointer もリセットされてキューも empty になるようなのでおそらく解決しました。 後の方でやいやい言っていたTVALIDの何回かに一回しか値が更新されないという問題は、ADCの補助チャンネルを複数 enable にしていたのでマルチプレクサとチャンネルシーケンサーが働く状態でADCを動かしていたために見ていたチャンネルの値はチャンネルシーケンサーが一巡しないと値が更新されないという状況だったのが原因だったようです。補助チャンネルを1つだけ有効にしてチャンネルシーケンサーが働かないようにしたらだいたい1MSPSの一定速度でサンプル・stream できるようになりました。 いまのところだと両方試してみたのですが standard FIFO でも First Word Fall Through でもそう大きな差はなさそうでとりあえず standard FIFO で進めようと思っているのですが、タラちゃんさんのコメントを読んだりドキュメント読んだりした感じだともしかしたら First Word Fall Through はレイテンシを小さくしたり ADC を event trigger にして厳密に一定速度でサンプルしてストリームさせる目的で後で使うかもしれないです。まだよく理解できていないところが多いですが…… グダグダした配信ですがよろしくお願いします😅