2016-04-03 10 views
0

私はVerilogでカウンタを作ろうとしており、コンビネーションから分割部分を分割する方法を知りたいと思います。Verilogでシーケンシャルとコンビネーションを分割する方法

私はこのモジュールを持っていますが、正常に動作しますが、分割する方法はわかりません。

module counter4bits(
    input clk_i, 
    input rst_n_i, 
    input enable_i, 
    input up_down_i, 
    output reg[3:0] val_o); 

    [email protected](posedge clk_i) begin 
     if (rst_n_i == 1) 
      val_o <= 0; 
     else if(enable_i == 1) 
      val_o <= val_o + 1; 
     end 

endmodule 

答えて

4

一つの方法は、ブロック割り当て(=)を使用して組み合わせ部品のalways @(*)ブロックを作り、簡単なREG非ブロッキング割り当て(<=)を使用してシーケンシャル部品のalways @(posedge clk_i)ブロックを作ることです。

組み合わせのブロッキング割り当て(=)は、@(*)の代わりに明示的な感度リスト行@(rst_n_i or enable_i or ...)が使用されても、高速なシミュレーションと予測可能な動作を提供します。順序論理の非ブロッキング割当て(<=)は、次の値が前の値に依存する期待されるフリップフロップ動作を与える。あなたは、組み合わせや順序論理を分割したいのはなぜ

module counter4bits(
    ... input/output with no change 
    reg [3:0] val_nxt; // Not flip-flop but used in always @(*) thus reg 

    always @(*) begin 
     if (rst_n_i == 1) 
      val_nxt = 0; 
     else if(enable_i == 1) 
      val_nxt = val_o + 1; 
     end 

    always @(posedge clk_i) 
     val_o <= val_nxt; 

endmodule 
0

コードは次のようになります。 作成したコードは、電力最適化に適したスタイルです。 あなたのスタイルのコードでは、ツールはenable_iでフリップフロップの値が変化することを理解することができます。したがって、ツールは、電力を削減するenable_iを使用してフロップのクロックゲートを配置するのに十分なインテリジェントです。

関連する問題