2

私は Verilog を学んでいますが、Verilog コードを見ただけでは回路がどのように機能するかがわからない場合は、RTL ビューアーにアクセスしてデジタル ロジックを確認します。しかし、このコードには奇妙なコンポーネントが表示され、このコンポーネントが何なのかわかりません。フリップフロップ、マルチプレクサ、またはロジック ポートですか? 以下はコードと画像です。画像では、コンポーネントは赤い三角形です。

コード :

module testesoma(clock,reset,in, out,aux);

input wire reset, clock, in ;
output reg [3:0] out,aux;


 always @(posedge clock or posedge reset)
begin
    if(reset)
        begin
            out = 0;
        end
    else    
        out = aux;
        aux = aux + 1;
end
endmodule

ここに画像の説明を入力

4

2 に答える 2

4

なんという素晴らしい回路図: 生成に手間取ったことに対する +1。コードに複数の問題があります。これは、ブロッキング代入、フィードバック、合成テンプレートを使用しないことなどの危険性の良い例です。Quartus は確かに失敗しましたが、インプットを考えれば驚くべきことではありません。問題:

  1. ここではブロッキング割り当てを使用しないでください - 使用してください<=
  2. beginあなたのsとsを整理してくださいend。開始点として、必要でない限りコードにbegin/を入れないでください。end冗長で、このようなエラーを隠します。複数ステートメントのブロックを明示的に作成する必要がある場合にのみbegin/を使用してください。クロックされた/ステートメントの外にあることにend注意してください-いつ実行するつもりですか?aux=aux+1ifelse
  3. インクリメントする場所とタイミングを整理auxします。
  4. のようなフィードバックがある場合は十分に注意してくださいaux=aux+1。注意しないと、実際のハードウェアが振動します。
  5. このように連鎖したロジックを書かないでください - 並行して考え始めてください。

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 ははるかに優れたものになります。

于 2014-02-18T09:21:30.363 に答える
2

そのシンボルは単なるバッファであり、出力を入力と等しくします。なぜデジタル ロジック回路図に表示されるのかはわかりません。

バッファーは、回路のデジタル機能に影響を与えません。ドライバー セルが効率的に駆動するにはネットの容量が大きすぎる場合に、シンセサイザーによって挿入されます。ほとんど無視できます。

また、その回路図には少し疑いがあります。RTL と一致していないようです。RTL はポーズエッジ クロックごとに aux をインクリメントしますが、これは加算器を介した組み合わせフィードバック ループを示しており、まったく機能しないようです。

于 2014-02-18T04:50:20.193 に答える