こんにちは私はVHDLに不慣れで、1つのプロセスに複数のクロックがあるこのようなプロセスを使用しても大丈夫かどうかを尋ねたいC256HzとC4Hzは50MHzクロックから駆動されるクロックイネーブルです
process (Reset, C50Mhz, Go, start_flag, C256Hz, C4Hz)
begin
if reset = '1' then
start_flag <= '0';
elsif rising_edge (C50Mhz) then
if C4Hz = '1' then
if count4 = "11" and single_run_flag = '0' then
start_flag <= '0';
end if;
end if;
if C256Hz = '1' then
if Go = '1' and start_flag = '0' then
start_flag <= '1';
end if;
end if;
end if;
end process; `
それは大丈夫ですが、合成が良い結果を生み出すかどうかは生地に依存します。
感度リストには、とが含まれている必要がreset
ありC50MHz
ます。これは、これらが実際に信号を変更する唯一のイベントであるためです。ときC4Hz
トグル、その後rising_edge(C50MHz)
でfalse
これらが同期されないため、プロセスは、その後に実行した場合、何も起こりませんでしょう。
個別のイネーブルはどこでも利用可能であると想定できます。クロックファンアウトが非常に高いため、全員が個別のクロック分配ネットワークを実装しているため、レジスタでのイネーブルが必要になります。したがって、これは安全に使用できます。
非同期リセットはすべてのファブリックで使用できるとは限りませんが、通常は使用できます。一部のデバイスは非同期ロードをサポートし(つまり、リセット時に取得する値を決定できます)、他のデバイスはリセットのみをサポートします(つまり、レジスタをゼロのみに設定でき、1に初期化すると、反転テーブル、つまりリセット先のレジスタが生成されます。 -ゼロ、および次のLEのインバーター。
したがって、一般的に、これはかなり安全です。これは次のように合成できます。
-- intermediates
do_clear_start_flag := C4Hz = '1' and count4 = "11" and single_run_flag = '0';
do_set_start_flag := C256Hz = '1' and Go = '1' and start_flag = '0';
-- to register
enable_start_flag := do_clear_start_flag or do_set_start_flag;
new_start_flag := do_set_start_flag;
start_flag
inの古い値のチェックは、以前にdo_set_start_flag
設定されていても設定start_flag
が効果がない場合でも、現在のクロックサイクルでリセットされる可能性があるため、最適化できません。
で始まるブロックif C256Hz = '1'
がelsif
代わりである場合、2番目の中間体は次のようになります。
do_set_start_flag := C256Hz = '1' and Go = '1' and do_clear_start_flag = '0'
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加