なんという素晴らしい回路図: 生成に手間取ったことに対する +1。コードに複数の問題があります。これは、ブロッキング代入、フィードバック、合成テンプレートを使用しないことなどの危険性の良い例です。Quartus は確かに失敗しましたが、インプットを考えれば驚くべきことではありません。問題:
- ここではブロッキング割り当てを使用しないでください - 使用してください
<=
begin
あなたのsとsを整理してくださいend
。開始点として、必要でない限りコードにbegin
/を入れないでください。end
冗長で、このようなエラーを隠します。複数ステートメントのブロックを明示的に作成する必要がある場合にのみbegin
/を使用してください。クロックされた/ステートメントの外にあることにend
注意してください-いつ実行するつもりですか?aux=aux+1
if
else
- インクリメントする場所とタイミングを整理
aux
します。
- のようなフィードバックがある場合は十分に注意してください
aux=aux+1
。注意しないと、実際のハードウェアが振動します。
- このように連鎖したロジックを書かないでください - 並行して考え始めてください。
Quartus はかなりうまくいきましたが、それが生成した回路は発振するだけで、aux
出力はクロックされません。これはおそらくあなたの意図によるものです。Quartus は、不安定なフィードバック回路を生成したことを確認できるため、レッド バッファーを挿入しました。これについてどこかで警告を生成する必要がありました。
1 - コードを書き直します。何かのようなもの
always @(posedge clock or posedge reset)
if(reset)
out <= 0;
else
out <= aux;
always @(posedge clock or posedge reset)
if(reset)
aux <= 0;
else
aux <= aux + 1'b1;
2 - クロックで複数の変数に割り当てないでalways
ください (ヒント:すべてのブランチ/実行パスを確認し、すべての可能なパスで割り当てたすべての変数に論理的なことが起こることを確認してください) 。
3 - VHDL に関する本を見つけて、デルタ遅延/割り当てに関する章を読んでください。Verilog ははるかに優れたものになります。