2017-02-17 3 views
1

モジュールのアクティブなエッジを簡単に定義する方法があるかどうかは疑問でした。 Verilogのレジスタです。したがって、ifがインスタンス化されたときに、正または負のトリガを定義できます。例えば:posedge変数に論理演算子を使用するようにしても合法である場合、私は知らない、けれどもレジスタのアクティブなエッジをパラメータ化する

Register #(.width(8), .active_edge(`POS_EDGE)) DUT();

これは、私の試みです:

module Register #(
    parameter width=8, 
    parameter active_edge=1'b1) (
    input  [width-1:0] D, 
    input     clk, rst, we, 
    output reg [width-1:0] Q); 

    always @(posedge active_edge^~clk, posedge rst) begin 
     if (rst) 
      Q <= 'b0; 
     else 
      if (we) Q <= D; 
    end 

endmodule 
+1

通常のように書き込み、クロック入力を反転してアクティブエッジを切り替えるだけです。 – mkrieger1

答えて

0
あなたが書いたもの

いくつかの合成ツールはクロックの複雑な表現を受け入れないかもしれません。中間式を書くことができ、最適化されます。

module Register #(
    parameter width=8, 
    parameter active_edge=1'b1) (
    input  [width-1:0] D, 
    input     clk, rst, we, 
    output reg [width-1:0] Q); 
    wire local_clk = active_edge ? !clk : clk; 
    always @(posedge local_clock, posedge rst) begin 
     if (rst) 
      Q <= 'b0; 
     else 
      if (we) Q <= D; 
    end 

endmodule 
+0

私は参照してください。それも良く見えます。情報をありがとう! – Fachicon

関連する問題