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
クロックは同期していますか?ここでは、クロックドメインの交差の基本について説明するリンクがあります。http://www.eetimes.com/document.asp?doc_id=1279906 –
@TudorTimiいいえ、リンクをありがとうございます - まだ読んでいませんが、私は行います。 –
遅い側の波と、早い側をどのように動作させたいかは、問題をよりよく理解するのに役立ちます。たとえば、データ処理をいつ開始するのか、早い段階でどのように認識されていますか? –