2017-06-25 1 views
0

より高速で動作する作業者にコンフィギュレーションモジュール(より遅いクロックで動作)を接続する必要があります。標準的な答えはFIFOのようですが、より少ないリソースを消費するよりシンプルなソリューションを考え出しました。レイテンシがはるかに高いという欠点があります。私の利益は、データの可能なサイズごとにFIFO IPを再生成する必要がないことです。 RTLシミュレーションではうまくいくように思えます(質問に無関係な合成後のポストを使用してトラブルに遭遇します)。奇妙なデータを変更するためのクロッシングクロックドメイン

が、私は何かが足りないか、以下のコードが正しい午前:

module fifo_int#(// This is bad name. I haven't come up with better yet 
    parameter type DATA = logic [31:0] 
    )(
    input logic rst, 
    input logic clk_in, 
    input DATA din, 
    input logic clk_out, 
    output DATA dout 
    ); 
    DATA dreg; 

    enum logic [1:0] { 
     IN, 
     STABLE, 
     WAIT_OUT 
    } in_state; 
    enum logic [1:0] { 
     WAIT_IN, 
     WRITE, 
     INV 
    } out_state; 
    logic in_output[3], out_output[3]; 
    initial begin 
     in_state <= IN; 
     out_state <= WAIT_IN; 
     for (int i = 0; i < 3; i++) begin 
      in_output[i] <= 0; 
      out_output[i] <= 0; 
     end 
    end 
    always @(posedge clk_in) 
    begin 
     case (in_state) 
     IN: begin 
      dreg <= din; 
      in_state <= STABLE; 
     end 
     STABLE: begin 
      in_state <= WAIT_OUT; 
      in_output[0] <= ~in_output[0]; 
     end 
     WAIT_OUT: begin 
      in_state <= (in_output[0] == out_output[2]) ? IN : WAIT_OUT; 
     end 
     endcase 
     out_output[1] <= out_output[0]; 
     out_output[2] <= out_output[1]; 
    end 
    always @(posedge clk_out) 
    begin 
     case (out_state) 
     WAIT_IN: begin 
      out_state <= (in_output[2] == out_output[0]) ? WAIT_IN : WRITE; 
     end 
     WRITE: begin 
      dout <= dreg; 
      out_state <= INV; 
     end 
     INV: begin 
      out_output[0] <= ~out_output[0]; 
      out_state <= WAIT_IN; 
     end 
     endcase 
     in_output[1] <= in_output[0]; 
     in_output[2] <= in_output[1]; 
    end 
endmodule 
+0

クロックは同期していますか?ここでは、クロックドメインの交差の基本について説明するリンクがあります。http://www.eetimes.com/document.asp?doc_id=1279906 –

+0

@TudorTimiいいえ、リンクをありがとうございます - まだ読んでいませんが、私は行います。 –

+0

遅い側の波と、早い側をどのように動作させたいかは、問題をよりよく理解するのに役立ちます。たとえば、データ処理をいつ開始するのか、早い段階でどのように認識されていますか? –

答えて

0

あなたのクロックが非同期である場合は、同期が必要になるだろう。

同期クロックの場合、遅い側がデータを生成するため、バッファリングは必要ありません。とにかく、データは複数の(高速な)クロックサイクルで安定して保持されるため、ドメイン間に本当にロジックは必要ありません。

関連する問題