1

FPGA プロジェクトで起こっていることについて質問があります。SPI バスを介して 2 つのデバイス (AGC と ADC) を制御する必要があります。FPGA がマスター デバイスとなるため、システム クロックを分周してコードでクロック信号SCKを生成しています。次に、その信号をトライステート バッファーを介して出力ワイヤにルーティングします。以下は私の関連するコードです。これは示されていませんが、FSM によって制御されるトライステート バッファーを制御する信号en_SCKは、アイドル状態で Low に設定され、残りの状態では High に設定されます。

output wire SDI

   //for SCK_clock
reg SCK_gen, SCK_hold;
integer i;
reg en_SCK;
wire neg_edge_SCK;

   //SCK_generator
    always @(posedge clk)
            begin
                i <= i+1;
                SCK_hold <= SCK_gen;
                    if(i == 10)
                        begin
                            SCK_gen <= ~SCK_gen;
                            i <= 0;
                        end
            end


assign SCK = (en_SCK) ? SCK_gen : 1'bz;

デザインを実装すると、次の警告が表示されます。

警告:PhysDesignRules:372 - ゲート クロック。クロック ネット en_SCK_not0001 は、組み合わせピンによって供給されます。これは良い設計方法ではありません。CE ピンを使用して、フリップフロップへのデータのロードを制御します。

また、時計が非常に歪んでいるように見えることにも気づきました。しかし、コードでトライステート デバイスを使用せず、クロック信号を出力ワイヤに直接割り当てると (以下のコードのように)、きれいなクロック信号が得られます。

assign SCK = SCK_gen;

以下は、トライステート バッファなし (左) とトライステート バッファあり (右)の信号SCKを並べたものです。私は FPGA と Verilog にかなり慣れていませんが、そのスタイルの割り当てコードを使用するとトライステート バッファーが使用されることを理解しているため、ゲーテッド クロック ソースとして解釈されるように見える理由がわかりません (XST で生成された回路図は、それが実装されていることを示しています)。とゲート. また、それがクロック信号をどのように歪めているのかについても混乱しています. FSMはen_SCKを強制する必要があります.クロックの周期の何倍も信号を高くできるようにするので、何が起こっているのかわかりません。また、デモボードのマニュアルによると、他のデバイスがこの信号を共有しているため、使用していないときは高インピーダンスに設定する必要があります。誰かが私を正しい方向に向けたり、説明したりできれば、私はとても充実しています. ありがとう ここに画像の説明を入力

4

3 に答える 3

2

SPIについての私の理解は、マスターからのSCK信号がトライステートになることは決してないということです。使用されていないときは、ローまたはハイに接続できますが、トライステートにしないでください。実際、マスターはSPI出力信号(SCK、CS_N、MOSI(SDO))をトライステートにしないでください。

コメントに基づいて更新:

これは、Spartan3Eスターターボードを使用したアプリケーションノートです。4ページに「SPIバス信号(SDI、SDO、SCK)はボード上の他のデバイスと共有されています。アンプまたはA/Dコンバータと通信するときは他のデバイスを無効にすることが重要です」と書かれています。

于 2012-03-21T16:42:08.427 に答える
1

デバイスが常にマスターである限り、SPI バスは通常トライステートにすべきではありません。

通常、チップセレクトピンを介して通信したいペリフェラルを選択し、バス上の他のすべてを選択解除したままにします。選択されていないスレーブ ペリフェラルは、出力 (MISO) をトライステートにするため、選択したペリフェラルとの通信に干渉しません。

また、生成されたクロックをデザインの内部で使用していますか、それともピンに直接配線していますか? 私は Verilog (VHDL ユーザー自身) にはあまり詳しくありませんが、ゲーテッド クロックは通常、信号 (この場合はトライステート バッファー) に対して組み合わせ操作を実行し、それをクロック入力として使用するためです。後でフリップフリップ。

于 2012-03-23T21:44:35.690 に答える