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を強制する必要があります.クロックの周期の何倍も信号を高くできるようにするので、何が起こっているのかわかりません。また、デモボードのマニュアルによると、他のデバイスがこの信号を共有しているため、使用していないときは高インピーダンスに設定する必要があります。誰かが私を正しい方向に向けたり、説明したりできれば、私はとても充実しています. ありがとう