2017-02-28 6 views
2

今私はクロックゲーティングを以下のように実装しようとしています。 しかし、なぜ私はDe信号を扱うのか理解できません。シーケンシャルのalwaysブロックにelse文が必要ですか?

module ClockGating( 


      input wire rst_n, 
      input wire clk, 
      input wire De, 
      input wire InReg, 

      output reg OutReg 

    ); 

    always @(posedge clk or negedge rst_n) 
    begin 
    if (!rst_n) begin 
      OutReg <= 0; 
    end 
    else begin 
     if (De) begin 
       OutReg <= InReg; 
      end 
     else 
       OutReg <= OutReg; 
    end 
    end 

endmodule 

しかし、私はelse文なしで使用するかどうか知りたいですか? else文なしで使用できますか?

module ClockGating( 


      input wire rst_n, 
      input wire clk, 
      input wire De, 
      input wire InReg, 

      output reg OutReg 

    ); 

    always @(posedge clk or negedge rst_n) 
    begin 
    if (!rst_n) begin 
      OutReg <= 0; 
    end 
    else begin 
     if (De) begin 
       OutReg <= InReg; 
      end 
     end 

endmodule 
+0

これは私の生徒がしばしば苦労する質問です。 –

+0

はい、 'else'文を削除することができます。' OutReg'は、 'reg' –

答えて

1

(それはelseとバージョンとまったく同じ動作をしますので)はい、あなたはelseずに使用することができます。はい、あなたはelseなしで使用する必要があります(それ以外の場合はアマチュアのように見えるので、誰もそれを望んでいないからです)。

OutRegregです。 Verilogのregは、任意のソフトウェア言語のという変数のようなものです。その値は最後に割り当てられた値になります。あなたの回路では、OutRegの値をDe1'b1でない場合に変更したくないので、その場合はOutRegに新しい値を割り当てる必要はありません。したがって、elseは必要ありません。

+0

なので、その値を保持します。しかし、合成後にラッチとして残るのではないかと心配しています。私が知っているように、私たちはラッチを取り除かなければならない。 – grander3

+0

@ grander3私はあなたがラッチを取得しないことを約束します。これが組み合わせ論理であれば、心配するのは正しいでしょう。組み合わせロジックに_complete assignment_がない場合、出力がその値を保持する場合があります。ハードウェアに実装するには何らかのストレージが必要です。シンセサイザがラッチを推定するのはこのためです。しかし、あなたのコードはシーケンシャルロジックです。シーケンシャルロジックにはストレージ(フリップフロップ)があります。したがって、完全な割り当ては不要であり、ストレージを推測するシンセサイザ(フリップフロップはラッチではありません)はまさに起こりそうなものです。 –

関連する問題