• 締切済み

verilogである信号の数クロック遅れの信号を生成させる記述方法をお

verilogである信号の数クロック遅れの信号を生成させる記述方法をお伺いします。 動作記述でOKです。 通常、「sig_a」 から2クロック遅れの「sig_b」を生成させるのなら: > sig_a - 2clockおくれ -> sig_b ----------------------------------- reg [2:0] regs; assign sig_b = regs[2]; asisgn regs[0] = sig_a; always @(posedge CLK) regs[2:0] <= {regs[1:0], sig_a}; ----------------------------------- のように、パイプラインに信号を通すことで実現できるですが、 何クロック遅れるかを可変(動的に設定する)としたいのです。 動作モデル的な記述で簡単にかけないのでしょうか? ------------------------------------ [NGの例]: これだとNcycle_delayがSIM途中で更新されたとき、反映できない。。。 initial begin  sig_b <= #D 1'b0;   while(1) begin   repeat(Ncycyle_delay) @(posedge CLK);    while(1) begin     sig_b <= sig_a;     repeat(1) @(posedge CLK);    end   end end ------------------------------------ 宜しくお願い致します。

みんなの回答

  • P0O9I
  • ベストアンサー率32% (693/2146)
回答No.1

最大シフト数までのシフト回路をつくり、それをマルチプレクサで切り替える、という方法はどうでしょう。

tk_1980024
質問者

お礼

ありがとうございます。いや、もっと汎用的な方法がを望んでいました。 ちょっと考えてみましたが、sig_aとそれを遅らせるsig_b、同じモジュールで生成するのなら容易ですね。 逆に別のモジュールで遅らせるのは難しい。。。 ということで、「根元で遅らせる」というのがおそらく正解なのかな?という気がしています。   +根元で遅らせる例 initial begin  fork   begin   while(1) begin   sig_a <= 0;   repeat(N) @(posedge CLK);   sig_a <= 1;   repeat(N) @(posedge CLK);   end  end  begin   while(1) begin   repeat(M) @(posedge CLK); <-- M遅れ   sig_b <= 0;   repeat(N) @(posedge CLK);   sig_b <= 1;   repeat(N-M) @(posedge CLK);   end  join_none end

関連するQ&A

専門家に質問してみよう