2017-08-19 12 views
0

私はFPGAにメモリマップされたIO要素を持っています(正確に言えばAXIメモリマッピングされたインターフェイスを基本的にピンのセットにマッピングするAXI GPIO要素)。これはARMプロセッサのアドレス空間に接続されてマップされていますGP0マスタポートによって実行されます。 FPGAとARMの両方のプロセッサは、ZYNQ7000ファミリデバイスの一部です。私が要素のアドレスに書き込むとき、どこに文書を探すべきか、あるいは一般的な仕組みは何ですか? 0を見て次にどのように私は10ns以下の1サイクル、クロックドプロセスのために(VHDL、それがどんな関連性の場合)ことを確認することができますのは、私がvolatileメモリマップされた変数portメモリマップされたIOへの書き込み。 IOによって見られるためには、値が安定する必要がありますか?

port = 0; 
port = 1; 

を書き込みのこのシーケンスを持っていると仮定しましょう後のサイクルでは、クロックされたプロセスは1と表示されますか?理想的には、それが可能であれば、の次のサイクルになります。最初のアプローチでは、(サイクルカウンタを使用して)十分に長いCPUサイクルを待つだけです。しかし、それは物事を行うためのむしろ "残忍な"方法のように見えます。

答えて

2

一般的にMMIOの場合、書き込みが表示されるまでの時間はありません。あなたが書いていると、それはバスに出るでしょう。別の書き込みをすると、後でバスに出ます。 (MMIO範囲の非キャッシュ、非書き込み結合のマッピングを仮定します)。バスの反対側のデバイスが書き込みに対処するのに時間がかかる場合、通常はデバイスをポーリングすることによって処理されます。

GPIOペリフェラルのように動作していると言われているので、非常に簡単でFPGA側では書き込みがバス上のイベントとして表示されないと仮定します。 「GPIOライン」の状態が変化するだけです。それで、いくつかの選択肢があります:

  1. 何もしません。 2つの書き込みは、少なくとも1つのバスサイクルで分離されたGPIOペリフェラルに当たるべきであり、それが十分であれば(つまり、GPIOはホールドタイムを必要とせず、1つのバスサイクルが十分長い)

  2. 2つの書き込みの間にポートの読み込みを挿入します。それは余分なバスのターンアラウンドを追加するはずです。

  3. ご質問の中でお勧めしますように、お待ちください。これは、ハードウェアを扱うときに行うのは完全に正常なことですが、10nsはまったく長い時間ではありません。

+0

ありがとうございました。 TRMは、 "強く順序付けられたメモリへの書き込みは、書き込みによってアクセスされる周辺装置またはメモリコンポーネントに到達したときにのみ完了することができる"と述べている。私はそれがあなたが挙げた最初のアプローチだと思います。だから私はこれを最初に試みます。データ到着のための適切なハンドシェイク信号としてのバスから、それはうまくいくはずです。 –

0

前の回答に記載されていない別の問題があります。書き込みの前に読み込みを挿入するだけでは、特に場所が陰影付けされている場合は挿入できません。この場合、2つの連続した書き込みが目的地に順不同で到達する可能性があります。それがARMコアに特別なバリア命令がある理由です。

理想的には、それはあなたがそのような仮定を行うカント次のサイクル

のためになります。

+0

WOW、ok。私は、強く秩序だったメモリ領域の属性は、順序の書き込みを防ぐことを考えましたか? –

+0

私が書いたように、特定のコアバス構成と周辺機器を考慮する必要があります。 「魔法の」一般的な答えはありません。 –

+0

私が読んだARMコアは、異なるメモリセマンティクスをアドレス空間の異なる領域に適用できるようにし、相互にI/O操作の順序を保証するためにメモリバリアを必要としません。ハードウェアの観点からは、メモリバリアは、例えば、 1つのバス上のI/O動作は、別のバス上でアクセスされるメモリのバンクに電力を切り替える可能性がある。 – supercat

-1

"外部メモリバス"ペリフェラルを持つほぼすべてのマイクロコントローラで、そのペリフェラルはデータが利用可能になるまで自動的にCPUリード要求をストールし、CPUをストールします書き込み要求が完了するまで、または要求が完了するまで書き込み要求に続くすべての操作をストールします。外部バス上での動作は、マイクロコントローラ内の他のメモリまたはデバイスに関してではなく、互いに対してのみ順序付けられることに留意されたい。たとえば、アドレス0xABCD1234にメモリマップされたペリフェラルが存在し、コードがGPIOピンA0に1を書き込み、次にそのペリフェラルに書き込み、GPIOピンA1に1を書き込むと、ペリフェラル書き込みの影響が発生する可能性がありますA0への書込み、またはA1への書込みの後、またはI/Oポート上の2つの操作の間で実行されます。メモリバリア命令の使用はシーケンシングを確実にするのに役立つかもしれませんが、実際にはデータシートの読み方に代わるものはありません。 ARM上のメモリバリアによって、I/Oポートを設定する命令の前に外部バスの書き込みが完了することが保証されますが、外部ハードウェアがバス書き込みに応答してアクションを実行するために2サイクルかかる場合(あまり異常ではありません) I/Oポートの操作が最初に行われる可能性があります。

+0

NO。最も単純なものだけを考えているのは、真実です。 –

+0

@ PeterJ_01:I/O使用のために構成されたアドレス空間の一部(存在する可能性のあるキャッシュをバイパス)は、どのような共通マイクロコントローラで動作するのでしょうか?コントローラは、同じバス上のすべてのシーケンスI/O操作を互いに見て、独立したバス上のI/O操作で書き込みを重ねるかもしれませんが、読み込みをブロックします。メモリとして構成されたアドレス空間の部分は、動作が異なる場合がありますが、I/Oとして振舞うことを望むプログラマは、そのように構成します。 – supercat

関連する問題