3

異なる周波数の 2 つの非同期クロックの 2 つの立ち上がりエッジの最初の一致を検出するデザインに取り組んでいます。

このようなコードは、シミュレーションで機能する可能性があります。

fork 
@posedge clkA 
begin 
    a=$time 
end 
@posedge clkB 
begin 
    b=$time 
end 
join 

if (a=b) then some code.

このコードはシミュレーションで機能する可能性がありますが、合成可能なハードウェア ロジックが必要な場合は、他に何が使用できますか?

4

3 に答える 3

2

あなたが説明した動作をハードウェアで再現することはできません。これは、時間を正確に比較するためです。

まず、「2 つの立ち上がりエッジの最初の一致を検出する」とはどういう意味かを説明する必要があります。2 つの非同期クロックの位相関係が可変 (かつ予測不可能) であることを考えると、同時エッジを検出するタスクは (通常) 「同時」とはどのくらいの時間であるかという観点から説明されます。

例: 立ち上がりエッジの間隔が最大 5ns の場合に検出します。

ところで、ここでは、問題の両方の周波数が既知であると仮定します。

問題を詳しく説明してください。

編集: この質問は、Verilog とは関係のないハードウェアの質問になりました。ここで提案されている解決策のいずれかが機能するかどうかは明らかではありません (そして、私の個人的な考えでは、機能しないと思います)。私は同じ質問をEE Stack Exchangeに提出しました。これはハードウェアに関する質問の場所であり、そこで回答される可能性が高くなります。

于 2013-06-14T15:47:47.860 に答える
2

これはちょっと難しいですが、検出する必要がある 2 つの間の最速のクロックの 2 倍の速さの 3 番目のクロックを取得でき、検出の 1 サイクルの遅延を受け入れることができる場合 (1 サイクルは 3 番目のクロックを基準にしています)クロック ドメイン) であれば可能です。

次のように、clk ドメインごとに登録するように設定する必要があります。

input clk1, clk2'

...

reg clk1_in, clk1_out;
reg clk2_in, clk2_out;

wire clk1_posedge, clk2_posedge;

//take in the clock value, you should register this so that way jitter on the line does not mess with it 
always@(posedge clk3)begin 
    clk1_in <= clk1;
    clk2_in <= clk2;
end 

always@(posedge clk3)begin
    clk1_out <= clk1_in;
    clk2_out <= clk2_in;
end 

//now you need to detect the posedge for each signal independently, you can use and and gate for this 
assign clk1_posedge = (~clk1_out && clk1_in);
assign clk2_posedge = (~clk2_out && clk2_in);

// now just and the two together 
assign pulse_detected = clk1_posedge && clk2_posedge

clk 3 を 2 倍の速度にする必要があります。そうしないと、エイリアシングが発生します (ナイキスト周波数を調べます)。

そのため、クロックドメインの最初のレジスターがハイになり、それがちょうどハイになっている場合、2番目のレジスターはそのサイクルの間ローのままです。

于 2013-06-14T08:43:57.073 に答える